Skip to content

Commit 12c4013

Browse files
committed
Make Windows UDS work with tests and clean implementation
1 parent 457f753 commit 12c4013

File tree

20 files changed

+290
-270
lines changed

20 files changed

+290
-270
lines changed

src/lib.rs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -91,6 +91,10 @@ pub mod windows {
9191
//! Windows only extensions.
9292
9393
pub use crate::sys::named_pipe::NamedPipe;
94+
// blocking windows uds which mimick std implementation used for tests
95+
cfg_net! {
96+
pub use crate::sys::windows::stdnet;
97+
}
9498
}
9599

96100
pub mod features {

src/net/tcp/stream.rs

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -269,49 +269,49 @@ impl TcpStream {
269269

270270
impl Read for TcpStream {
271271
fn read(&mut self, buf: &mut [u8]) -> io::Result<usize> {
272-
self.inner.do_io(|inner| (&*inner).read(buf))
272+
self.inner.do_io(|mut inner| inner.read(buf))
273273
}
274274

275275
fn read_vectored(&mut self, bufs: &mut [IoSliceMut<'_>]) -> io::Result<usize> {
276-
self.inner.do_io(|inner| (&*inner).read_vectored(bufs))
276+
self.inner.do_io(|mut inner| inner.read_vectored(bufs))
277277
}
278278
}
279279

280280
impl<'a> Read for &'a TcpStream {
281281
fn read(&mut self, buf: &mut [u8]) -> io::Result<usize> {
282-
self.inner.do_io(|inner| (&*inner).read(buf))
282+
self.inner.do_io(|mut inner| inner.read(buf))
283283
}
284284

285285
fn read_vectored(&mut self, bufs: &mut [IoSliceMut<'_>]) -> io::Result<usize> {
286-
self.inner.do_io(|inner| (&*inner).read_vectored(bufs))
286+
self.inner.do_io(|mut inner| inner.read_vectored(bufs))
287287
}
288288
}
289289

290290
impl Write for TcpStream {
291291
fn write(&mut self, buf: &[u8]) -> io::Result<usize> {
292-
self.inner.do_io(|inner| (&*inner).write(buf))
292+
self.inner.do_io(|mut inner| inner.write(buf))
293293
}
294294

295295
fn write_vectored(&mut self, bufs: &[IoSlice<'_>]) -> io::Result<usize> {
296-
self.inner.do_io(|inner| (&*inner).write_vectored(bufs))
296+
self.inner.do_io(|mut inner| inner.write_vectored(bufs))
297297
}
298298

299299
fn flush(&mut self) -> io::Result<()> {
300-
self.inner.do_io(|inner| (&*inner).flush())
300+
self.inner.do_io(|mut inner| inner.flush())
301301
}
302302
}
303303

304304
impl<'a> Write for &'a TcpStream {
305305
fn write(&mut self, buf: &[u8]) -> io::Result<usize> {
306-
self.inner.do_io(|inner| (&*inner).write(buf))
306+
self.inner.do_io(|mut inner| inner.write(buf))
307307
}
308308

309309
fn write_vectored(&mut self, bufs: &[IoSlice<'_>]) -> io::Result<usize> {
310-
self.inner.do_io(|inner| (&*inner).write_vectored(bufs))
310+
self.inner.do_io(|mut inner| inner.write_vectored(bufs))
311311
}
312312

313313
fn flush(&mut self) -> io::Result<()> {
314-
self.inner.do_io(|inner| (&*inner).flush())
314+
self.inner.do_io(|mut inner| inner.flush())
315315
}
316316
}
317317

src/net/uds/listener.rs

Lines changed: 0 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -30,21 +30,12 @@ impl UnixListener {
3030
/// standard library in the Mio equivalent. The conversion assumes nothing
3131
/// about the underlying listener; it is left up to the user to set it in
3232
/// non-blocking mode.
33-
#[cfg(unix)]
34-
#[cfg_attr(docsrs, doc(cfg(unix)))]
3533
pub fn from_std(listener: net::UnixListener) -> UnixListener {
3634
UnixListener {
3735
inner: IoSource::new(listener),
3836
}
3937
}
4038

41-
#[cfg(windows)]
42-
pub(crate) fn from_std(listener: net::UnixListener) -> UnixListener {
43-
UnixListener {
44-
inner: IoSource::new(listener),
45-
}
46-
}
47-
4839
/// Accepts a new incoming connection to this listener.
4940
///
5041
/// The call is responsible for ensuring that the listening socket is in

src/net/uds/stream.rs

Lines changed: 37 additions & 47 deletions
Original file line numberDiff line numberDiff line change
@@ -41,21 +41,12 @@ impl UnixStream {
4141
/// The Unix stream here will not have `connect` called on it, so it
4242
/// should already be connected via some other means (be it manually, or
4343
/// the standard library).
44-
#[cfg(unix)]
45-
#[cfg_attr(docsrs, doc(cfg(unix)))]
4644
pub fn from_std(stream: net::UnixStream) -> UnixStream {
4745
UnixStream {
4846
inner: IoSource::new(stream),
4947
}
5048
}
5149

52-
#[cfg(windows)]
53-
pub(crate) fn from_std(stream: net::UnixStream) -> UnixStream {
54-
UnixStream {
55-
inner: IoSource::new(stream),
56-
}
57-
}
58-
5950
/// Creates an unnamed pair of connected sockets.
6051
///
6152
/// Returns two `UnixStream`s which are connected to each other.
@@ -170,34 +161,6 @@ impl UnixStream {
170161
/// # let _ = std::fs::remove_file(&file_path);
171162
/// let server = UnixListener::bind(&file_path).unwrap();
172163
///
173-
/// let handle = std::thread::spawn(move || {
174-
/// if let Ok((stream2, _)) = server.accept() {
175-
/// // Wait until the stream is readable...
176-
///
177-
/// // Read from the stream using a direct WinSock call, of course the
178-
/// // `io::Read` implementation would be easier to use.
179-
/// let mut buf = [0; 512];
180-
/// let n = stream2.try_io(|| {
181-
/// let res = unsafe {
182-
/// WinSock::recv(
183-
/// stream2.as_raw_socket().try_into().unwrap(),
184-
/// &mut buf as *mut _ as *mut _,
185-
/// buf.len() as c_int,
186-
/// 0
187-
/// )
188-
/// };
189-
/// if res != WinSock::SOCKET_ERROR {
190-
/// Ok(res as usize)
191-
/// } else {
192-
/// // If EAGAIN or EWOULDBLOCK is set by WinSock::recv, the closure
193-
/// // should return `WouldBlock` error.
194-
/// Err(io::Error::last_os_error())
195-
/// }
196-
/// }).unwrap();
197-
/// eprintln!("read {} bytes", n);
198-
/// }
199-
/// });
200-
///
201164
/// let stream1 = UnixStream::connect(&file_path).unwrap();
202165
///
203166
/// // Wait until the stream is writable...
@@ -226,6 +189,33 @@ impl UnixStream {
226189
/// })?;
227190
/// eprintln!("write {} bytes", n);
228191
///
192+
/// let handle = std::thread::spawn(move || {
193+
/// if let Ok((stream2, _)) = server.accept() {
194+
/// // Wait until the stream is readable...
195+
///
196+
/// // Read from the stream using a direct WinSock call, of course the
197+
/// // `io::Read` implementation would be easier to use.
198+
/// let mut buf = [0; 512];
199+
/// let n = stream2.try_io(|| {
200+
/// let res = unsafe {
201+
/// WinSock::recv(
202+
/// stream2.as_raw_socket().try_into().unwrap(),
203+
/// &mut buf as *mut _ as *mut _,
204+
/// buf.len() as c_int,
205+
/// 0
206+
/// )
207+
/// };
208+
/// if res != WinSock::SOCKET_ERROR {
209+
/// Ok(res as usize)
210+
/// } else {
211+
/// // If EAGAIN or EWOULDBLOCK is set by WinSock::recv, the closure
212+
/// // should return `WouldBlock` error.
213+
/// Err(io::Error::last_os_error())
214+
/// }
215+
/// }).unwrap();
216+
/// eprintln!("read {} bytes", n);
217+
/// }
218+
/// });
229219
/// # handle.join().unwrap();
230220
/// # Ok(())
231221
/// # }
@@ -240,49 +230,49 @@ impl UnixStream {
240230

241231
impl Read for UnixStream {
242232
fn read(&mut self, buf: &mut [u8]) -> io::Result<usize> {
243-
self.inner.do_io(|inner| (&*inner).read(buf))
233+
self.inner.do_io(|mut inner| inner.read(buf))
244234
}
245235

246236
fn read_vectored(&mut self, bufs: &mut [IoSliceMut<'_>]) -> io::Result<usize> {
247-
self.inner.do_io(|inner| (&*inner).read_vectored(bufs))
237+
self.inner.do_io(|mut inner| inner.read_vectored(bufs))
248238
}
249239
}
250240

251241
impl<'a> Read for &'a UnixStream {
252242
fn read(&mut self, buf: &mut [u8]) -> io::Result<usize> {
253-
self.inner.do_io(|inner| (&*inner).read(buf))
243+
self.inner.do_io(|mut inner| inner.read(buf))
254244
}
255245

256246
fn read_vectored(&mut self, bufs: &mut [IoSliceMut<'_>]) -> io::Result<usize> {
257-
self.inner.do_io(|inner| (&*inner).read_vectored(bufs))
247+
self.inner.do_io(|mut inner| inner.read_vectored(bufs))
258248
}
259249
}
260250

261251
impl Write for UnixStream {
262252
fn write(&mut self, buf: &[u8]) -> io::Result<usize> {
263-
self.inner.do_io(|inner| (&*inner).write(buf))
253+
self.inner.do_io(|mut inner| inner.write(buf))
264254
}
265255

266256
fn write_vectored(&mut self, bufs: &[IoSlice<'_>]) -> io::Result<usize> {
267-
self.inner.do_io(|inner| (&*inner).write_vectored(bufs))
257+
self.inner.do_io(|mut inner| inner.write_vectored(bufs))
268258
}
269259

270260
fn flush(&mut self) -> io::Result<()> {
271-
self.inner.do_io(|inner| (&*inner).flush())
261+
self.inner.do_io(|mut inner| inner.flush())
272262
}
273263
}
274264

275265
impl<'a> Write for &'a UnixStream {
276266
fn write(&mut self, buf: &[u8]) -> io::Result<usize> {
277-
self.inner.do_io(|inner| (&*inner).write(buf))
267+
self.inner.do_io(|mut inner| inner.write(buf))
278268
}
279269

280270
fn write_vectored(&mut self, bufs: &[IoSlice<'_>]) -> io::Result<usize> {
281-
self.inner.do_io(|inner| (&*inner).write_vectored(bufs))
271+
self.inner.do_io(|mut inner| inner.write_vectored(bufs))
282272
}
283273

284274
fn flush(&mut self) -> io::Result<()> {
285-
self.inner.do_io(|inner| (&*inner).flush())
275+
self.inner.do_io(|mut inner| inner.flush())
286276
}
287277
}
288278

src/sys/unix/pipe.rs

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -321,29 +321,29 @@ impl event::Source for Sender {
321321

322322
impl Write for Sender {
323323
fn write(&mut self, buf: &[u8]) -> io::Result<usize> {
324-
self.inner.do_io(|sender| (&*sender).write(buf))
324+
self.inner.do_io(|mut sender| sender.write(buf))
325325
}
326326

327327
fn write_vectored(&mut self, bufs: &[IoSlice<'_>]) -> io::Result<usize> {
328-
self.inner.do_io(|sender| (&*sender).write_vectored(bufs))
328+
self.inner.do_io(|mut sender| sender.write_vectored(bufs))
329329
}
330330

331331
fn flush(&mut self) -> io::Result<()> {
332-
self.inner.do_io(|sender| (&*sender).flush())
332+
self.inner.do_io(|mut sender| sender.flush())
333333
}
334334
}
335335

336336
impl Write for &Sender {
337337
fn write(&mut self, buf: &[u8]) -> io::Result<usize> {
338-
self.inner.do_io(|sender| (&*sender).write(buf))
338+
self.inner.do_io(|mut sender| sender.write(buf))
339339
}
340340

341341
fn write_vectored(&mut self, bufs: &[IoSlice<'_>]) -> io::Result<usize> {
342-
self.inner.do_io(|sender| (&*sender).write_vectored(bufs))
342+
self.inner.do_io(|mut sender| sender.write_vectored(bufs))
343343
}
344344

345345
fn flush(&mut self) -> io::Result<()> {
346-
self.inner.do_io(|sender| (&*sender).flush())
346+
self.inner.do_io(|mut sender| sender.flush())
347347
}
348348
}
349349

@@ -486,21 +486,21 @@ impl event::Source for Receiver {
486486

487487
impl Read for Receiver {
488488
fn read(&mut self, buf: &mut [u8]) -> io::Result<usize> {
489-
self.inner.do_io(|sender| (&*sender).read(buf))
489+
self.inner.do_io(|mut sender| sender.read(buf))
490490
}
491491

492492
fn read_vectored(&mut self, bufs: &mut [IoSliceMut<'_>]) -> io::Result<usize> {
493-
self.inner.do_io(|sender| (&*sender).read_vectored(bufs))
493+
self.inner.do_io(|mut sender| sender.read_vectored(bufs))
494494
}
495495
}
496496

497497
impl Read for &Receiver {
498498
fn read(&mut self, buf: &mut [u8]) -> io::Result<usize> {
499-
self.inner.do_io(|sender| (&*sender).read(buf))
499+
self.inner.do_io(|mut sender| sender.read(buf))
500500
}
501501

502502
fn read_vectored(&mut self, bufs: &mut [IoSliceMut<'_>]) -> io::Result<usize> {
503-
self.inner.do_io(|sender| (&*sender).read_vectored(bufs))
503+
self.inner.do_io(|mut sender| sender.read_vectored(bufs))
504504
}
505505
}
506506

src/sys/unix/uds/mod.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@ cfg_os_poll! {
4040
sockaddr.sun_family = libc::AF_UNIX as libc::sa_family_t;
4141

4242
let bytes = path.as_os_str().as_bytes();
43-
match (bytes.get(0), bytes.len().cmp(&sockaddr.sun_path.len())) {
43+
match (bytes.first(), bytes.len().cmp(&sockaddr.sun_path.len())) {
4444
// Abstract paths don't need a null terminator
4545
(Some(&0), Ordering::Greater) => {
4646
return Err(io::Error::new(
@@ -64,7 +64,7 @@ cfg_os_poll! {
6464
let offset = path_offset(&sockaddr);
6565
let mut socklen = offset + bytes.len();
6666

67-
match bytes.get(0) {
67+
match bytes.first() {
6868
// The struct has already been zeroes so the null byte for pathname
6969
// addresses is already there.
7070
Some(&0) | None => {}

src/sys/windows/iocp.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -206,7 +206,7 @@ impl CompletionStatus {
206206
/// A completion key is a per-handle key that is specified when it is added
207207
/// to an I/O completion port via `add_handle` or `add_socket`.
208208
pub fn token(&self) -> usize {
209-
self.0.lpCompletionKey as usize
209+
self.0.lpCompletionKey
210210
}
211211

212212
/// Returns a pointer to the `Overlapped` structure that was specified when
@@ -268,6 +268,6 @@ mod tests {
268268
}
269269
assert_eq!(s[2].bytes_transferred(), 0);
270270
assert_eq!(s[2].token(), 0);
271-
assert_eq!(s[2].overlapped(), 0 as *mut _);
271+
assert_eq!(s[2].overlapped(), std::ptr::null_mut());
272272
}
273273
}

src/sys/windows/mod.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ macro_rules! wsa_syscall {
2828
}
2929

3030
cfg_net! {
31-
pub(crate) mod stdnet;
31+
pub mod stdnet;
3232
pub(crate) mod uds;
3333
pub(crate) use self::uds::SocketAddr;
3434
}

src/sys/windows/net.rs

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
use std::io;
22
use std::mem;
33
use std::net::SocketAddr;
4+
use std::sync::Once;
45

56
use windows_sys::Win32::Networking::WinSock::{
67
closesocket, ioctlsocket, socket, AF_INET, AF_INET6, FIONBIO, IN6_ADDR, IN6_ADDR_0,
@@ -74,7 +75,7 @@ pub(crate) fn socket_addr(addr: &SocketAddr) -> (SocketAddrCRepr, i32) {
7475
};
7576

7677
let sockaddr_in = SOCKADDR_IN {
77-
sin_family: AF_INET as u16, // 1
78+
sin_family: AF_INET, // 1
7879
sin_port: addr.port().to_be(),
7980
sin_addr,
8081
sin_zero: [0; 8],
@@ -96,7 +97,7 @@ pub(crate) fn socket_addr(addr: &SocketAddr) -> (SocketAddrCRepr, i32) {
9697
};
9798

9899
let sockaddr_in6 = SOCKADDR_IN6 {
99-
sin6_family: AF_INET6 as u16, // 23
100+
sin6_family: AF_INET6, // 23
100101
sin6_port: addr.port().to_be(),
101102
sin6_addr,
102103
sin6_flowinfo: addr.flowinfo(),

0 commit comments

Comments
 (0)