use super::{RecordId, Task};
#[derive(Clone)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub struct Namespaces {
pub record_id: Option<RecordId>,
pub task: Task,
pub ns_uts: LinkInfo,
pub ns_pid: LinkInfo,
pub ns_ipc: LinkInfo,
pub ns_mnt: LinkInfo,
pub ns_net: LinkInfo,
pub ns_user: LinkInfo,
pub ns_cgroup: LinkInfo,
}
impl Namespaces {
#[cfg(feature = "linux-4.12")]
pub(crate) unsafe fn from_ptr(
mut ptr: *const u8,
sample_id_all: Option<super::SampleType>,
) -> Self {
use super::SampleType;
use crate::ffi::{bindings as b, deref_offset};
let task = Task {
pid: deref_offset(&mut ptr),
tid: deref_offset(&mut ptr),
};
#[repr(C)]
#[derive(Clone, Copy)]
struct Layout {
dev: u64,
inode: u64,
}
impl From<Layout> for LinkInfo {
fn from(value: Layout) -> Self {
Self {
dev: value.dev,
inode: value.inode,
}
}
}
let nss: [Layout; b::NR_NAMESPACES as _] = deref_offset(&mut ptr);
let record_id = sample_id_all.map(|SampleType(ty)| RecordId::from_ptr(ptr, ty));
Self {
record_id,
task,
ns_net: nss[b::NET_NS_INDEX as usize].into(),
ns_uts: nss[b::UTS_NS_INDEX as usize].into(),
ns_ipc: nss[b::IPC_NS_INDEX as usize].into(),
ns_pid: nss[b::PID_NS_INDEX as usize].into(),
ns_user: nss[b::USER_NS_INDEX as usize].into(),
ns_mnt: nss[b::MNT_NS_INDEX as usize].into(),
ns_cgroup: nss[b::CGROUP_NS_INDEX as usize].into(),
}
}
}
super::from!(Namespaces);
super::debug!(Namespaces {
{record_id?},
{task},
{ns_net},
{ns_uts},
{ns_ipc},
{ns_pid},
{ns_user},
{ns_mnt},
{ns_cgroup},
});
#[derive(Clone, Debug)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub struct LinkInfo {
pub dev: u64,
pub inode: u64,
}