//! Linux and Android-specific socket functionality. use crate::io; use crate::os::unix::net; use crate::sealed::Sealed; use crate::sys_common::AsInner; /// Linux-specific functionality for `AF_UNIX` sockets [`UnixDatagram`] /// and [`UnixStream`]. /// /// [`UnixDatagram`]: net::UnixDatagram /// [`UnixStream`]: net::UnixStream #[unstable(feature = "unix_socket_ancillary_data", issue = "76915")] pub trait UnixSocketExt: Sealed { /// Query the current setting of socket option `SO_PASSCRED`. #[unstable(feature = "unix_socket_ancillary_data", issue = "76915")] fn passcred(&self) -> io::Result; /// Enable or disable socket option `SO_PASSCRED`. /// /// This option enables the credentials of the sending process to be /// received as a control message in [`AncillaryData`]. /// /// [`AncillaryData`]: net::AncillaryData /// /// # Examples /// /// ```no_run /// #![feature(unix_socket_ancillary_data)] /// #[cfg(target_os = "linux")] /// use std::os::linux::net::UnixSocketExt; /// #[cfg(target_os = "android")] /// use std::os::android::net::UnixSocketExt; /// use std::os::unix::net::UnixDatagram; /// /// fn main() -> std::io::Result<()> { /// let sock = UnixDatagram::unbound()?; /// sock.set_passcred(true).expect("set_passcred failed"); /// Ok(()) /// } /// ``` #[unstable(feature = "unix_socket_ancillary_data", issue = "76915")] fn set_passcred(&self, passcred: bool) -> io::Result<()>; } #[unstable(feature = "unix_socket_ancillary_data", issue = "76915")] impl UnixSocketExt for net::UnixDatagram { fn passcred(&self) -> io::Result { self.as_inner().passcred() } fn set_passcred(&self, passcred: bool) -> io::Result<()> { self.as_inner().set_passcred(passcred) } } #[unstable(feature = "unix_socket_ancillary_data", issue = "76915")] impl UnixSocketExt for net::UnixStream { fn passcred(&self) -> io::Result { self.as_inner().passcred() } fn set_passcred(&self, passcred: bool) -> io::Result<()> { self.as_inner().set_passcred(passcred) } }