mod files;
pub mod helpers;
pub(crate) use files::DETERMINISTIC_PIPE_CAPACITY_BYTES;
mod io;
mod memory;
mod misc;
mod namespace;
pub(crate) mod robust_list;
mod signal;
pub(crate) mod socket_timestamp_ioctl;
mod sysinfo;
mod threads;
pub(crate) mod time;
use crate::consts::DET_SPECIAL_INODE_OFFSET;
use crate::resources::Device;
use crate::resources::ResourceID;
use crate::types::DetInode;
use crate::types::RawFd;
fn deterministic_stdio_inode(fd: RawFd) -> Option<DetInode> {
(libc::STDIN_FILENO..=libc::STDERR_FILENO)
.contains(&fd)
.then_some(DetInode::mint(
DET_SPECIAL_INODE_OFFSET.as_raw() + fd as u64,
))
}
pub(crate) fn deterministic_stdio_inode_for_resource(
fd: RawFd,
resource: Option<ResourceID>,
) -> Option<DetInode> {
match resource {
Some(ResourceID::Device(
Device::ContainerStdin | Device::ContainerStdout | Device::ContainerStderr,
)) => deterministic_stdio_inode(fd),
_ => None,
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn stdio_inode_namespace_is_fixed() {
assert_eq!(
deterministic_stdio_inode(libc::STDIN_FILENO),
Some(DetInode::mint(1000))
);
assert_eq!(
deterministic_stdio_inode(libc::STDOUT_FILENO),
Some(DetInode::mint(1001))
);
assert_eq!(
deterministic_stdio_inode(libc::STDERR_FILENO),
Some(DetInode::mint(1002))
);
assert_eq!(deterministic_stdio_inode(3), None);
for resource in [
ResourceID::Device(Device::ContainerStdin),
ResourceID::Device(Device::ContainerStdout),
ResourceID::Device(Device::ContainerStderr),
] {
for fd in 0..=2 {
assert_eq!(
deterministic_stdio_inode_for_resource(fd, Some(resource.clone())),
Some(DetInode::mint(1000 + fd as u64))
);
}
assert_eq!(
deterministic_stdio_inode_for_resource(3, Some(resource)),
None
);
}
for fd in 0..=2 {
assert_eq!(deterministic_stdio_inode_for_resource(fd, None), None);
assert_eq!(
deterministic_stdio_inode_for_resource(
fd,
Some(ResourceID::FileContents(DetInode::mint(1000))),
),
None
);
}
}
}