Skip to content

Commit e5aabc7

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

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::{
@@ -126,13 +126,21 @@ 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 {
133135
self._no_inherit()
134136
}
135137

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)
142+
}
143+
136144
pub(crate) const fn _no_inherit(self) -> Type {
137145
Type(self.0 | Type::NO_INHERIT)
138146
}
@@ -253,13 +261,19 @@ pub(crate) fn socket_into_raw(socket: Socket) -> RawSocket {
253261
pub(crate) fn socket(family: c_int, mut ty: c_int, protocol: c_int) -> io::Result<RawSocket> {
254262
init();
255263

256-
// Check if we set our custom flag.
264+
// Check if we set our custom flags.
257265
let flags = if ty & Type::NO_INHERIT != 0 {
258266
ty = ty & !Type::NO_INHERIT;
259267
WSA_FLAG_NO_HANDLE_INHERIT
260268
} else {
261269
0
262270
};
271+
let flags = if ty & Type::REGISTERED_IO != 0 {
272+
ty = ty & !Type::REGISTERED_IO;
273+
flags | WSA_FLAG_REGISTERED_IO
274+
} else {
275+
flags
276+
};
263277

264278
syscall!(
265279
WSASocketW(

0 commit comments

Comments
 (0)