Skip to content

Commit b4ceefb

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

File tree

2 files changed

+23
-2
lines changed

2 files changed

+23
-2
lines changed

Cargo.toml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -65,6 +65,8 @@ features = [
6565
[features]
6666
# Enable all API, even ones not available on all OSs.
6767
all = []
68+
# Enable Windows Registered I/O support.
69+
registered-io = []
6870

6971
[package.metadata.cargo_check_external_types]
7072
allowed_external_types = [

src/sys/windows.rs

Lines changed: 21 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::{
@@ -136,6 +136,19 @@ impl Type {
136136
pub(crate) const fn _no_inherit(self) -> Type {
137137
Type(self.0 | Type::NO_INHERIT)
138138
}
139+
140+
/// Our custom flag to set `WSA_FLAG_REGISTERED_IO` on socket creation.
141+
const REGISTERED_IO: c_int = 1 << ((size_of::<c_int>() * 8) - 2); // Second last bit.
142+
143+
/// Set `WSA_FLAG_REGISTERED_IO` on the socket.
144+
#[cfg(feature = "registered-io")]
145+
pub const fn registered_io(self) -> Type {
146+
self._registered_io()
147+
}
148+
149+
pub(crate) const fn _registered_io(self) -> Type {
150+
Type(self.0 | Type::REGISTERED_IO)
151+
}
139152
}
140153

141154
impl_debug!(
@@ -253,13 +266,19 @@ pub(crate) fn socket_into_raw(socket: Socket) -> RawSocket {
253266
pub(crate) fn socket(family: c_int, mut ty: c_int, protocol: c_int) -> io::Result<RawSocket> {
254267
init();
255268

256-
// Check if we set our custom flag.
269+
// Check if we set our custom flags.
257270
let flags = if ty & Type::NO_INHERIT != 0 {
258271
ty = ty & !Type::NO_INHERIT;
259272
WSA_FLAG_NO_HANDLE_INHERIT
260273
} else {
261274
0
262275
};
276+
let flags = if ty & Type::REGISTERED_IO != 0 {
277+
ty = ty & !Type::REGISTERED_IO;
278+
flags | WSA_FLAG_REGISTERED_IO
279+
} else {
280+
flags
281+
};
263282

264283
syscall!(
265284
WSASocketW(

0 commit comments

Comments
 (0)