Skip to content

Commit

Permalink
Auto merge of #2082 - landfillbaby:patch-1, r=Amanieu
Browse files Browse the repository at this point in the history
use GNU/Linux siginfo_t on Android

Bionic uses an unchanged siginfo.h from the upstream linux so why not? :)
I literally just copied everything with siginfo_t from unix/linux_like/linux/gnu/mod.rs to unix/linux_like/android/mod.rs
  • Loading branch information
bors committed Feb 28, 2021
2 parents add9726 + 51461b1 commit 1524495
Showing 1 changed file with 73 additions and 0 deletions.
73 changes: 73 additions & 0 deletions src/unix/linux_like/android/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -2824,6 +2824,17 @@ cfg_if! {
}

impl siginfo_t {
pub unsafe fn si_addr(&self) -> *mut ::c_void {
#[repr(C)]
struct siginfo_sigfault {
_si_signo: ::c_int,
_si_errno: ::c_int,
_si_code: ::c_int,
si_addr: *mut ::c_void,
}
(*(self as *const siginfo_t as *const siginfo_sigfault)).si_addr
}

pub unsafe fn si_value(&self) -> ::sigval {
#[repr(C)]
struct siginfo_timer {
Expand All @@ -2837,3 +2848,65 @@ impl siginfo_t {
(*(self as *const siginfo_t as *const siginfo_timer)).si_sigval
}
}

cfg_if! {
if #[cfg(libc_union)] {
// Internal, for casts to access union fields
#[repr(C)]
struct sifields_sigchld {
si_pid: ::pid_t,
si_uid: ::uid_t,
si_status: ::c_int,
si_utime: ::c_long,
si_stime: ::c_long,
}
impl ::Copy for sifields_sigchld {}
impl ::Clone for sifields_sigchld {
fn clone(&self) -> sifields_sigchld {
*self
}
}

// 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 {
_siginfo_base: [::c_int; 3],
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
}

pub unsafe fn si_utime(&self) -> ::c_long {
self.sifields().sigchld.si_utime
}

pub unsafe fn si_stime(&self) -> ::c_long {
self.sifields().sigchld.si_stime
}
}
}
}

0 comments on commit 1524495

Please sign in to comment.