2026-07-14 22:08:29 +09:00
|
|
|
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)
|
|
|
|
|
}
|
|
|
|
|
|
2026-07-15 19:09:24 +09:00
|
|
|
/// # 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)
|
|
|
|
|
}
|
|
|
|
|
|
2026-07-14 22:08:29 +09:00
|
|
|
#[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");
|
|
|
|
|
}
|
|
|
|
|
}
|