Skip to content

Commit cff19b7

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

File tree

1 file changed

+20
-2
lines changed

1 file changed

+20
-2
lines changed

src/sys/windows.rs

Lines changed: 20 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,16 +126,28 @@ 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+
self._registered_io()
142+
}
143+
136144
pub(crate) const fn _no_inherit(self) -> Type {
137145
Type(self.0 | Type::NO_INHERIT)
138146
}
147+
148+
pub(crate) const fn _registered_io(self) -> Type {
149+
Type(self.0 | Type::REGISTERED_IO)
150+
}
139151
}
140152

141153
impl_debug!(
@@ -253,13 +265,19 @@ pub(crate) fn socket_into_raw(socket: Socket) -> RawSocket {
253265
pub(crate) fn socket(family: c_int, mut ty: c_int, protocol: c_int) -> io::Result<RawSocket> {
254266
init();
255267

256-
// Check if we set our custom flag.
268+
// Check if we set our custom flags.
257269
let flags = if ty & Type::NO_INHERIT != 0 {
258270
ty = ty & !Type::NO_INHERIT;
259271
WSA_FLAG_NO_HANDLE_INHERIT
260272
} else {
261273
0
262274
};
275+
let flags = if ty & Type::REGISTERED_IO != 0 {
276+
ty = ty & !Type::REGISTERED_IO;
277+
flags | WSA_FLAG_REGISTERED_IO
278+
} else {
279+
flags
280+
};
263281

264282
syscall!(
265283
WSASocketW(

0 commit comments

Comments
 (0)