darkfi/net/transport/
unix.rs1use std::{
20 io,
21 path::{Path, PathBuf},
22};
23
24use async_trait::async_trait;
25use smol::{
26 fs,
27 net::unix::{UnixListener as SmolUnixListener, UnixStream},
28};
29use tracing::debug;
30use url::Url;
31
32use super::{PtListener, PtStream};
33
34#[derive(Debug, Clone)]
36pub struct UnixDialer;
37
38impl UnixDialer {
39 pub(crate) async fn new() -> io::Result<Self> {
41 Ok(Self {})
42 }
43
44 pub(crate) async fn do_dial(
46 &self,
47 path: impl AsRef<Path> + core::fmt::Debug,
48 ) -> io::Result<UnixStream> {
49 debug!(target: "net::unix::do_dial", "Dialing {path:?} Unix socket...");
50 let stream = UnixStream::connect(path).await?;
51 Ok(stream)
52 }
53}
54
55#[derive(Debug, Clone)]
57pub struct UnixListener;
58
59impl UnixListener {
60 pub(crate) async fn new() -> io::Result<Self> {
62 Ok(Self {})
63 }
64
65 pub(crate) async fn do_listen(&self, path: &PathBuf) -> io::Result<SmolUnixListener> {
67 let _ = fs::remove_file(path).await;
69 let listener = SmolUnixListener::bind(path)?;
70 Ok(listener)
71 }
72}
73
74#[async_trait]
75impl PtListener for SmolUnixListener {
76 async fn next(&self) -> io::Result<(Box<dyn PtStream>, Url)> {
77 let (stream, _peer_addr) = match self.accept().await {
78 Ok((s, a)) => (s, a),
79 Err(e) => return Err(e),
80 };
81
82 let addr = self.local_addr().unwrap();
83 let addr = addr.as_pathname().unwrap().to_str().unwrap();
84 let url = Url::parse(&format!("unix://{addr}")).unwrap();
85
86 Ok((Box::new(stream), url))
87 }
88}