listener.rs

 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}