mirror of
https://github.com/mii443/izoli.git
synced 2025-08-22 16:05:40 +00:00
37 lines
1.0 KiB
Rust
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)) }
|
|
}
|
|
}
|