use std::borrow::Cow;
use perf_event_open_sys::bindings;
use crate::prelude::*;
#[derive(Clone, Debug)]
pub struct Namespaces<'a> {
pub pid: u32,
pub tid: u32,
pub namespaces: Cow<'a, [NamespaceEntry]>,
}
#[derive(Copy, Clone, Debug, Eq, PartialEq, Hash)]
#[repr(C)]
pub struct NamespaceEntry {
pub dev: u64,
pub inode: u64,
}
impl<'a> Namespaces<'a> {
pub fn network(&self) -> Option<&NamespaceEntry> {
self.namespaces.get(bindings::NET_NS_INDEX as usize)
}
pub fn uts(&self) -> Option<&NamespaceEntry> {
self.namespaces.get(bindings::USER_NS_INDEX as usize)
}
pub fn ipc(&self) -> Option<&NamespaceEntry> {
self.namespaces.get(bindings::IPC_NS_INDEX as usize)
}
pub fn pid(&self) -> Option<&NamespaceEntry> {
self.namespaces.get(bindings::PID_NS_INDEX as usize)
}
pub fn user(&self) -> Option<&NamespaceEntry> {
self.namespaces.get(bindings::USER_NS_INDEX as usize)
}
pub fn cgroup(&self) -> Option<&NamespaceEntry> {
self.namespaces.get(bindings::CGROUP_NS_INDEX as usize)
}
}
impl<'p> Parse<'p> for NamespaceEntry {
fn parse<B, E>(p: &mut Parser<B, E>) -> ParseResult<Self>
where
E: Endian,
B: ParseBuf<'p>,
{
Ok(Self {
dev: p.parse()?,
inode: p.parse()?,
})
}
}
impl<'p> Parse<'p> for Namespaces<'p> {
fn parse<B, E>(p: &mut Parser<B, E>) -> ParseResult<Self>
where
E: Endian,
B: ParseBuf<'p>,
{
let pid = p.parse()?;
let tid = p.parse()?;
let len = p.parse_u64()? as usize;
let namespaces = unsafe { p.parse_slice(len)? };
Ok(Self {
pid,
tid,
namespaces,
})
}
}