endpoint_sec/event/
event_od_group_add.rs1use std::ffi::OsStr;
4
5use endpoint_sec_sys::{es_event_od_group_add_t, es_od_member_id_t, es_od_member_id_t_anon0, es_od_member_type_t};
6
7use crate::{AuditToken, Process};
8
9#[doc(alias = "es_event_od_group_add_t")]
14pub struct EventOdGroupAdd<'a> {
15 pub(crate) raw: &'a es_event_od_group_add_t,
17 pub(crate) version: u32,
19}
20
21impl<'a> EventOdGroupAdd<'a> {
22 #[inline(always)]
24 pub fn instigator(&self) -> Option<Process<'a>> {
25 let process = unsafe { self.raw.instigator()? };
27 Some(Process::new(process, self.version))
28 }
29
30 pub fn instigator_token(&self) -> AuditToken {
32 #[cfg(feature = "macos_15_0_0")]
33 if self.version >= 8 {
34 return AuditToken(self.raw.instigator_token);
35 }
36
37 self.instigator().unwrap().audit_token()
40 }
41
42 #[inline(always)]
44 pub fn error_code(&self) -> i32 {
45 self.raw.error_code
46 }
47
48 #[inline(always)]
50 pub fn group_name(&self) -> &'a OsStr {
51 unsafe { self.raw.group_name.as_os_str() }
53 }
54
55 #[inline(always)]
57 pub fn member(&self) -> OdMemberId<'a> {
58 OdMemberId {
59 raw: unsafe { self.raw.member.as_ref() },
61 }
62 }
63
64 #[inline(always)]
68 pub fn node_name(&self) -> &'a OsStr {
69 unsafe { self.raw.node_name.as_os_str() }
71 }
72
73 #[inline(always)]
76 pub fn db_path(&self) -> Option<&'a OsStr> {
77 if self.node_name() == OsStr::new("/Local/Default") {
78 Some(unsafe { self.raw.db_path.as_os_str() })
80 } else {
81 None
82 }
83 }
84}
85
86unsafe impl Send for EventOdGroupAdd<'_> {}
88unsafe impl Sync for EventOdGroupAdd<'_> {}
90
91impl_debug_eq_hash_with_functions!(EventOdGroupAdd<'a> with version; instigator, instigator_token, error_code, group_name, member, node_name, db_path);
92
93#[doc(alias = "es_od_member_id_t")]
95pub struct OdMemberId<'a> {
96 pub(crate) raw: &'a es_od_member_id_t,
98}
99
100impl<'a> OdMemberId<'a> {
101 #[inline(always)]
103 pub fn member_type(&self) -> es_od_member_type_t {
104 self.raw.member_type
105 }
106
107 #[inline(always)]
109 pub fn raw_member_value(&self) -> &'a es_od_member_id_t_anon0 {
110 &self.raw.member_value
111 }
112
113 #[inline(always)]
115 pub fn member_value(&self) -> Option<OdMemberIdValue<'a>> {
116 let res = match self.member_type() {
118 es_od_member_type_t::ES_OD_MEMBER_TYPE_USER_UUID => {
119 OdMemberIdValue::UserUuid(unsafe { self.raw.member_value.uuid })
121 },
122 es_od_member_type_t::ES_OD_MEMBER_TYPE_GROUP_UUID => {
123 OdMemberIdValue::GroupUuid(unsafe { self.raw.member_value.uuid })
125 },
126 es_od_member_type_t::ES_OD_MEMBER_TYPE_USER_NAME => {
127 OdMemberIdValue::UserName(unsafe { self.raw.member_value.name.as_os_str() })
129 },
130 _ => return None,
131 };
132
133 Some(res)
134 }
135}
136
137unsafe impl Send for OdMemberId<'_> {}
139
140impl_debug_eq_hash_with_functions!(OdMemberId<'a>; member_type, member_value);
141
142#[derive(Debug, PartialEq, Eq, Hash)]
144#[non_exhaustive]
145pub enum OdMemberIdValue<'a> {
146 UserName(&'a OsStr),
148 UserUuid(libc::uuid_t),
150 GroupUuid(libc::uuid_t),
152}
153
154unsafe impl Send for OdMemberIdValue<'_> {}