Skip to content

Commit 7ec826d

Browse files
committed
Add support for Windows Registered I/O
1 parent 3cc3b28 commit 7ec826d

File tree

1 file changed

+15
-5
lines changed

1 file changed

+15
-5
lines changed

src/sys/windows.rs

Lines changed: 15 additions & 5 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::{
@@ -126,15 +126,19 @@ impl Type {
126126
/// Our custom flag to set `WSA_FLAG_NO_HANDLE_INHERIT` on socket creation.
127127
/// Trying to mimic `Type::cloexec` on windows.
128128
const NO_INHERIT: c_int = 1 << ((size_of::<c_int>() * 8) - 1); // Last bit.
129+
/// Our custom flag to set `WSA_FLAG_REGISTERED_IO` on socket creation.
130+
const REGISTERED_IO: c_int = 1 << ((size_of::<c_int>() * 8) - 2); // Second last bit.
129131

130132
/// Set `WSA_FLAG_NO_HANDLE_INHERIT` on the socket.
131133
#[cfg(feature = "all")]
132134
pub const fn no_inherit(self) -> Type {
133-
self._no_inherit()
135+
Type(self.0 | Type::NO_INHERIT)
134136
}
135137

136-
pub(crate) const fn _no_inherit(self) -> Type {
137-
Type(self.0 | Type::NO_INHERIT)
138+
/// Set `WSA_FLAG_REGISTERED_IO` on the socket.
139+
#[cfg(feature = "all")]
140+
pub const fn registered_io(self) -> Type {
141+
Type(self.0 | Type::REGISTERED_IO)
138142
}
139143
}
140144

@@ -253,13 +257,19 @@ pub(crate) fn socket_into_raw(socket: Socket) -> RawSocket {
253257
pub(crate) fn socket(family: c_int, mut ty: c_int, protocol: c_int) -> io::Result<RawSocket> {
254258
init();
255259

256-
// Check if we set our custom flag.
260+
// Check if we set our custom flags.
257261
let flags = if ty & Type::NO_INHERIT != 0 {
258262
ty = ty & !Type::NO_INHERIT;
259263
WSA_FLAG_NO_HANDLE_INHERIT
260264
} else {
261265
0
262266
};
267+
let flags = if ty & Type::REGISTERED_IO != 0 {
268+
ty = ty & !Type::REGISTERED_IO;
269+
flags | WSA_FLAG_REGISTERED_IO
270+
} else {
271+
flags
272+
};
263273

264274
syscall!(
265275
WSASocketW(

0 commit comments

Comments
 (0)