1 use std::io;
2 use std::net::{self, SocketAddr};
3 use std::os::windows::io::AsRawSocket;
4 
5 use winapi::um::winsock2::{self, PF_INET, PF_INET6, SOCKET, SOCKET_ERROR, SOCK_STREAM};
6 
7 use crate::sys::windows::net::{init, new_socket, socket_addr};
8 
new_for_addr(address: SocketAddr) -> io::Result<SOCKET>9 pub(crate) fn new_for_addr(address: SocketAddr) -> io::Result<SOCKET> {
10     init();
11     let domain = match address {
12         SocketAddr::V4(_) => PF_INET,
13         SocketAddr::V6(_) => PF_INET6,
14     };
15     new_socket(domain, SOCK_STREAM)
16 }
17 
bind(socket: &net::TcpListener, addr: SocketAddr) -> io::Result<()>18 pub(crate) fn bind(socket: &net::TcpListener, addr: SocketAddr) -> io::Result<()> {
19     use winsock2::bind;
20 
21     let (raw_addr, raw_addr_length) = socket_addr(&addr);
22     syscall!(
23         bind(
24             socket.as_raw_socket() as _,
25             raw_addr.as_ptr(),
26             raw_addr_length
27         ),
28         PartialEq::eq,
29         SOCKET_ERROR
30     )?;
31     Ok(())
32 }
33 
connect(socket: &net::TcpStream, addr: SocketAddr) -> io::Result<()>34 pub(crate) fn connect(socket: &net::TcpStream, addr: SocketAddr) -> io::Result<()> {
35     use winsock2::connect;
36 
37     let (raw_addr, raw_addr_length) = socket_addr(&addr);
38     let res = syscall!(
39         connect(
40             socket.as_raw_socket() as _,
41             raw_addr.as_ptr(),
42             raw_addr_length
43         ),
44         PartialEq::eq,
45         SOCKET_ERROR
46     );
47 
48     match res {
49         Err(err) if err.kind() != io::ErrorKind::WouldBlock => Err(err),
50         _ => Ok(()),
51     }
52 }
53 
listen(socket: &net::TcpListener, backlog: u32) -> io::Result<()>54 pub(crate) fn listen(socket: &net::TcpListener, backlog: u32) -> io::Result<()> {
55     use std::convert::TryInto;
56     use winsock2::listen;
57 
58     let backlog = backlog.try_into().unwrap_or(i32::max_value());
59     syscall!(
60         listen(socket.as_raw_socket() as _, backlog),
61         PartialEq::eq,
62         SOCKET_ERROR
63     )?;
64     Ok(())
65 }
66 
accept(listener: &net::TcpListener) -> io::Result<(net::TcpStream, SocketAddr)>67 pub(crate) fn accept(listener: &net::TcpListener) -> io::Result<(net::TcpStream, SocketAddr)> {
68     // The non-blocking state of `listener` is inherited. See
69     // https://docs.microsoft.com/en-us/windows/win32/api/winsock2/nf-winsock2-accept#remarks.
70     listener.accept()
71 }
72