MCPcopy Create free account
hub / github.com/bytecodealliance/system-interface / raw_socket_is_read_write

Function raw_socket_is_read_write

src/io/is_read_write.rs:125–155  ·  view source on GitHub ↗
(raw_socket: RawSocket)

Source from the content-addressed store, hash-verified

123
124#[cfg(windows)]
125fn raw_socket_is_read_write(raw_socket: RawSocket) -> io::Result<(bool, bool)> {
126 let (mut read, mut write) = (true, true);
127
128 // Detect write shutdown. A zero-length `send` doesn't block but does
129 // provide a helpful error message.
130 let socket = raw_socket as SOCKET;
131 let write_result = unsafe { send(socket, ptr::null_mut(), 0, 0) };
132 if write_result == SOCKET_ERROR {
133 let err = io::Error::last_os_error();
134 match err.raw_os_error() {
135 Some(WSAESHUTDOWN) => write = false,
136 Some(WSAEWOULDBLOCK) => (),
137 _ => return Err(err),
138 }
139 }
140
141 // Detect read shutdown. A normal zero-length `recv` does block, so
142 // use deliberately invalid pointer, as we get different error codes in
143 // the case of a shut-down stream.
144 let read_result = unsafe { recv(socket, usize::MAX as *mut _, 1, MSG_PEEK) };
145 if read_result == SOCKET_ERROR {
146 let err = io::Error::last_os_error();
147 match err.raw_os_error() {
148 Some(WSAEFAULT) => (),
149 Some(WSAESHUTDOWN) => read = false,
150 _ => return Err(err),
151 }
152 }
153
154 Ok((read, write))
155}
156
157#[cfg(all(windows, feature = "socket2"))]
158impl IsReadWrite for socket2::Socket {

Callers 1

is_read_writeMethod · 0.85

Calls

no outgoing calls

Tested by

no test coverage detected