Add fail-closed Linux process and descriptor primitives

This commit is contained in:
ms2k 2026-07-14 22:08:29 +09:00
commit 1468f6b841

View file

@ -0,0 +1,36 @@
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)
}
#[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");
}
}