1use std::{
2 io::{Read, Result, Write},
3 os::windows::io::{AsSocket, BorrowedSocket},
4 path::Path,
5 sync::Arc,
6};
7
8use async_io::IoSafe;
9use windows::Win32::Networking::WinSock::connect;
10
11use crate::{
12 socket::UnixSocket,
13 util::{init, map_ret, sockaddr_un},
14};
15
16pub struct UnixStream(Arc<UnixSocket>);
17
18unsafe impl IoSafe for UnixStream {}
19
20impl UnixStream {
21 pub fn new(socket: UnixSocket) -> Self {
22 Self(Arc::new(socket))
23 }
24
25 pub fn connect<P: AsRef<Path>>(path: P) -> Result<Self> {
26 init();
27 unsafe {
28 let inner = UnixSocket::new()?;
29 let (addr, len) = sockaddr_un(path)?;
30
31 map_ret(connect(
32 inner.as_raw(),
33 &addr as *const _ as *const _,
34 len as i32,
35 ))?;
36 Ok(Self(Arc::new(inner)))
37 }
38 }
39
40 pub fn into_split(self) -> (OwnedReadHalf, OwnedWriteHalf) {
41 let inner = self.0;
42 (OwnedReadHalf(inner.clone()), OwnedWriteHalf(inner))
43 }
44}
45
46impl Read for UnixStream {
47 fn read(&mut self, buf: &mut [u8]) -> Result<usize> {
48 self.0.recv(buf)
49 }
50}
51
52impl Write for UnixStream {
53 fn write(&mut self, buf: &[u8]) -> Result<usize> {
54 self.0.send(buf)
55 }
56
57 fn flush(&mut self) -> Result<()> {
58 Ok(())
59 }
60}
61
62impl AsSocket for UnixStream {
63 fn as_socket(&self) -> BorrowedSocket<'_> {
64 unsafe { BorrowedSocket::borrow_raw(self.0.as_raw().0 as _) }
65 }
66}
67
68pub struct OwnedReadHalf(Arc<UnixSocket>);
69
70impl Read for OwnedReadHalf {
71 fn read(&mut self, buf: &mut [u8]) -> Result<usize> {
72 self.0.recv(buf)
73 }
74}
75
76pub struct OwnedWriteHalf(Arc<UnixSocket>);
77
78impl Write for OwnedWriteHalf {
79 fn write(&mut self, buf: &[u8]) -> Result<usize> {
80 self.0.send(buf)
81 }
82
83 fn flush(&mut self) -> Result<()> {
84 Ok(())
85 }
86}