use std::{ io::{Read, Result, Write}, os::windows::io::{AsSocket, BorrowedSocket}, path::Path, sync::Arc, }; use async_io::IoSafe; use windows::Win32::Networking::WinSock::connect; use crate::{ socket::UnixSocket, util::{init, map_ret, sockaddr_un}, }; pub struct UnixStream(Arc); unsafe impl IoSafe for UnixStream {} impl UnixStream { pub fn new(socket: UnixSocket) -> Self { Self(Arc::new(socket)) } pub fn connect>(path: P) -> Result { init(); unsafe { let inner = UnixSocket::new()?; let (addr, len) = sockaddr_un(path)?; map_ret(connect( inner.as_raw(), &addr as *const _ as *const _, len as i32, ))?; Ok(Self(Arc::new(inner))) } } pub fn into_split(self) -> (OwnedReadHalf, OwnedWriteHalf) { let inner = self.0; (OwnedReadHalf(inner.clone()), OwnedWriteHalf(inner)) } } impl Read for UnixStream { fn read(&mut self, buf: &mut [u8]) -> Result { self.0.recv(buf) } } impl Write for UnixStream { fn write(&mut self, buf: &[u8]) -> Result { self.0.send(buf) } fn flush(&mut self) -> Result<()> { Ok(()) } } impl AsSocket for UnixStream { fn as_socket(&self) -> BorrowedSocket<'_> { unsafe { BorrowedSocket::borrow_raw(self.0.as_raw().0 as _) } } } pub struct OwnedReadHalf(Arc); impl Read for OwnedReadHalf { fn read(&mut self, buf: &mut [u8]) -> Result { self.0.recv(buf) } } pub struct OwnedWriteHalf(Arc); impl Write for OwnedWriteHalf { fn write(&mut self, buf: &[u8]) -> Result { self.0.send(buf) } fn flush(&mut self) -> Result<()> { Ok(()) } }