about summary refs log tree commit diff
path: root/src/libstd/sys
diff options
context:
space:
mode:
authorbors <bors@rust-lang.org>2015-04-15 06:18:51 +0000
committerbors <bors@rust-lang.org>2015-04-15 06:18:51 +0000
commitaf1c39cbd90a03f22dbb2b144ac1e543dbe0fe1d (patch)
tree6ee70a29945bc68db8021b29c314421faea89a48 /src/libstd/sys
parentc7734429ea97098a92951965bff3c56e566d2a95 (diff)
parent433f0e8d1fbd25693172f71e5a577bb9625b45b0 (diff)
downloadrust-af1c39cbd90a03f22dbb2b144ac1e543dbe0fe1d.tar.gz
rust-af1c39cbd90a03f22dbb2b144ac1e543dbe0fe1d.zip
Auto merge of #24211 - alexcrichton:windows-wsa-flag-overlapped, r=aturon
This commit modifies the socket creation functions on windows to always specify
the `WSA_FLAG_OVERLAPPED` and `WSA_FLAG_NO_HANDLE_INHERIT` flags by default. The
overlapped flag enables IOCP APIs on Windows to be used with the socket at no
cost, enabling better interoperation with external libraries. The no handle
inherit flag mirrors the upcoming change to Unix to set CLOEXEC by default for
all handles.

Closes #24206
Diffstat (limited to 'src/libstd/sys')
-rw-r--r--src/libstd/sys/windows/c.rs2
-rw-r--r--src/libstd/sys/windows/net.rs10
2 files changed, 10 insertions, 2 deletions
diff --git a/src/libstd/sys/windows/c.rs b/src/libstd/sys/windows/c.rs
index c8f6aca7bd3..dcab2ace5b2 100644
--- a/src/libstd/sys/windows/c.rs
+++ b/src/libstd/sys/windows/c.rs
@@ -44,6 +44,8 @@ pub const WSA_WAIT_TIMEOUT: libc::DWORD = libc::consts::os::extra::WAIT_TIMEOUT;
 pub const WSA_WAIT_EVENT_0: libc::DWORD = libc::consts::os::extra::WAIT_OBJECT_0;
 pub const WSA_WAIT_FAILED: libc::DWORD = libc::consts::os::extra::WAIT_FAILED;
 pub const WSAESHUTDOWN: libc::c_int = 10058;
+pub const WSA_FLAG_OVERLAPPED: libc::DWORD = 0x01;
+pub const WSA_FLAG_NO_HANDLE_INHERIT: libc::DWORD = 0x80;
 
 pub const ERROR_NO_MORE_FILES: libc::DWORD = 18;
 pub const TOKEN_READ: libc::DWORD = 0x20008;
diff --git a/src/libstd/sys/windows/net.rs b/src/libstd/sys/windows/net.rs
index 5ced8863e62..cbc3876dbb1 100644
--- a/src/libstd/sys/windows/net.rs
+++ b/src/libstd/sys/windows/net.rs
@@ -80,7 +80,11 @@ impl Socket {
             SocketAddr::V4(..) => libc::AF_INET,
             SocketAddr::V6(..) => libc::AF_INET6,
         };
-        match unsafe { libc::socket(fam, ty, 0) } {
+        let socket = unsafe {
+            c::WSASocketW(fam, ty, 0, 0 as *mut _, 0,
+                          c::WSA_FLAG_OVERLAPPED | c::WSA_FLAG_NO_HANDLE_INHERIT)
+        };
+        match socket {
             INVALID_SOCKET => Err(last_error()),
             n => Ok(Socket(n)),
         }
@@ -103,7 +107,9 @@ impl Socket {
             match c::WSASocketW(info.iAddressFamily,
                                 info.iSocketType,
                                 info.iProtocol,
-                                &mut info, 0, 0) {
+                                &mut info, 0,
+                                c::WSA_FLAG_OVERLAPPED |
+                                    c::WSA_FLAG_NO_HANDLE_INHERIT) {
                 INVALID_SOCKET => Err(last_error()),
                 n => Ok(Socket(n)),
             }