Skip to content

Commit 6ff0689

Browse files
authored
Merge pull request #1858 from joshtriplett/siginfo-pid-uid
Expose si_pid and si_uid from siginfo_t as functions
2 parents 67005e0 + a4178c5 commit 6ff0689

File tree

5 files changed

+105
-0
lines changed

5 files changed

+105
-0
lines changed

src/unix/bsd/apple/mod.rs

+8
Original file line numberDiff line numberDiff line change
@@ -682,6 +682,14 @@ impl siginfo_t {
682682

683683
(*(self as *const siginfo_t as *const siginfo_timer)).si_value
684684
}
685+
686+
pub unsafe fn si_pid(&self) -> ::pid_t {
687+
self.si_pid
688+
}
689+
690+
pub unsafe fn si_uid(&self) -> ::uid_t {
691+
self.si_uid
692+
}
685693
}
686694

687695
cfg_if! {

src/unix/bsd/freebsdlike/mod.rs

+8
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,14 @@ impl siginfo_t {
3131
pub unsafe fn si_value(&self) -> ::sigval {
3232
self.si_value
3333
}
34+
35+
pub unsafe fn si_pid(&self) -> ::pid_t {
36+
self.si_pid
37+
}
38+
39+
pub unsafe fn si_uid(&self) -> ::uid_t {
40+
self.si_uid
41+
}
3442
}
3543

3644
s! {

src/unix/haiku/mod.rs

+14
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,20 @@ impl ::Clone for timezone {
3838
}
3939
}
4040

41+
impl siginfo_t {
42+
pub unsafe fn si_addr(&self) -> *mut ::c_void {
43+
self.si_addr
44+
}
45+
46+
pub unsafe fn si_pid(&self) -> ::pid_t {
47+
self.si_pid
48+
}
49+
50+
pub unsafe fn si_uid(&self) -> ::uid_t {
51+
self.si_uid
52+
}
53+
}
54+
4155
s! {
4256
pub struct in_addr {
4357
pub s_addr: ::in_addr_t,

src/unix/linux_like/linux/gnu/mod.rs

+57
Original file line numberDiff line numberDiff line change
@@ -313,6 +313,63 @@ impl siginfo_t {
313313
}
314314
}
315315

316+
cfg_if! {
317+
if #[cfg(libc_union)] {
318+
// Internal, for casts to access union fields
319+
#[repr(C)]
320+
#[derive(Copy,Clone)]
321+
struct sifields_sigchld {
322+
si_pid: ::pid_t,
323+
si_uid: ::uid_t,
324+
si_status: ::c_int,
325+
si_utime: ::c_long,
326+
si_stime: ::c_long,
327+
}
328+
329+
// Internal, for casts to access union fields
330+
#[repr(C)]
331+
union sifields {
332+
_align_pointer: *mut ::c_void,
333+
sigchld: sifields_sigchld,
334+
}
335+
336+
// Internal, for casts to access union fields. Note that some variants
337+
// of sifields start with a pointer, which makes the alignment of
338+
// sifields vary on 32-bit and 64-bit architectures.
339+
#[repr(C)]
340+
struct siginfo_f {
341+
_siginfo_base: [::c_int; 3],
342+
sifields: sifields,
343+
}
344+
345+
impl siginfo_t {
346+
unsafe fn sifields(&self) -> &sifields {
347+
&(*(self as *const siginfo_t as *const siginfo_f)).sifields
348+
}
349+
350+
pub unsafe fn si_pid(&self) -> ::pid_t {
351+
self.sifields().sigchld.si_pid
352+
}
353+
354+
pub unsafe fn si_uid(&self) -> ::uid_t {
355+
self.sifields().sigchld.si_uid
356+
}
357+
358+
pub unsafe fn si_status(&self) -> ::c_int {
359+
self.sifields().sigchld.si_status
360+
}
361+
362+
pub unsafe fn si_utime(&self) -> ::c_long {
363+
self.sifields().sigchld.si_utime
364+
}
365+
366+
pub unsafe fn si_stime(&self) -> ::c_long {
367+
self.sifields().sigchld.si_stime
368+
}
369+
}
370+
}
371+
}
372+
316373
s_no_extra_traits! {
317374
pub struct utmpx {
318375
pub ut_type: ::c_short,

src/vxworks/mod.rs

+18
Original file line numberDiff line numberDiff line change
@@ -112,6 +112,24 @@ impl ::Clone for _Vx_semaphore {
112112
}
113113
}
114114

115+
impl siginfo_t {
116+
pub unsafe fn si_addr(&self) -> *mut ::c_void {
117+
self.si_addr
118+
}
119+
120+
pub unsafe fn si_value(&self) -> ::sigval {
121+
self.si_value
122+
}
123+
124+
pub unsafe fn si_pid(&self) -> ::pid_t {
125+
self.si_pid
126+
}
127+
128+
pub unsafe fn si_uid(&self) -> ::uid_t {
129+
self.si_uid
130+
}
131+
}
132+
115133
s! {
116134
// b_pthread_condattr_t.h
117135
pub struct pthread_condattr_t {

0 commit comments

Comments
 (0)