use std::os::fd::OwnedFd; use rustix::net::{AddressFamily, SocketFlags, SocketType, socketpair}; /// # Errors /// Returns an error when the private sequenced-packet pair cannot be created. pub fn private_seqpacket_pair() -> std::io::Result<(OwnedFd, OwnedFd)> { socketpair( AddressFamily::UNIX, SocketType::SEQPACKET, SocketFlags::CLOEXEC, None, ) .map_err(Into::into) } /// # Errors /// Returns an error when the private stream pair cannot be created. pub fn private_stream_pair() -> std::io::Result<(OwnedFd, OwnedFd)> { socketpair( AddressFamily::UNIX, SocketType::STREAM, SocketFlags::CLOEXEC, None, ) .map_err(Into::into) } #[cfg(test)] mod tests { use std::os::fd::AsFd; use rustix::net::{RecvFlags, SendFlags, recv, send}; use super::private_seqpacket_pair; #[test] fn preserves_message_boundaries() { let (left, right) = private_seqpacket_pair().unwrap(); send(left.as_fd(), b"first", SendFlags::empty()).unwrap(); send(left.as_fd(), b"second", SendFlags::empty()).unwrap(); let mut buffer = [0_u8; 16]; let (_, first) = recv(right.as_fd(), &mut buffer, RecvFlags::empty()).unwrap(); assert_eq!(&buffer[..first], b"first"); let (_, second) = recv(right.as_fd(), &mut buffer, RecvFlags::empty()).unwrap(); assert_eq!(&buffer[..second], b"second"); } }