use std::fmt;
#[derive(Debug, Clone, PartialEq, Eq)]
pub enum ProcEvent {
Exec {
pid: u32,
tgid: u32,
timestamp_ns: u64,
},
Fork {
parent_pid: u32,
parent_tgid: u32,
child_pid: u32,
child_tgid: u32,
timestamp_ns: u64,
},
Exit {
pid: u32,
tgid: u32,
exit_code: u32,
exit_signal: u32,
timestamp_ns: u64,
},
Uid {
pid: u32,
tgid: u32,
ruid: u32,
euid: u32,
timestamp_ns: u64,
},
Gid {
pid: u32,
tgid: u32,
rgid: u32,
egid: u32,
timestamp_ns: u64,
},
Sid {
pid: u32,
tgid: u32,
timestamp_ns: u64,
},
Ptrace {
pid: u32,
tgid: u32,
tracer_pid: u32,
tracer_tgid: u32,
timestamp_ns: u64,
},
Comm {
pid: u32,
tgid: u32,
comm: [u8; 16],
timestamp_ns: u64,
},
Coredump {
pid: u32,
tgid: u32,
timestamp_ns: u64,
},
Unknown {
what: u32,
raw_data: Vec<u8>,
},
}
impl fmt::Display for ProcEvent {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
match self {
ProcEvent::Exec {
pid,
tgid,
timestamp_ns,
} => write!(f, "EXEC pid={pid} tgid={tgid} ts={timestamp_ns}"),
ProcEvent::Fork {
parent_pid,
parent_tgid,
child_pid,
child_tgid,
timestamp_ns,
} => write!(
f,
"FORK parent=({parent_pid},{parent_tgid}) child=({child_pid},{child_tgid}) ts={timestamp_ns}"
),
ProcEvent::Exit {
pid,
tgid,
exit_code,
exit_signal,
timestamp_ns,
} => write!(
f,
"EXIT pid={pid} tgid={tgid} code={exit_code} signal={exit_signal} ts={timestamp_ns}"
),
ProcEvent::Uid {
pid,
tgid,
ruid,
euid,
timestamp_ns,
} => write!(
f,
"UID pid={pid} tgid={tgid} ruid={ruid} euid={euid} ts={timestamp_ns}"
),
ProcEvent::Gid {
pid,
tgid,
rgid,
egid,
timestamp_ns,
} => write!(
f,
"GID pid={pid} tgid={tgid} rgid={rgid} egid={egid} ts={timestamp_ns}"
),
ProcEvent::Sid {
pid,
tgid,
timestamp_ns,
} => write!(f, "SID pid={pid} tgid={tgid} ts={timestamp_ns}"),
ProcEvent::Ptrace {
pid,
tgid,
tracer_pid,
tracer_tgid,
timestamp_ns,
} => write!(
f,
"PTRACE pid={pid} tgid={tgid} tracer=({tracer_pid},{tracer_tgid}) ts={timestamp_ns}"
),
ProcEvent::Comm {
pid,
tgid,
comm,
timestamp_ns,
} => {
let end = comm.iter().position(|&b| b == 0).unwrap_or(16);
let name = std::str::from_utf8(&comm[..end]).unwrap_or("<invalid>");
write!(
f,
"COMM pid={pid} tgid={tgid} name=\"{name}\" ts={timestamp_ns}"
)
}
ProcEvent::Coredump {
pid,
tgid,
timestamp_ns,
} => {
write!(f, "COREDUMP pid={pid} tgid={tgid} ts={timestamp_ns}")
}
ProcEvent::Unknown { what, raw_data } => {
write!(f, "UNKNOWN what=0x{what:08x} len={}", raw_data.len())
}
}
}
}