From b7a09f21a9f2383bdf22943c2bd7ec929e34ce80 Mon Sep 17 00:00:00 2001 From: Thomas de Zeeuw Date: Mon, 28 Nov 2022 11:37:49 +0100 Subject: [PATCH] Initialise the Window network stack in one call site Do it in new_socket so that the higher levels don't have to worry about it. --- src/sys/windows/net.rs | 4 +++- src/sys/windows/tcp.rs | 13 +++---------- src/sys/windows/udp.rs | 3 +-- 3 files changed, 7 insertions(+), 13 deletions(-) diff --git a/src/sys/windows/net.rs b/src/sys/windows/net.rs index 102ba797..0926f726 100644 --- a/src/sys/windows/net.rs +++ b/src/sys/windows/net.rs @@ -9,7 +9,7 @@ use windows_sys::Win32::Networking::WinSock::{ }; /// Initialise the network stack for Windows. -pub(crate) fn init() { +fn init() { static INIT: Once = Once::new(); INIT.call_once(|| { // Let standard library call `WSAStartup` for us, we can't do it @@ -30,6 +30,8 @@ pub(crate) fn new_ip_socket(addr: SocketAddr, socket_type: u16) -> io::Result io::Result { + init(); + syscall!( socket(domain as i32, socket_type as i32, 0), PartialEq::eq, diff --git a/src/sys/windows/tcp.rs b/src/sys/windows/tcp.rs index 533074be..addd1e8d 100644 --- a/src/sys/windows/tcp.rs +++ b/src/sys/windows/tcp.rs @@ -2,19 +2,12 @@ use std::io; use std::net::{self, SocketAddr}; use std::os::windows::io::AsRawSocket; -use windows_sys::Win32::Networking::WinSock::{ - self, AF_INET, AF_INET6, SOCKET, SOCKET_ERROR, SOCK_STREAM, -}; +use windows_sys::Win32::Networking::WinSock::{self, SOCKET, SOCKET_ERROR, SOCK_STREAM}; -use crate::sys::windows::net::{init, new_socket, socket_addr}; +use crate::sys::windows::net::{new_ip_socket, socket_addr}; pub(crate) fn new_for_addr(address: SocketAddr) -> io::Result { - init(); - let domain = match address { - SocketAddr::V4(_) => AF_INET, - SocketAddr::V6(_) => AF_INET6, - }; - new_socket(domain, SOCK_STREAM) + new_ip_socket(address, SOCK_STREAM) } pub(crate) fn bind(socket: &net::TcpListener, addr: SocketAddr) -> io::Result<()> { diff --git a/src/sys/windows/udp.rs b/src/sys/windows/udp.rs index 91516ccc..29624ec9 100644 --- a/src/sys/windows/udp.rs +++ b/src/sys/windows/udp.rs @@ -4,13 +4,12 @@ use std::net::{self, SocketAddr}; use std::os::windows::io::{AsRawSocket, FromRawSocket}; use std::os::windows::raw::SOCKET as StdSocket; // windows-sys uses usize, stdlib uses u32/u64. -use crate::sys::windows::net::{init, new_ip_socket, socket_addr}; +use crate::sys::windows::net::{new_ip_socket, socket_addr}; use windows_sys::Win32::Networking::WinSock::{ bind as win_bind, closesocket, getsockopt, IPPROTO_IPV6, IPV6_V6ONLY, SOCKET_ERROR, SOCK_DGRAM, }; pub fn bind(addr: SocketAddr) -> io::Result { - init(); new_ip_socket(addr, SOCK_DGRAM).and_then(|socket| { let (raw_addr, raw_addr_length) = socket_addr(&addr); syscall!(