aboutsummaryrefslogtreecommitdiff
path: root/src/sys/windows/net.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/sys/windows/net.rs')
-rw-r--r--src/sys/windows/net.rs25
1 files changed, 16 insertions, 9 deletions
diff --git a/src/sys/windows/net.rs b/src/sys/windows/net.rs
index 102ba79..44f459a 100644
--- a/src/sys/windows/net.rs
+++ b/src/sys/windows/net.rs
@@ -4,12 +4,13 @@ use std::net::SocketAddr;
use std::sync::Once;
use windows_sys::Win32::Networking::WinSock::{
- ioctlsocket, socket, AF_INET, AF_INET6, FIONBIO, IN6_ADDR, IN6_ADDR_0, INVALID_SOCKET, IN_ADDR,
- IN_ADDR_0, SOCKADDR, SOCKADDR_IN, SOCKADDR_IN6, SOCKADDR_IN6_0, SOCKET,
+ closesocket, ioctlsocket, socket, AF_INET, AF_INET6, FIONBIO, IN6_ADDR, IN6_ADDR_0,
+ INVALID_SOCKET, IN_ADDR, IN_ADDR_0, SOCKADDR, SOCKADDR_IN, SOCKADDR_IN6, SOCKADDR_IN6_0,
+ SOCKET,
};
/// 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
@@ -26,18 +27,24 @@ pub(crate) fn new_ip_socket(addr: SocketAddr, socket_type: u16) -> io::Result<SO
SocketAddr::V6(..) => AF_INET6,
};
- new_socket(domain, socket_type)
+ new_socket(domain.into(), socket_type)
}
pub(crate) fn new_socket(domain: u32, socket_type: u16) -> io::Result<SOCKET> {
- syscall!(
+ init();
+
+ let socket = syscall!(
socket(domain as i32, socket_type as i32, 0),
PartialEq::eq,
INVALID_SOCKET
- )
- .and_then(|socket| {
- syscall!(ioctlsocket(socket, FIONBIO, &mut 1), PartialEq::ne, 0).map(|_| socket as SOCKET)
- })
+ )?;
+
+ if let Err(err) = syscall!(ioctlsocket(socket, FIONBIO, &mut 1), PartialEq::ne, 0) {
+ let _ = unsafe { closesocket(socket) };
+ return Err(err);
+ }
+
+ Ok(socket as SOCKET)
}
/// A type with the same memory layout as `SOCKADDR`. Used in converting Rust level