diff --git a/src/unix/bsd/apple/mod.rs b/src/unix/bsd/apple/mod.rs index f130974728d15d71e2c4bd62f12cde85f315b672..f56ee02b06daa5f4c271448578122b512f026dec 100644 --- a/src/unix/bsd/apple/mod.rs +++ b/src/unix/bsd/apple/mod.rs @@ -680,6 +680,14 @@ impl siginfo_t { (*(self as *const siginfo_t as *const siginfo_timer)).si_value } + + pub unsafe fn si_pid(&self) -> ::pid_t { + self.si_pid + } + + pub unsafe fn si_uid(&self) -> ::uid_t { + self.si_uid + } } cfg_if! { diff --git a/src/unix/bsd/freebsdlike/mod.rs b/src/unix/bsd/freebsdlike/mod.rs index b75c1a8e8edbaf610c841ea20c61235ea567e3cc..e9f70579ea6770d6d7ec9acd98dd35b27224c4d8 100644 --- a/src/unix/bsd/freebsdlike/mod.rs +++ b/src/unix/bsd/freebsdlike/mod.rs @@ -31,6 +31,14 @@ impl siginfo_t { pub unsafe fn si_value(&self) -> ::sigval { self.si_value } + + pub unsafe fn si_pid(&self) -> ::pid_t { + self.si_pid + } + + pub unsafe fn si_uid(&self) -> ::uid_t { + self.si_uid + } } s! { diff --git a/src/unix/haiku/mod.rs b/src/unix/haiku/mod.rs index 27f88f155f103791dda0adde9634bbb08ab192f5..adcac2e5ae56a304c0019f0a59a8029b4e534a90 100644 --- a/src/unix/haiku/mod.rs +++ b/src/unix/haiku/mod.rs @@ -38,6 +38,20 @@ impl ::Clone for timezone { } } +impl siginfo_t { + pub unsafe fn si_addr(&self) -> *mut ::c_void { + self.si_addr + } + + pub unsafe fn si_pid(&self) -> ::pid_t { + self.si_pid + } + + pub unsafe fn si_uid(&self) -> ::uid_t { + self.si_uid + } +} + s! { pub struct in_addr { pub s_addr: ::in_addr_t, diff --git a/src/unix/linux_like/linux/gnu/mod.rs b/src/unix/linux_like/linux/gnu/mod.rs index 44796c3e3d0d37ffd020ceab1a709142c967e36f..982916a22ef7ae94203fe09dfb3f8dfc6f6750a8 100644 --- a/src/unix/linux_like/linux/gnu/mod.rs +++ b/src/unix/linux_like/linux/gnu/mod.rs @@ -313,6 +313,55 @@ impl siginfo_t { } } +cfg_if! { + if #[cfg(libc_union)] { + // Internal, for casts to access union fields + #[repr(C)] + #[derive(Copy,Clone)] + struct sifields_sigchld { + si_pid: ::pid_t, + si_uid: ::uid_t, + si_status: ::c_int, + } + + // Internal, for casts to access union fields + #[repr(C)] + union sifields { + _align_pointer: *mut ::c_void, + sigchld: sifields_sigchld, + } + + // Internal, for casts to access union fields. Note that some variants + // of sifields start with a pointer, which makes the alignment of + // sifields vary on 32-bit and 64-bit architectures. + #[repr(C)] + struct siginfo_f { + _si_signo: ::c_int, + _si_errno: ::c_int, + _si_code: ::c_int, + sifields: sifields, + } + + impl siginfo_t { + unsafe fn sifields(&self) -> &sifields { + &(*(self as *const siginfo_t as *const siginfo_f)).sifields + } + + pub unsafe fn si_pid(&self) -> ::pid_t { + self.sifields().sigchld.si_pid + } + + pub unsafe fn si_uid(&self) -> ::uid_t { + self.sifields().sigchld.si_uid + } + + pub unsafe fn si_status(&self) -> ::c_int { + self.sifields().sigchld.si_status + } + } + } +} + s_no_extra_traits! { pub struct utmpx { pub ut_type: ::c_short, diff --git a/src/vxworks/mod.rs b/src/vxworks/mod.rs index 2ca38d5e2413ba844ced9e32b319769cd494f98a..2a3ac7ff784f18455f108b7c5efd03043ec416c3 100755 --- a/src/vxworks/mod.rs +++ b/src/vxworks/mod.rs @@ -112,6 +112,24 @@ impl ::Clone for _Vx_semaphore { } } +impl siginfo_t { + pub unsafe fn si_addr(&self) -> *mut ::c_void { + self.si_addr + } + + pub unsafe fn si_value(&self) -> ::sigval { + self.si_value + } + + pub unsafe fn si_pid(&self) -> ::pid_t { + self.si_pid + } + + pub unsafe fn si_uid(&self) -> ::uid_t { + self.si_uid + } +} + s! { // b_pthread_condattr_t.h pub struct pthread_condattr_t {