Skip to content

Commit 37fb681

Browse files
DBLouisLouis Dupré Bertoni
authored andcommitted
Add support for Windows Registered I/O
1 parent 15ade51 commit 37fb681

File tree

1 file changed

+16
-2
lines changed

1 file changed

+16
-2
lines changed

src/sys/windows.rs

Lines changed: 16 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ use windows_sys::Win32::Networking::WinSock::{
2525
self, tcp_keepalive, FIONBIO, IN6_ADDR, IN6_ADDR_0, INVALID_SOCKET, IN_ADDR, IN_ADDR_0,
2626
POLLERR, POLLHUP, POLLRDNORM, POLLWRNORM, SD_BOTH, SD_RECEIVE, SD_SEND, SIO_KEEPALIVE_VALS,
2727
SOCKET_ERROR, WSABUF, WSAEMSGSIZE, WSAESHUTDOWN, WSAPOLLFD, WSAPROTOCOL_INFOW,
28-
WSA_FLAG_NO_HANDLE_INHERIT, WSA_FLAG_OVERLAPPED,
28+
WSA_FLAG_NO_HANDLE_INHERIT, WSA_FLAG_OVERLAPPED, WSA_FLAG_REGISTERED_IO,
2929
};
3030
#[cfg(feature = "all")]
3131
use windows_sys::Win32::Networking::WinSock::{
@@ -125,13 +125,21 @@ impl Type {
125125
/// Our custom flag to set `WSA_FLAG_NO_HANDLE_INHERIT` on socket creation.
126126
/// Trying to mimic `Type::cloexec` on windows.
127127
const NO_INHERIT: c_int = 1 << ((size_of::<c_int>() * 8) - 1); // Last bit.
128+
/// Our custom flag to set `WSA_FLAG_REGISTERED_IO` on socket creation.
129+
const REGISTERED_IO: c_int = 1 << ((size_of::<c_int>() * 8) - 2); // Second last bit.
128130

129131
/// Set `WSA_FLAG_NO_HANDLE_INHERIT` on the socket.
130132
#[cfg(feature = "all")]
131133
pub const fn no_inherit(self) -> Type {
132134
self._no_inherit()
133135
}
134136

137+
/// Set `WSA_FLAG_REGISTERED_IO` on the socket.
138+
#[cfg(feature = "all")]
139+
pub const fn registered_io(self) -> Type {
140+
Type(self.0 | Type::REGISTERED_IO)
141+
}
142+
135143
pub(crate) const fn _no_inherit(self) -> Type {
136144
Type(self.0 | Type::NO_INHERIT)
137145
}
@@ -252,13 +260,19 @@ pub(crate) fn socket_into_raw(socket: Socket) -> RawSocket {
252260
pub(crate) fn socket(family: c_int, mut ty: c_int, protocol: c_int) -> io::Result<RawSocket> {
253261
init();
254262

255-
// Check if we set our custom flag.
263+
// Check if we set our custom flags.
256264
let flags = if ty & Type::NO_INHERIT != 0 {
257265
ty = ty & !Type::NO_INHERIT;
258266
WSA_FLAG_NO_HANDLE_INHERIT
259267
} else {
260268
0
261269
};
270+
let flags = if ty & Type::REGISTERED_IO != 0 {
271+
ty = ty & !Type::REGISTERED_IO;
272+
flags | WSA_FLAG_REGISTERED_IO
273+
} else {
274+
flags
275+
};
262276

263277
syscall!(
264278
WSASocketW(

0 commit comments

Comments
 (0)