#![allow(unsafe_code)]
use bitflags::bitflags;
use linux_raw_sys::general::{
CLONE_FILES, CLONE_FS, CLONE_NEWCGROUP, CLONE_NEWIPC, CLONE_NEWNET, CLONE_NEWNS, CLONE_NEWPID,
CLONE_NEWTIME, CLONE_NEWUSER, CLONE_NEWUTS, CLONE_SYSVSEM,
};
use crate::backend::c::c_int;
use crate::backend::thread::syscalls;
use crate::fd::BorrowedFd;
use crate::io;
bitflags! {
#[repr(transparent)]
#[derive(Copy, Clone, Eq, PartialEq, Hash, Debug)]
pub struct ThreadNameSpaceType: u32 {
const TIME = CLONE_NEWTIME;
const MOUNT = CLONE_NEWNS;
const CONTROL_GROUP = CLONE_NEWCGROUP;
const HOST_NAME_AND_NIS_DOMAIN_NAME = CLONE_NEWUTS;
const INTER_PROCESS_COMMUNICATION = CLONE_NEWIPC;
const USER = CLONE_NEWUSER;
const PROCESS_ID = CLONE_NEWPID;
const NETWORK = CLONE_NEWNET;
const _ = !0;
}
}
#[derive(Copy, Clone, Debug, Eq, PartialEq)]
#[repr(u32)]
pub enum LinkNameSpaceType {
Time = CLONE_NEWTIME,
Mount = CLONE_NEWNS,
ControlGroup = CLONE_NEWCGROUP,
HostNameAndNISDomainName = CLONE_NEWUTS,
InterProcessCommunication = CLONE_NEWIPC,
User = CLONE_NEWUSER,
ProcessID = CLONE_NEWPID,
Network = CLONE_NEWNET,
}
bitflags! {
#[repr(transparent)]
#[derive(Copy, Clone, Eq, PartialEq, Hash, Debug)]
pub struct UnshareFlags: u32 {
const FILES = CLONE_FILES;
const FS = CLONE_FS;
const NEWCGROUP = CLONE_NEWCGROUP;
const NEWIPC = CLONE_NEWIPC;
const NEWNET = CLONE_NEWNET;
const NEWNS = CLONE_NEWNS;
const NEWPID = CLONE_NEWPID;
const NEWTIME = CLONE_NEWTIME;
const NEWUSER = CLONE_NEWUSER;
const NEWUTS = CLONE_NEWUTS;
const SYSVSEM = CLONE_SYSVSEM;
const _ = !0;
}
}
#[doc(alias = "setns")]
pub fn move_into_link_name_space(
fd: BorrowedFd<'_>,
allowed_type: Option<LinkNameSpaceType>,
) -> io::Result<()> {
let allowed_type = allowed_type.map_or(0, |t| t as c_int);
syscalls::setns(fd, allowed_type).map(|_r| ())
}
#[doc(alias = "setns")]
pub fn move_into_thread_name_spaces(
fd: BorrowedFd<'_>,
allowed_types: ThreadNameSpaceType,
) -> io::Result<()> {
syscalls::setns(fd, allowed_types.bits() as c_int).map(|_r| ())
}
#[deprecated(since = "1.1.0", note = "Use `unshare_unsafe`")]
pub fn unshare(flags: UnshareFlags) -> io::Result<()> {
unsafe { syscalls::unshare(flags) }
}
pub unsafe fn unshare_unsafe(flags: UnshareFlags) -> io::Result<()> {
syscalls::unshare(flags)
}