|
|
|
@ -5,6 +5,7 @@ use std::io;
|
|
|
|
|
use std::path::{
|
|
|
|
|
Path, PathBuf
|
|
|
|
|
};
|
|
|
|
|
use std::{fmt, error};
|
|
|
|
|
|
|
|
|
|
#[derive(Debug, Clone, PartialEq, Eq, Hash, PartialOrd, Ord)]
|
|
|
|
|
pub struct SocketAddrUnix
|
|
|
|
@ -41,6 +42,15 @@ impl TryFrom<tokio::net::unix::SocketAddr> for SocketAddrUnix
|
|
|
|
|
from.as_pathname().ok_or(AddrParseError).map(|path| Self{path: path.into()})
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
impl TryFrom<tokio::net::unix::SocketAddr> for SocketAddr
|
|
|
|
|
{
|
|
|
|
|
type Error = AddrParseError;
|
|
|
|
|
|
|
|
|
|
fn try_from(from: tokio::net::unix::SocketAddr) -> Result<Self, Self::Error>
|
|
|
|
|
{
|
|
|
|
|
SocketAddrUnix::try_from(from).map(Self::Unix)
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
impl From<SocketAddrUnix> for SocketAddr
|
|
|
|
|
{
|
|
|
|
@ -61,6 +71,16 @@ impl From<std::net::SocketAddr> for SocketAddr
|
|
|
|
|
|
|
|
|
|
#[derive(Debug, Clone, PartialEq, Eq)]
|
|
|
|
|
pub struct AddrParseError;
|
|
|
|
|
impl error::Error for AddrParseError{}
|
|
|
|
|
impl fmt::Display for AddrParseError
|
|
|
|
|
{
|
|
|
|
|
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result
|
|
|
|
|
{
|
|
|
|
|
write!(f, "failed to parse address")
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
impl From<std::net::AddrParseError> for AddrParseError
|
|
|
|
|
{
|
|
|
|
|
fn from(_: std::net::AddrParseError) -> Self
|
|
|
|
@ -98,7 +118,7 @@ enum StreamInner
|
|
|
|
|
|
|
|
|
|
impl ListenerInner
|
|
|
|
|
{
|
|
|
|
|
fn con_unix(sock: &SocketAddrUnix) -> io::Result<Self>
|
|
|
|
|
#[inline] fn con_unix(sock: &SocketAddrUnix) -> io::Result<Self>
|
|
|
|
|
{
|
|
|
|
|
tokio::net::UnixListener::bind(&sock.path).map(Self::Unix)
|
|
|
|
|
}
|
|
|
|
@ -155,6 +175,22 @@ impl Listener
|
|
|
|
|
ListenerInner::Tcp(tcp) => tcp.accept().await.map(Into::into),
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/// Local bound address
|
|
|
|
|
pub fn local_addr(&self) -> io::Result<SocketAddr>
|
|
|
|
|
{
|
|
|
|
|
match self.0.as_ref()
|
|
|
|
|
{
|
|
|
|
|
ListenerInner::Unix(un) => un.local_addr().and_then(|addr| addr.try_into().map_err(|e| io::Error::new(io::ErrorKind::Unsupported, e))),
|
|
|
|
|
ListenerInner::Tcp(t) => t.local_addr().map(Into::into)
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// TODO: Add `poll_accept` for unpinned `&self` polling
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
//TODO: impl Stream
|
|
|
|
|
impl Stream
|
|
|
|
|
{
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|