starnix_core/ptrace/
event.rs1use bitflags::bitflags;
6use starnix_uapi::{
7 PTRACE_EVENT_CLONE, PTRACE_EVENT_EXEC, PTRACE_EVENT_EXIT, PTRACE_EVENT_FORK,
8 PTRACE_EVENT_SECCOMP, PTRACE_EVENT_STOP, PTRACE_EVENT_VFORK, PTRACE_EVENT_VFORK_DONE,
9 PTRACE_O_EXITKILL, PTRACE_O_SUSPEND_SECCOMP, PTRACE_O_TRACECLONE, PTRACE_O_TRACEEXEC,
10 PTRACE_O_TRACEEXIT, PTRACE_O_TRACEFORK, PTRACE_O_TRACESECCOMP, PTRACE_O_TRACESYSGOOD,
11 PTRACE_O_TRACEVFORK, PTRACE_O_TRACEVFORKDONE,
12};
13
14bitflags! {
15 #[derive(Clone, Copy, Debug, PartialEq, Eq, PartialOrd, Ord, Hash)]
16 #[repr(transparent)]
17 pub struct PtraceOptions: u32 {
18 const EXITKILL = PTRACE_O_EXITKILL;
19 const TRACECLONE = PTRACE_O_TRACECLONE;
20 const TRACEEXEC = PTRACE_O_TRACEEXEC;
21 const TRACEEXIT = PTRACE_O_TRACEEXIT;
22 const TRACEFORK = PTRACE_O_TRACEFORK;
23 const TRACESYSGOOD = PTRACE_O_TRACESYSGOOD;
24 const TRACEVFORK = PTRACE_O_TRACEVFORK;
25 const TRACEVFORKDONE = PTRACE_O_TRACEVFORKDONE;
26 const TRACESECCOMP = PTRACE_O_TRACESECCOMP;
27 const SUSPEND_SECCOMP = PTRACE_O_SUSPEND_SECCOMP;
28 }
29}
30
31#[repr(u32)]
32#[derive(Clone, Copy, Debug, Default, Eq, PartialEq)]
33pub enum PtraceEvent {
34 #[default]
35 None = 0,
36 Stop = PTRACE_EVENT_STOP,
37 Clone = PTRACE_EVENT_CLONE,
38 Fork = PTRACE_EVENT_FORK,
39 Vfork = PTRACE_EVENT_VFORK,
40 VforkDone = PTRACE_EVENT_VFORK_DONE,
41 Exec = PTRACE_EVENT_EXEC,
42 Exit = PTRACE_EVENT_EXIT,
43 Seccomp = PTRACE_EVENT_SECCOMP,
44}
45
46impl PtraceEvent {
47 pub fn from_option(option: PtraceOptions) -> Self {
48 match option {
49 PtraceOptions::TRACECLONE => PtraceEvent::Clone,
50 PtraceOptions::TRACEFORK => PtraceEvent::Fork,
51 PtraceOptions::TRACEVFORK => PtraceEvent::Vfork,
52 PtraceOptions::TRACEVFORKDONE => PtraceEvent::VforkDone,
53 PtraceOptions::TRACEEXEC => PtraceEvent::Exec,
54 PtraceOptions::TRACEEXIT => PtraceEvent::Exit,
55 PtraceOptions::TRACESECCOMP => PtraceEvent::Seccomp,
56 _ => unreachable!("Bad ptrace event specified"),
57 }
58 }
59}
60
61#[derive(Clone, Copy, Debug, PartialEq, Eq)]
63pub struct PtraceEventData {
64 pub event: PtraceEvent,
66
67 pub msg: u64,
69}
70
71impl PtraceEventData {
72 pub fn new(option: PtraceOptions, msg: u64) -> Self {
73 Self { event: PtraceEvent::from_option(option), msg }
74 }
75 pub fn new_from_event(event: PtraceEvent, msg: u64) -> Self {
76 Self { event, msg }
77 }
78}