use capsec::prelude::*;
#[capsec::main]
fn main(root: CapRoot) -> Result<(), Box<dyn std::error::Error>> {
let logged_cap = LoggedCap::new(root.fs_read());
println!("=== Audited Capability Access ===");
println!("[start] Log entries: {}", logged_cap.entry_count());
let cap = logged_cap.try_cap()?;
let data = capsec::fs::read("/dev/null", &cap)?;
println!("[read] Read {} bytes from /dev/null", data.len());
let cap = logged_cap.try_cap()?;
let _ = capsec::fs::read("/dev/null", &cap)?;
println!("[read] Read /dev/null again");
println!("\n=== Audit Log ({} entries) ===", logged_cap.entry_count());
for (i, entry) in logged_cap.entries().iter().enumerate() {
println!(
" [{}] permission={}, granted={}, elapsed={:?}",
i,
entry.permission,
entry.granted,
entry.timestamp.elapsed()
);
}
let clone = logged_cap.clone();
let _ = clone.try_cap()?;
println!(
"\n[clone] After clone exercise: {} total entries (shared log)",
logged_cap.entry_count()
);
println!("\n=== Demo Complete ===");
println!("Every capability exercise is recorded for compliance.");
Ok(())
}