Files
izoli/src/izolibox.rs
2024-10-21 03:02:58 +00:00

37 lines
1.0 KiB
Rust

use nix::{
libc::SIGCHLD,
sched::{self, CloneCb, CloneFlags},
unistd::Pid,
};
use crate::cgroup::{cgroup::CGroup, cgroup_option::CGroupOption};
const STACK_SIZE: usize = 8192;
pub struct IzoliBox {
pub id: usize,
pub cgroup_option: Option<CGroupOption>,
}
impl IzoliBox {
pub fn new(id: usize, cgroup_option: Option<CGroupOption>) -> Self {
Self { id, cgroup_option }
}
pub fn enter(&self, callback: CloneCb<'_>) -> Result<Pid, nix::errno::Errno> {
let mut stack = [0u8; STACK_SIZE];
let flags = CloneFlags::CLONE_NEWNS
| CloneFlags::CLONE_NEWUTS
| CloneFlags::CLONE_NEWIPC
| CloneFlags::CLONE_NEWPID;
if let Some(cgroup_option) = &self.cgroup_option {
let cgroup = CGroup::new(&format!("izoli/box_{}", self.id)).unwrap();
cgroup.apply_options(cgroup_option).unwrap();
cgroup.enter().unwrap();
}
unsafe { sched::clone(callback, &mut stack, flags, Some(SIGCHLD)) }
}
}