From c2d1573f4f25a323faa08c7cbfb3697c45944d6d Mon Sep 17 00:00:00 2001 From: Ben Noordhuis Date: Sun, 10 Oct 2021 16:45:25 +0200 Subject: [PATCH] Add sys::unix::SocketAddr::as_abstract_namespace() Fixes #1517. --- src/sys/unix/uds/socketaddr.rs | 12 ++++++++++++ tests/unix_listener.rs | 13 +++++++++++++ 2 files changed, 25 insertions(+) diff --git a/src/sys/unix/uds/socketaddr.rs b/src/sys/unix/uds/socketaddr.rs index a9f9ea915..c07a073cb 100644 --- a/src/sys/unix/uds/socketaddr.rs +++ b/src/sys/unix/uds/socketaddr.rs @@ -100,6 +100,18 @@ cfg_os_poll! { None } } + + /// Returns the contents of this address if it is an abstract namespace + /// without the leading null byte. + // Link to std::os::unix::net::SocketAddr pending + // https://github.com/rust-lang/rust/issues/85410. + pub fn as_abstract_namespace(&self) -> Option<&[u8]> { + if let AddressKind::Abstract(path) = self.address() { + Some(path) + } else { + None + } + } } } diff --git a/tests/unix_listener.rs b/tests/unix_listener.rs index d89ef5bc6..0aeda8153 100644 --- a/tests/unix_listener.rs +++ b/tests/unix_listener.rs @@ -133,6 +133,19 @@ fn unix_listener_deregister() { handle.join().unwrap(); } +#[cfg(target_os = "linux")] +#[test] +fn unix_listener_abstract_namesapce() { + use rand::Rng; + let num: u64 = rand::thread_rng().gen(); + let name = format!("\u{0000}-mio-abstract-uds-{}", num); + let listener = UnixListener::bind(&name).unwrap(); + assert_eq!( + listener.local_addr().unwrap().as_abstract_namespace(), + Some(&name.as_bytes()[1..]), + ); +} + fn smoke_test(new_listener: F, test_name: &'static str) where F: FnOnce(&Path) -> io::Result,