1use std::{
2 io::Result,
3 os::windows::io::{AsSocket, BorrowedSocket},
4 path::Path,
5};
6
7use windows::Win32::Networking::WinSock::{SOCKADDR_UN, SOMAXCONN, bind, listen};
8
9use crate::{
10 socket::UnixSocket,
11 stream::UnixStream,
12 util::{init, map_ret, sockaddr_un},
13};
14
15pub struct UnixListener(UnixSocket);
16
17impl UnixListener {
18 pub fn bind<P: AsRef<Path>>(path: P) -> Result<Self> {
19 init();
20 let socket = UnixSocket::new()?;
21 let (addr, len) = sockaddr_un(path)?;
22 unsafe {
23 map_ret(bind(
24 socket.as_raw(),
25 &addr as *const _ as *const _,
26 len as i32,
27 ))?;
28 map_ret(listen(socket.as_raw(), SOMAXCONN as _))?;
29 }
30 Ok(Self(socket))
31 }
32
33 pub fn accept(&self) -> Result<(UnixStream, ())> {
34 let mut storage = SOCKADDR_UN::default();
35 let mut len = std::mem::size_of_val(&storage) as i32;
36 let raw = self.0.accept(&mut storage as *mut _ as *mut _, &mut len)?;
37 Ok((UnixStream::new(raw), ()))
38 }
39}
40
41impl AsSocket for UnixListener {
42 fn as_socket(&self) -> BorrowedSocket<'_> {
43 unsafe { BorrowedSocket::borrow_raw(self.0.as_raw().0 as _) }
44 }
45}