//! Linux and Android-specific extensions to socket addresses. use crate::os::unix::net::SocketAddr; use crate::sealed::Sealed; /// Platform-specific extensions to [`SocketAddr`]. #[unstable(feature = "unix_socket_abstract", issue = "85410")] pub trait SocketAddrExt: Sealed { /// Creates a Unix socket address in the abstract namespace. /// /// The abstract namespace is a Linux-specific extension that allows Unix /// sockets to be bound without creating an entry in the filesystem. /// Abstract sockets are unaffected by filesystem layout or permissions, /// and no cleanup is necessary when the socket is closed. /// /// An abstract socket address name may contain any bytes, including zero. /// /// # Errors /// /// Returns an error if the name is longer than `SUN_LEN - 1`. /// /// # Examples /// /// ```no_run /// #![feature(unix_socket_abstract)] /// use std::os::unix::net::{UnixListener, SocketAddr}; /// use std::os::linux::net::SocketAddrExt; /// /// fn main() -> std::io::Result<()> { /// let addr = SocketAddr::from_abstract_name(b"hidden")?; /// let listener = match UnixListener::bind_addr(&addr) { /// Ok(sock) => sock, /// Err(err) => { /// println!("Couldn't bind: {err:?}"); /// return Err(err); /// } /// }; /// Ok(()) /// } /// ``` fn from_abstract_name(name: &N) -> crate::io::Result where N: AsRef<[u8]>; /// Returns the contents of this address if it is in the abstract namespace. /// /// # Examples /// /// ```no_run /// #![feature(unix_socket_abstract)] /// use std::os::unix::net::{UnixListener, SocketAddr}; /// use std::os::linux::net::SocketAddrExt; /// /// fn main() -> std::io::Result<()> { /// let name = b"hidden"; /// let name_addr = SocketAddr::from_abstract_name(name)?; /// let socket = UnixListener::bind_addr(&name_addr)?; /// let local_addr = socket.local_addr().expect("Couldn't get local address"); /// assert_eq!(local_addr.as_abstract_name(), Some(&name[..])); /// Ok(()) /// } /// ``` fn as_abstract_name(&self) -> Option<&[u8]>; }