use crate::libproc::{
bindings::{au_asid_t, audit_token_t},
mach,
};
use rustix::{
fs::{Gid, Uid},
process::Pid,
};
use std::hash::{Hash, Hasher};
#[derive(Debug, Clone, Copy)]
pub struct AuditToken {
raw: audit_token_t,
}
impl PartialEq for AuditToken {
fn eq(&self, other: &Self) -> bool {
self.raw.val == other.raw.val
}
}
impl Eq for AuditToken {}
impl Hash for AuditToken {
fn hash<H: Hasher>(&self, state: &mut H) {
self.raw.val.hash(state);
}
}
impl AuditToken {
pub fn from_pid(pid: Pid) -> Result<Self, system_error::Error> {
let audit_token = mach::audit_token_from_pid(pid.as_raw_pid())?;
Ok(AuditToken { raw: audit_token })
}
#[inline]
pub fn raw_token(&self) -> &audit_token_t {
&self.raw
}
#[inline(always)]
pub fn auid(&self) -> Uid {
unsafe { Uid::from_raw_unchecked(mach::audit_token_to_auid(self.raw)) }
}
#[inline(always)]
pub fn euid(&self) -> Uid {
unsafe { Uid::from_raw_unchecked(mach::audit_token_to_euid(self.raw)) }
}
#[inline(always)]
pub fn egid(&self) -> Gid {
unsafe { Gid::from_raw_unchecked(mach::audit_token_to_egid(self.raw)) }
}
#[inline(always)]
pub fn ruid(&self) -> Uid {
unsafe { Uid::from_raw_unchecked(mach::audit_token_to_ruid(self.raw)) }
}
#[inline(always)]
pub fn rgid(&self) -> Gid {
unsafe { Gid::from_raw_unchecked(mach::audit_token_to_rgid(self.raw)) }
}
#[inline(always)]
pub fn pid(&self) -> Pid {
unsafe { Pid::from_raw_unchecked(mach::audit_token_to_pid(self.raw)) }
}
#[inline(always)]
pub fn asid(&self) -> au_asid_t {
unsafe { mach::audit_token_to_asid(self.raw) }
}
#[inline(always)]
pub fn pidversion(&self) -> i32 {
unsafe { mach::audit_token_to_pidversion(self.raw) }
}
}