From 3d189d53df547217982f52836a261f41c016176e Mon Sep 17 00:00:00 2001 From: Adam Martinez <149513579+dybucc@users.noreply.github.com> Date: Wed, 5 Aug 2026 18:37:39 +0200 Subject: [PATCH 1/7] linux: ensure `siginfo_t` uses `mod new` bindings Replace references to `siginfo_t` in the regular repository layout with a crate-relative path that uses the reexport from the `new` module. This allows the next few patches to all work as individual revisions. --- src/unix/linux_like/linux/mod.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/unix/linux_like/linux/mod.rs b/src/unix/linux_like/linux/mod.rs index 7db7639bb1ac..edfd6d3f5903 100644 --- a/src/unix/linux_like/linux/mod.rs +++ b/src/unix/linux_like/linux/mod.rs @@ -3564,10 +3564,10 @@ extern "C" { #[cfg_attr(musl_redir_time64, link_name = "__sigtimedwait_time64")] pub fn sigtimedwait( set: *const sigset_t, - info: *mut siginfo_t, + info: *mut crate::siginfo_t, timeout: *const crate::timespec, ) -> c_int; - pub fn sigwaitinfo(set: *const sigset_t, info: *mut siginfo_t) -> c_int; + pub fn sigwaitinfo(set: *const sigset_t, info: *mut crate::siginfo_t) -> c_int; pub fn accept4(fd: c_int, addr: *mut crate::sockaddr, len: *mut socklen_t, flg: c_int) -> c_int; pub fn reboot(how_to: c_int) -> c_int; From 899059b34f81bc4ea68bd50d067f55e347c8d310 Mon Sep 17 00:00:00 2001 From: Adam Martinez <149513579+dybucc@users.noreply.github.com> Date: Wed, 5 Aug 2026 18:37:42 +0200 Subject: [PATCH 2/7] linux(gnu): complete `siginfo_t` definition Replace alignment/padding fields with a one-to-one definition as that used upstream. These have been incorporated as definitions in the `new` module to avoid huge repetition across target triples without overrides. The glibc definitions are mostly the same across target architectures except for MIPS, SPARC and x86. x86 is confusing because there's only an override when running under x86_64 and compiling for x32. I'm not sure how Rust handles this, so the `#[path]`-redirected files for that architecture are the same as the generic ones. See [^1] for the generic file and the following list for the architecture-specific overrides. - `mips`: - `sparc`: - `x86`: [^1]: --- .../sysdeps/unix/linux/bits/types/mod.rs | 14 ++ .../unix/linux/bits/types/siginfo_t.rs | 214 +++++++++++++++++ .../unix/linux/mips/bits/siginfo_arch.rs | 209 ++++++++++++++++ src/new/glibc/sysdeps/unix/linux/mips/mod.rs | 10 + src/new/glibc/sysdeps/unix/linux/mod.rs | 2 + .../unix/linux/sparc/bits/siginfo_arch.rs | 225 ++++++++++++++++++ src/new/glibc/sysdeps/unix/linux/sparc/mod.rs | 10 + .../unix/linux/x86/bits/siginfo_arch.rs | 209 ++++++++++++++++ src/new/glibc/sysdeps/unix/linux/x86/mod.rs | 10 + 9 files changed, 903 insertions(+) create mode 100644 src/new/glibc/sysdeps/unix/linux/bits/types/mod.rs create mode 100644 src/new/glibc/sysdeps/unix/linux/bits/types/siginfo_t.rs create mode 100644 src/new/glibc/sysdeps/unix/linux/mips/bits/siginfo_arch.rs create mode 100644 src/new/glibc/sysdeps/unix/linux/mips/mod.rs create mode 100644 src/new/glibc/sysdeps/unix/linux/sparc/bits/siginfo_arch.rs create mode 100644 src/new/glibc/sysdeps/unix/linux/sparc/mod.rs create mode 100644 src/new/glibc/sysdeps/unix/linux/x86/bits/siginfo_arch.rs create mode 100644 src/new/glibc/sysdeps/unix/linux/x86/mod.rs diff --git a/src/new/glibc/sysdeps/unix/linux/bits/types/mod.rs b/src/new/glibc/sysdeps/unix/linux/bits/types/mod.rs new file mode 100644 index 000000000000..698e4cfbb994 --- /dev/null +++ b/src/new/glibc/sysdeps/unix/linux/bits/types/mod.rs @@ -0,0 +1,14 @@ +//! Source directory: `sysdeps/unix/sysv/linux/bits/types` +//! +//! + +#[cfg_attr( + any(target_arch = "mips", target_arch = "mips64"), + path = "../../mips/bits/siginfo_arch.rs" +)] +#[cfg_attr( + any(target_arch = "sparc", target_arch = "sparc64"), + path = "../../sparc/bits/siginfo_arch.rs" +)] +#[cfg_attr(target_arch = "x86", path = "../../x86/bits/siginfo_arch.rs")] +mod siginfo_t; diff --git a/src/new/glibc/sysdeps/unix/linux/bits/types/siginfo_t.rs b/src/new/glibc/sysdeps/unix/linux/bits/types/siginfo_t.rs new file mode 100644 index 000000000000..7df4514eae62 --- /dev/null +++ b/src/new/glibc/sysdeps/unix/linux/bits/types/siginfo_t.rs @@ -0,0 +1,214 @@ +//! Source header: `sysdeps/unix/sysv/linux/bits/types/siginfo_t.h` +//! +//! This mirrors one-to-one the generic definition. See the `#[path]` redirects +//! in the `super` module for the architecture-specific definitions. Unlike +//! upstream, they override this entire module, and not just specific fields of +//! `siginfo_t`. +//! +//! + +use crate::prelude::*; + +const __SI_MAX_SIZE: usize = 128; +const __SI_PAD_SIZE: usize = if cfg!(target_pointer_width = "64") { + __SI_MAX_SIZE / size_of::() - 4 +} else { + __SI_MAX_SIZE / size_of::() - 3 +}; + +s_no_extra_traits! { + pub struct siginfo_t { + pub si_signo: c_int, + pub si_errno: c_int, + pub si_code: c_int, + #[cfg(target_pointer_width = "64")] + __pad0: Padding, + _sifields: __c_anonymous_siginfo_t__si_fields, + } + + union __c_anonymous_siginfo_t__si_fields { + _pad: [c_int; __SI_PAD_SIZE], + _kill: __c_anonymous__si_fields__kill, + _timer: __c_anonymous__si_fields__timer, + _rt: __c_anonymous__si_fields__rt, + _sigchld: __c_anonymous__si_fields__sigchld, + _sigfault: __c_anonymous__si_fields__sigfault, + _sigpoll: __c_anonymous__si_fields__sigpoll, + _sigsys: __c_anonymous__si_fields__sigsys, + } + + struct __c_anonymous__si_fields__kill { + si_pid: crate::pid_t, + si_uid: crate::uid_t, + } + + struct __c_anonymous__si_fields__timer { + si_tid: c_int, + si_overrun: c_int, + si_sigval: crate::sigval, + } + + struct __c_anonymous__si_fields__rt { + si_pid: crate::pid_t, + si_uid: crate::uid_t, + si_sigval: crate::sigval, + } + + struct __c_anonymous__si_fields__sigchld { + si_pid: crate::pid_t, + si_uid: crate::uid_t, + si_status: c_int, + si_utime: crate::clock_t, + si_stime: crate::clock_t, + } + + struct __c_anonymous__si_fields__sigfault { + si_addr: *mut c_void, + si_addr_lsb: c_short, + _bounds: __c_anonymous__sigfault__bounds, + } + + struct __c_anonymous__si_fields__sigpoll { + si_band: c_long, + si_fd: c_int, + } + + struct __c_anonymous__si_fields__sigsys { + _call_addr: *mut c_void, + _syscall: c_int, + _arch: c_uint, + } + + union __c_anonymous__sigfault__bounds { + _addr_bnd: __c_anonymous__bounds__addr_bnd, + _pkey: u32, + } + + struct __c_anonymous__bounds__addr_bnd { + _lower: *mut c_void, + _upper: *mut c_void, + } +} + +impl siginfo_t { + #[inline] + pub unsafe fn si_pid(&self) -> crate::pid_t { + unsafe { self._sifields._kill.si_pid } + } + + #[inline] + pub unsafe fn si_uid(&self) -> crate::uid_t { + unsafe { self._sifields._kill.si_uid } + } + + #[inline] + pub unsafe fn si_timerid(&self) -> c_int { + unsafe { self._sifields._timer.si_tid } + } + + #[inline] + pub unsafe fn si_overrun(&self) -> c_int { + unsafe { self._sifields._timer.si_overrun } + } + + #[inline] + pub unsafe fn si_status(&self) -> c_int { + unsafe { self._sifields._sigchld.si_status } + } + + #[inline] + pub unsafe fn si_utime(&self) -> crate::clock_t { + unsafe { self._sifields._sigchld.si_utime } + } + + #[inline] + pub unsafe fn si_stime(&self) -> crate::clock_t { + unsafe { self._sifields._sigchld.si_stime } + } + + #[inline] + pub unsafe fn si_value(&self) -> crate::sigval { + unsafe { self._sifields._rt.si_sigval } + } + + #[inline] + pub unsafe fn si_int(&self) -> c_int { + unsafe { self._sifields._rt.si_sigval.sival_int } + } + + #[inline] + pub unsafe fn si_ptr(&self) -> *mut c_void { + unsafe { self._sifields._rt.si_sigval.sival_ptr } + } + + #[inline] + pub unsafe fn si_addr(&self) -> *mut c_void { + unsafe { self._sifields._sigfault.si_addr } + } + + #[inline] + pub unsafe fn si_addr_lsb(&self) -> c_short { + unsafe { self._sifields._sigfault.si_addr_lsb } + } + + #[inline] + pub unsafe fn si_lower(&self) -> *mut c_void { + unsafe { self._sifields._sigfault._bounds._addr_bnd._lower } + } + + #[inline] + pub unsafe fn si_upper(&self) -> *mut c_void { + unsafe { self._sifields._sigfault._bounds._addr_bnd._upper } + } + + #[inline] + pub unsafe fn si_pkey(&self) -> u32 { + unsafe { self._sifields._sigfault._bounds._pkey } + } + + #[inline] + pub unsafe fn si_band(&self) -> c_long { + unsafe { self._sifields._sigpoll.si_band } + } + + #[inline] + pub unsafe fn si_fd(&self) -> c_int { + unsafe { self._sifields._sigpoll.si_fd } + } + + #[inline] + pub unsafe fn si_call_addr(&self) -> *mut c_void { + unsafe { self._sifields._sigsys._call_addr } + } + + #[inline] + pub unsafe fn si_syscall(&self) -> c_int { + unsafe { self._sifields._sigsys._syscall } + } + + #[inline] + pub unsafe fn si_arch(&self) -> c_uint { + unsafe { self._sifields._sigsys._arch } + } +} + +cfg_if! { + if #[cfg(feature = "extra_traits")] { + impl PartialEq for siginfo_t { + fn eq(&self, other: &Self) -> bool { + (self.si_signo, self.si_errno, self.si_code) + == (other.si_signo, other.si_errno, other.si_code) + } + } + + impl Eq for siginfo_t {} + + impl core::hash::Hash for siginfo_t { + fn hash(&self, state: &mut H) { + self.si_signo.hash(state); + self.si_errno.hash(state); + self.si_code.hash(state); + } + } + } +} diff --git a/src/new/glibc/sysdeps/unix/linux/mips/bits/siginfo_arch.rs b/src/new/glibc/sysdeps/unix/linux/mips/bits/siginfo_arch.rs new file mode 100644 index 000000000000..f853735a6cd0 --- /dev/null +++ b/src/new/glibc/sysdeps/unix/linux/mips/bits/siginfo_arch.rs @@ -0,0 +1,209 @@ +//! Header source: `sysdeps/unix/sysv/linux/mips/bits/siginfo-arch.h` +//! +//! + +use crate::prelude::*; + +const __SI_MAX_SIZE: usize = 128; +const __SI_PAD_SIZE: usize = if cfg!(target_pointer_width = "64") { + __SI_MAX_SIZE / size_of::() - 4 +} else { + __SI_MAX_SIZE / size_of::() - 3 +}; + +s_no_extra_traits! { + pub struct siginfo_t { + pub si_signo: c_int, + pub si_code: c_int, + pub si_errno: c_int, + #[cfg(target_pointer_width = "64")] + __pad0: Padding, + _sifields: __c_anonymous_siginfo_t__si_fields, + } + + union __c_anonymous_siginfo_t__si_fields { + _pad: [c_int; __SI_PAD_SIZE], + _kill: __c_anonymous__si_fields__kill, + _timer: __c_anonymous__si_fields__timer, + _rt: __c_anonymous__si_fields__rt, + _sigchld: __c_anonymous__si_fields__sigchld, + _sigfault: __c_anonymous__si_fields__sigfault, + _sigpoll: __c_anonymous__si_fields__sigpoll, + _sigsys: __c_anonymous__si_fields__sigsys, + } + + struct __c_anonymous__si_fields__kill { + si_pid: crate::pid_t, + si_uid: crate::uid_t, + } + + struct __c_anonymous__si_fields__timer { + si_tid: c_int, + si_overrun: c_int, + si_sigval: crate::sigval, + } + + struct __c_anonymous__si_fields__rt { + si_pid: crate::pid_t, + si_uid: crate::uid_t, + si_sigval: crate::sigval, + } + + struct __c_anonymous__si_fields__sigchld { + si_pid: crate::pid_t, + si_uid: crate::uid_t, + si_status: c_int, + si_utime: crate::clock_t, + si_stime: crate::clock_t, + } + + struct __c_anonymous__si_fields__sigfault { + si_addr: *mut c_void, + si_addr_lsb: c_short, + _bounds: __c_anonymous__sigfault__bounds, + } + + struct __c_anonymous__si_fields__sigpoll { + si_band: c_long, + si_fd: c_int, + } + + struct __c_anonymous__si_fields__sigsys { + _call_addr: *mut c_void, + _syscall: c_int, + _arch: c_uint, + } + + union __c_anonymous__sigfault__bounds { + _addr_bnd: __c_anonymous__bounds__addr_bnd, + _pkey: u32, + } + + struct __c_anonymous__bounds__addr_bnd { + _lower: *mut c_void, + _upper: *mut c_void, + } +} + +cfg_if! { + if #[cfg(feature = "extra_traits")] { + impl PartialEq for siginfo_t { + fn eq(&self, other: &Self) -> bool { + (self.si_signo, self.si_errno, self.si_code) + == (other.si_signo, other.si_errno, other.si_code) + } + } + + impl Eq for siginfo_t {} + + impl core::hash::Hash for siginfo_t { + fn hash(&self, state: &mut H) { + self.si_signo.hash(state); + self.si_errno.hash(state); + self.si_code.hash(state); + } + } + } +} + +impl siginfo_t { + #[inline] + pub unsafe fn si_pid(&self) -> crate::pid_t { + unsafe { self._sifields._kill.si_pid } + } + + #[inline] + pub unsafe fn si_uid(&self) -> crate::uid_t { + unsafe { self._sifields._kill.si_uid } + } + + #[inline] + pub unsafe fn si_timerid(&self) -> c_int { + unsafe { self._sifields._timer.si_tid } + } + + #[inline] + pub unsafe fn si_overrun(&self) -> c_int { + unsafe { self._sifields._timer.si_overrun } + } + + #[inline] + pub unsafe fn si_status(&self) -> c_int { + unsafe { self._sifields._sigchld.si_status } + } + + #[inline] + pub unsafe fn si_utime(&self) -> crate::clock_t { + unsafe { self._sifields._sigchld.si_utime } + } + + #[inline] + pub unsafe fn si_stime(&self) -> crate::clock_t { + unsafe { self._sifields._sigchld.si_stime } + } + + #[inline] + pub unsafe fn si_value(&self) -> crate::sigval { + unsafe { self._sifields._rt.si_sigval } + } + + #[inline] + pub unsafe fn si_int(&self) -> c_int { + unsafe { self._sifields._rt.si_sigval.sival_int } + } + + #[inline] + pub unsafe fn si_ptr(&self) -> *mut c_void { + unsafe { self._sifields._rt.si_sigval.sival_ptr } + } + + #[inline] + pub unsafe fn si_addr(&self) -> *mut c_void { + unsafe { self._sifields._sigfault.si_addr } + } + + #[inline] + pub unsafe fn si_addr_lsb(&self) -> c_short { + unsafe { self._sifields._sigfault.si_addr_lsb } + } + + #[inline] + pub unsafe fn si_lower(&self) -> *mut c_void { + unsafe { self._sifields._sigfault._bounds._addr_bnd._lower } + } + + #[inline] + pub unsafe fn si_upper(&self) -> *mut c_void { + unsafe { self._sifields._sigfault._bounds._addr_bnd._upper } + } + + #[inline] + pub unsafe fn si_pkey(&self) -> u32 { + unsafe { self._sifields._sigfault._bounds._pkey } + } + + #[inline] + pub unsafe fn si_band(&self) -> c_long { + unsafe { self._sifields._sigpoll.si_band } + } + + #[inline] + pub unsafe fn si_fd(&self) -> c_int { + unsafe { self._sifields._sigpoll.si_fd } + } + + #[inline] + pub unsafe fn si_call_addr(&self) -> *mut c_void { + unsafe { self._sifields._sigsys._call_addr } + } + + #[inline] + pub unsafe fn si_syscall(&self) -> c_int { + unsafe { self._sifields._sigsys._syscall } + } + + #[inline] + pub unsafe fn si_arch(&self) -> c_uint { + unsafe { self._sifields._sigsys._arch } + } +} diff --git a/src/new/glibc/sysdeps/unix/linux/mips/mod.rs b/src/new/glibc/sysdeps/unix/linux/mips/mod.rs new file mode 100644 index 000000000000..a96d840f6e22 --- /dev/null +++ b/src/new/glibc/sysdeps/unix/linux/mips/mod.rs @@ -0,0 +1,10 @@ +//! Directory source: `sysdeps/unix/sysv/linux/mips` +//! +//! + +/// Directory source: `sysdeps/unix/sysv/linux/mips/bits` +/// +/// +pub(crate) mod bits { + pub(crate) mod siginfo_arch; +} diff --git a/src/new/glibc/sysdeps/unix/linux/mod.rs b/src/new/glibc/sysdeps/unix/linux/mod.rs index 9a50741ff00a..fd331f031225 100644 --- a/src/new/glibc/sysdeps/unix/linux/mod.rs +++ b/src/new/glibc/sysdeps/unix/linux/mod.rs @@ -33,6 +33,8 @@ pub(crate) mod bits { path = "../sparc/bits/signum_arch.rs" )] pub(crate) mod signum_arch; + + pub(crate) mod types; } /// Directory: `net/` diff --git a/src/new/glibc/sysdeps/unix/linux/sparc/bits/siginfo_arch.rs b/src/new/glibc/sysdeps/unix/linux/sparc/bits/siginfo_arch.rs new file mode 100644 index 000000000000..f8dbeed20cd0 --- /dev/null +++ b/src/new/glibc/sysdeps/unix/linux/sparc/bits/siginfo_arch.rs @@ -0,0 +1,225 @@ +//! Header source: `sysdeps/unix/sysv/linux/sparc/bits/siginfo-arch.h` +//! +//! + +use crate::prelude::*; + +const __SI_MAX_SIZE: usize = 128; +const __SI_PAD_SIZE: usize = if cfg!(target_pointer_width = "64") { + __SI_MAX_SIZE / size_of::() - 4 +} else { + __SI_MAX_SIZE / size_of::() - 3 +}; + +s_no_extra_traits! { + pub struct siginfo_t { + pub si_signo: c_int, + pub si_errno: c_int, + pub si_code: c_int, + #[cfg(target_pointer_width = "64")] + __pad0: Padding, + _sifields: __c_anonymous_siginfo_t__si_fields, + } + + union __c_anonymous_siginfo_t__si_fields { + _pad: [c_int; __SI_PAD_SIZE], + _kill: __c_anonymous__si_fields__kill, + _timer: __c_anonymous__si_fields__timer, + _rt: __c_anonymous__si_fields__rt, + _sigchld: __c_anonymous__si_fields__sigchld, + _sigfault: __c_anonymous__si_fields__sigfault, + _sigpoll: __c_anonymous__si_fields__sigpoll, + _sigsys: __c_anonymous__si_fields__sigsys, + } + + struct __c_anonymous__si_fields__kill { + si_pid: crate::pid_t, + si_uid: crate::uid_t, + } + + struct __c_anonymous__si_fields__timer { + si_tid: c_int, + si_overrun: c_int, + si_sigval: crate::sigval, + } + + struct __c_anonymous__si_fields__rt { + si_pid: crate::pid_t, + si_uid: crate::uid_t, + si_sigval: crate::sigval, + } + + struct __c_anonymous__si_fields__sigchld { + si_pid: crate::pid_t, + si_uid: crate::uid_t, + si_status: c_int, + si_utime: crate::clock_t, + si_stime: crate::clock_t, + } + + struct __c_anonymous__si_fields__sigfault { + si_addr: *mut c_void, + _si_trapno: c_int, + si_addr_lsb: c_short, + _bounds: __c_anonymous__sigfault__bounds, + } + + struct __c_anonymous__si_fields__sigpoll { + #[cfg(target_pointer_width = "64")] + si_band: c_int, + #[cfg(not(target_pointer_width = "64"))] + si_band: c_long, + si_fd: c_int, + } + + struct __c_anonymous__si_fields__sigsys { + _call_addr: *mut c_void, + _syscall: c_int, + _arch: c_uint, + } + + union __c_anonymous__sigfault__bounds { + _addr_bnd: __c_anonymous__bounds__addr_bnd, + _pkey: u32, + } + + struct __c_anonymous__bounds__addr_bnd { + _lower: *mut c_void, + _upper: *mut c_void, + } +} + +cfg_if! { + if #[cfg(feature = "extra_traits")] { + impl PartialEq for siginfo_t { + fn eq(&self, other: &Self) -> bool { + (self.si_signo, self.si_errno, self.si_code) + == (other.si_signo, other.si_errno, other.si_code) + } + } + + impl Eq for siginfo_t {} + + impl core::hash::Hash for siginfo_t { + fn hash(&self, state: &mut H) { + self.si_signo.hash(state); + self.si_errno.hash(state); + self.si_code.hash(state); + } + } + } +} + +impl siginfo_t { + #[inline] + pub unsafe fn si_pid(&self) -> crate::pid_t { + unsafe { self._sifields._kill.si_pid } + } + + #[inline] + pub unsafe fn si_uid(&self) -> crate::uid_t { + unsafe { self._sifields._kill.si_uid } + } + + #[inline] + pub unsafe fn si_timerid(&self) -> c_int { + unsafe { self._sifields._timer.si_tid } + } + + #[inline] + pub unsafe fn si_overrun(&self) -> c_int { + unsafe { self._sifields._timer.si_overrun } + } + + #[inline] + pub unsafe fn si_status(&self) -> c_int { + unsafe { self._sifields._sigchld.si_status } + } + + #[inline] + pub unsafe fn si_utime(&self) -> crate::clock_t { + unsafe { self._sifields._sigchld.si_utime } + } + + #[inline] + pub unsafe fn si_stime(&self) -> crate::clock_t { + unsafe { self._sifields._sigchld.si_stime } + } + + #[inline] + pub unsafe fn si_value(&self) -> crate::sigval { + unsafe { self._sifields._rt.si_sigval } + } + + #[inline] + pub unsafe fn si_int(&self) -> c_int { + unsafe { self._sifields._rt.si_sigval.sival_int } + } + + #[inline] + pub unsafe fn si_ptr(&self) -> *mut c_void { + unsafe { self._sifields._rt.si_sigval.sival_ptr } + } + + #[inline] + pub unsafe fn si_addr(&self) -> *mut c_void { + unsafe { self._sifields._sigfault.si_addr } + } + + #[inline] + pub unsafe fn si_trapno(&self) -> c_int { + unsafe { self._sifields._sigfault._si_trapno } + } + + #[inline] + pub unsafe fn si_addr_lsb(&self) -> c_short { + unsafe { self._sifields._sigfault.si_addr_lsb } + } + + #[inline] + pub unsafe fn si_lower(&self) -> *mut c_void { + unsafe { self._sifields._sigfault._bounds._addr_bnd._lower } + } + + #[inline] + pub unsafe fn si_upper(&self) -> *mut c_void { + unsafe { self._sifields._sigfault._bounds._addr_bnd._upper } + } + + #[inline] + pub unsafe fn si_pkey(&self) -> u32 { + unsafe { self._sifields._sigfault._bounds._pkey } + } + + #[cfg(target_pointer_width = "64")] + #[inline] + pub unsafe fn si_band(&self) -> c_int { + unsafe { self._sifields._sigpoll.si_band } + } + + #[cfg(not(target_pointer_width = "64"))] + #[inline] + pub unsafe fn si_band(&self) -> c_long { + unsafe { self._sifields._sigpoll.si_band } + } + + #[inline] + pub unsafe fn si_fd(&self) -> c_int { + unsafe { self._sifields._sigpoll.si_fd } + } + + #[inline] + pub unsafe fn si_call_addr(&self) -> *mut c_void { + unsafe { self._sifields._sigsys._call_addr } + } + + #[inline] + pub unsafe fn si_syscall(&self) -> c_int { + unsafe { self._sifields._sigsys._syscall } + } + + #[inline] + pub unsafe fn si_arch(&self) -> c_uint { + unsafe { self._sifields._sigsys._arch } + } +} diff --git a/src/new/glibc/sysdeps/unix/linux/sparc/mod.rs b/src/new/glibc/sysdeps/unix/linux/sparc/mod.rs new file mode 100644 index 000000000000..d3ea74d80ecb --- /dev/null +++ b/src/new/glibc/sysdeps/unix/linux/sparc/mod.rs @@ -0,0 +1,10 @@ +//! Directory source: `sysdeps/unix/sysv/linux/sparc` +//! +//! + +/// Directory source: `sysdeps/unix/sysv/linux/sparc/bits` +/// +/// +pub(crate) mod bits { + pub(crate) mod siginfo_arch; +} diff --git a/src/new/glibc/sysdeps/unix/linux/x86/bits/siginfo_arch.rs b/src/new/glibc/sysdeps/unix/linux/x86/bits/siginfo_arch.rs new file mode 100644 index 000000000000..ec9e04e050ea --- /dev/null +++ b/src/new/glibc/sysdeps/unix/linux/x86/bits/siginfo_arch.rs @@ -0,0 +1,209 @@ +//! Header source: `sysdeps/unix/sysv/linux/x86/bits/siginfo-arch.h` +//! +//! + +use crate::prelude::*; + +const __SI_MAX_SIZE: usize = 128; +const __SI_PAD_SIZE: usize = if cfg!(target_pointer_width = "64") { + __SI_MAX_SIZE / size_of::() - 4 +} else { + __SI_MAX_SIZE / size_of::() - 3 +}; + +s_no_extra_traits! { + pub struct siginfo_t { + pub si_signo: c_int, + pub si_errno: c_int, + pub si_code: c_int, + #[cfg(target_pointer_width = "64")] + __pad0: Padding, + _sifields: __c_anonymous_siginfo_t__si_fields, + } + + union __c_anonymous_siginfo_t__si_fields { + _pad: [c_int; __SI_PAD_SIZE], + _kill: __c_anonymous__si_fields__kill, + _timer: __c_anonymous__si_fields__timer, + _rt: __c_anonymous__si_fields__rt, + _sigchld: __c_anonymous__si_fields__sigchld, + _sigfault: __c_anonymous__si_fields__sigfault, + _sigpoll: __c_anonymous__si_fields__sigpoll, + _sigsys: __c_anonymous__si_fields__sigsys, + } + + struct __c_anonymous__si_fields__kill { + si_pid: crate::pid_t, + si_uid: crate::uid_t, + } + + struct __c_anonymous__si_fields__timer { + si_tid: c_int, + si_overrun: c_int, + si_sigval: crate::sigval, + } + + struct __c_anonymous__si_fields__rt { + si_pid: crate::pid_t, + si_uid: crate::uid_t, + si_sigval: crate::sigval, + } + + struct __c_anonymous__si_fields__sigchld { + si_pid: crate::pid_t, + si_uid: crate::uid_t, + si_status: c_int, + si_utime: crate::clock_t, + si_stime: crate::clock_t, + } + + struct __c_anonymous__si_fields__sigfault { + si_addr: *mut c_void, + si_addr_lsb: c_short, + _bounds: __c_anonymous__sigfault__bounds, + } + + struct __c_anonymous__si_fields__sigpoll { + si_band: c_long, + si_fd: c_int, + } + + struct __c_anonymous__si_fields__sigsys { + _call_addr: *mut c_void, + _syscall: c_int, + _arch: c_uint, + } + + union __c_anonymous__sigfault__bounds { + _addr_bnd: __c_anonymous__bounds__addr_bnd, + _pkey: u32, + } + + struct __c_anonymous__bounds__addr_bnd { + _lower: *mut c_void, + _upper: *mut c_void, + } +} + +cfg_if! { + if #[cfg(feature = "extra_traits")] { + impl PartialEq for siginfo_t { + fn eq(&self, other: &Self) -> bool { + (self.si_signo, self.si_errno, self.si_code) + == (other.si_signo, other.si_errno, other.si_code) + } + } + + impl Eq for siginfo_t {} + + impl core::hash::Hash for siginfo_t { + fn hash(&self, state: &mut H) { + self.si_signo.hash(state); + self.si_errno.hash(state); + self.si_code.hash(state); + } + } + } +} + +impl siginfo_t { + #[inline] + pub unsafe fn si_pid(&self) -> crate::pid_t { + unsafe { self._sifields._kill.si_pid } + } + + #[inline] + pub unsafe fn si_uid(&self) -> crate::uid_t { + unsafe { self._sifields._kill.si_uid } + } + + #[inline] + pub unsafe fn si_timerid(&self) -> c_int { + unsafe { self._sifields._timer.si_tid } + } + + #[inline] + pub unsafe fn si_overrun(&self) -> c_int { + unsafe { self._sifields._timer.si_overrun } + } + + #[inline] + pub unsafe fn si_status(&self) -> c_int { + unsafe { self._sifields._sigchld.si_status } + } + + #[inline] + pub unsafe fn si_utime(&self) -> crate::clock_t { + unsafe { self._sifields._sigchld.si_utime } + } + + #[inline] + pub unsafe fn si_stime(&self) -> crate::clock_t { + unsafe { self._sifields._sigchld.si_stime } + } + + #[inline] + pub unsafe fn si_value(&self) -> crate::sigval { + unsafe { self._sifields._rt.si_sigval } + } + + #[inline] + pub unsafe fn si_int(&self) -> c_int { + unsafe { self._sifields._rt.si_sigval.sival_int } + } + + #[inline] + pub unsafe fn si_ptr(&self) -> *mut c_void { + unsafe { self._sifields._rt.si_sigval.sival_ptr } + } + + #[inline] + pub unsafe fn si_addr(&self) -> *mut c_void { + unsafe { self._sifields._sigfault.si_addr } + } + + #[inline] + pub unsafe fn si_addr_lsb(&self) -> c_short { + unsafe { self._sifields._sigfault.si_addr_lsb } + } + + #[inline] + pub unsafe fn si_lower(&self) -> *mut c_void { + unsafe { self._sifields._sigfault._bounds._addr_bnd._lower } + } + + #[inline] + pub unsafe fn si_upper(&self) -> *mut c_void { + unsafe { self._sifields._sigfault._bounds._addr_bnd._upper } + } + + #[inline] + pub unsafe fn si_pkey(&self) -> u32 { + unsafe { self._sifields._sigfault._bounds._pkey } + } + + #[inline] + pub unsafe fn si_band(&self) -> c_long { + unsafe { self._sifields._sigpoll.si_band } + } + + #[inline] + pub unsafe fn si_fd(&self) -> c_int { + unsafe { self._sifields._sigpoll.si_fd } + } + + #[inline] + pub unsafe fn si_call_addr(&self) -> *mut c_void { + unsafe { self._sifields._sigsys._call_addr } + } + + #[inline] + pub unsafe fn si_syscall(&self) -> c_int { + unsafe { self._sifields._sigsys._syscall } + } + + #[inline] + pub unsafe fn si_arch(&self) -> c_uint { + unsafe { self._sifields._sigsys._arch } + } +} diff --git a/src/new/glibc/sysdeps/unix/linux/x86/mod.rs b/src/new/glibc/sysdeps/unix/linux/x86/mod.rs new file mode 100644 index 000000000000..2c6b85932077 --- /dev/null +++ b/src/new/glibc/sysdeps/unix/linux/x86/mod.rs @@ -0,0 +1,10 @@ +//! Directory source: `sysdeps/unix/sysv/linux/x86` +//! +//! + +/// Directory source: `sysdeps/unix/sysv/linux/x86/bits` +/// +/// +pub(crate) mod bits { + pub(crate) mod siginfo_arch; +} From 40d4648aa0174d72765d42b9bb86041272273f11 Mon Sep 17 00:00:00 2001 From: Adam Martinez <149513579+dybucc@users.noreply.github.com> Date: Wed, 5 Aug 2026 18:37:44 +0200 Subject: [PATCH 3/7] linux(gnu): replace older `siginfo_t` bindings Remove older bindings to `siginfo_t` using dummy fields instead of the upstream `union`. This follows from the patch providing a full definition for glibc bindings. Add reexports for `siginfo_t` under the `new` module. This has required renaming the reexport for the `nptl` module as it also contains a `bits` module of the same name as the `bits::types::siginfo_t` module path under `sysdeps`. --- src/new/glibc/mod.rs | 11 ++- .../sysdeps/unix/linux/bits/types/mod.rs | 2 +- src/new/mod.rs | 9 ++- src/unix/linux_like/linux/gnu/b32/arm/mod.rs | 15 ---- src/unix/linux_like/linux/gnu/b32/csky/mod.rs | 15 ---- src/unix/linux_like/linux/gnu/b32/m68k/mod.rs | 8 -- src/unix/linux_like/linux/gnu/b32/mips/mod.rs | 7 -- src/unix/linux_like/linux/gnu/b32/powerpc.rs | 15 ---- .../linux_like/linux/gnu/b32/riscv32/mod.rs | 15 ---- .../linux_like/linux/gnu/b32/sparc/mod.rs | 8 -- src/unix/linux_like/linux/gnu/b32/x86/mod.rs | 15 ---- .../linux_like/linux/gnu/b64/aarch64/mod.rs | 15 ---- .../linux/gnu/b64/loongarch64/mod.rs | 15 ---- .../linux_like/linux/gnu/b64/mips64/mod.rs | 8 -- .../linux_like/linux/gnu/b64/powerpc64/mod.rs | 15 ---- .../linux_like/linux/gnu/b64/riscv64/mod.rs | 15 ---- src/unix/linux_like/linux/gnu/b64/s390x.rs | 8 -- .../linux_like/linux/gnu/b64/sparc64/mod.rs | 15 ---- .../linux_like/linux/gnu/b64/x86_64/mod.rs | 15 ---- src/unix/linux_like/linux/gnu/mod.rs | 75 ------------------- 20 files changed, 16 insertions(+), 285 deletions(-) diff --git a/src/new/glibc/mod.rs b/src/new/glibc/mod.rs index c96aec8df79d..00e59ca177aa 100644 --- a/src/new/glibc/mod.rs +++ b/src/new/glibc/mod.rs @@ -40,6 +40,13 @@ mod sysdeps { pub(crate) use posix::*; // FIXME(pthread): eventually all platforms should use this module #[cfg(target_os = "linux")] -pub(crate) use sysdeps::nptl::*; +#[allow(unused)] +pub(crate) use sysdeps::nptl::{ + bits as nptl_bits, + pthread, +}; #[cfg(target_os = "linux")] -pub(crate) use sysdeps::unix::linux::*; +pub(crate) use sysdeps::unix::linux::{ + bits as linux_bits, + net, +}; diff --git a/src/new/glibc/sysdeps/unix/linux/bits/types/mod.rs b/src/new/glibc/sysdeps/unix/linux/bits/types/mod.rs index 698e4cfbb994..9bd0dae5fd7d 100644 --- a/src/new/glibc/sysdeps/unix/linux/bits/types/mod.rs +++ b/src/new/glibc/sysdeps/unix/linux/bits/types/mod.rs @@ -11,4 +11,4 @@ path = "../../sparc/bits/siginfo_arch.rs" )] #[cfg_attr(target_arch = "x86", path = "../../x86/bits/siginfo_arch.rs")] -mod siginfo_t; +pub(crate) mod siginfo_t; diff --git a/src/new/mod.rs b/src/new/mod.rs index 06e27f2ad0fa..370858f1e5e7 100644 --- a/src/new/mod.rs +++ b/src/new/mod.rs @@ -194,10 +194,13 @@ cfg_if! { pub use linux::sctp::*; pub use linux::tls::*; pub use linux::types::*; + #[cfg(target_env = "gnu")] - pub use net::route::*; - #[cfg(target_env = "gnu")] - pub use signal::*; + pub use self::{ + linux_bits::types::siginfo_t::*, + net::route::*, + signal::*, + }; } else if #[cfg(target_vendor = "apple")] { pub use net::bpf::*; pub use netinet::tcp::*; diff --git a/src/unix/linux_like/linux/gnu/b32/arm/mod.rs b/src/unix/linux_like/linux/gnu/b32/arm/mod.rs index 5b5cfeca2227..e530cf0bd5c8 100644 --- a/src/unix/linux_like/linux/gnu/b32/arm/mod.rs +++ b/src/unix/linux_like/linux/gnu/b32/arm/mod.rs @@ -158,21 +158,6 @@ s! { __glibc_reserved5: Padding, } - pub struct siginfo_t { - pub si_signo: c_int, - pub si_errno: c_int, - pub si_code: c_int, - #[doc(hidden)] - #[deprecated( - since = "0.2.54", - note = "Please leave a comment on \ - https://github.com/rust-lang/libc/pull/1316 if you're using \ - this field" - )] - pub _pad: [c_int; 29], - _align: [usize; 0], - } - pub struct stack_t { pub ss_sp: *mut c_void, pub ss_flags: c_int, diff --git a/src/unix/linux_like/linux/gnu/b32/csky/mod.rs b/src/unix/linux_like/linux/gnu/b32/csky/mod.rs index b0afd5733399..d6fb6e933ac4 100644 --- a/src/unix/linux_like/linux/gnu/b32/csky/mod.rs +++ b/src/unix/linux_like/linux/gnu/b32/csky/mod.rs @@ -139,21 +139,6 @@ s! { __glibc_reserved5: Padding, } - pub struct siginfo_t { - pub si_signo: c_int, - pub si_errno: c_int, - pub si_code: c_int, - #[doc(hidden)] - #[deprecated( - since = "0.2.54", - note = "Please leave a comment on \ - https://github.com/rust-lang/libc/pull/1316 if you're using \ - this field" - )] - pub _pad: [c_int; 29], - _align: [usize; 0], - } - pub struct stack_t { pub ss_sp: *mut c_void, pub ss_flags: c_int, diff --git a/src/unix/linux_like/linux/gnu/b32/m68k/mod.rs b/src/unix/linux_like/linux/gnu/b32/m68k/mod.rs index f3940f4be51c..ec163cea5d92 100644 --- a/src/unix/linux_like/linux/gnu/b32/m68k/mod.rs +++ b/src/unix/linux_like/linux/gnu/b32/m68k/mod.rs @@ -139,14 +139,6 @@ s! { __glibc_reserved5: Padding, } - pub struct siginfo_t { - pub si_signo: c_int, - pub si_code: c_int, - pub si_errno: c_int, - _pad: Padding<[c_int; 29]>, - _align: [usize; 0], - } - pub struct stack_t { pub ss_sp: *mut c_void, pub ss_flags: c_int, diff --git a/src/unix/linux_like/linux/gnu/b32/mips/mod.rs b/src/unix/linux_like/linux/gnu/b32/mips/mod.rs index b05ae5c2ebbf..024289d26126 100644 --- a/src/unix/linux_like/linux/gnu/b32/mips/mod.rs +++ b/src/unix/linux_like/linux/gnu/b32/mips/mod.rs @@ -172,13 +172,6 @@ s! { pub ss_flags: c_int, } - pub struct siginfo_t { - pub si_signo: c_int, - pub si_code: c_int, - pub si_errno: c_int, - pub _pad: [c_int; 29], - } - pub struct ipc_perm { pub __key: crate::key_t, pub uid: crate::uid_t, diff --git a/src/unix/linux_like/linux/gnu/b32/powerpc.rs b/src/unix/linux_like/linux/gnu/b32/powerpc.rs index b63be98ecaeb..ac2def75a698 100644 --- a/src/unix/linux_like/linux/gnu/b32/powerpc.rs +++ b/src/unix/linux_like/linux/gnu/b32/powerpc.rs @@ -192,21 +192,6 @@ s! { __glibc_reserved5: Padding, } - pub struct siginfo_t { - pub si_signo: c_int, - pub si_errno: c_int, - pub si_code: c_int, - #[doc(hidden)] - #[deprecated( - since = "0.2.54", - note = "Please leave a comment on \ - https://github.com/rust-lang/libc/pull/1316 if you're using \ - this field" - )] - pub _pad: [c_int; 29], - _align: [usize; 0], - } - pub struct stack_t { pub ss_sp: *mut c_void, pub ss_flags: c_int, diff --git a/src/unix/linux_like/linux/gnu/b32/riscv32/mod.rs b/src/unix/linux_like/linux/gnu/b32/riscv32/mod.rs index 8a9c597ea060..a21c1118789d 100644 --- a/src/unix/linux_like/linux/gnu/b32/riscv32/mod.rs +++ b/src/unix/linux_like/linux/gnu/b32/riscv32/mod.rs @@ -90,21 +90,6 @@ s! { pub __f_spare: [c_int; 6], } - pub struct siginfo_t { - pub si_signo: c_int, - pub si_errno: c_int, - pub si_code: c_int, - #[doc(hidden)] - #[deprecated( - since = "0.2.54", - note = "Please leave a comment on \ - https://github.com/rust-lang/libc/pull/1316 if you're using \ - this field" - )] - pub _pad: [c_int; 29], - _align: [u64; 0], - } - pub struct stack_t { pub ss_sp: *mut c_void, pub ss_flags: c_int, diff --git a/src/unix/linux_like/linux/gnu/b32/sparc/mod.rs b/src/unix/linux_like/linux/gnu/b32/sparc/mod.rs index f29605ba51e2..c0689a618e83 100644 --- a/src/unix/linux_like/linux/gnu/b32/sparc/mod.rs +++ b/src/unix/linux_like/linux/gnu/b32/sparc/mod.rs @@ -26,14 +26,6 @@ s! { f_spare: [crate::__fsword_t; 4], } - pub struct siginfo_t { - pub si_signo: c_int, - pub si_errno: c_int, - pub si_code: c_int, - _pad: Padding<[c_int; 29]>, - _align: [usize; 0], - } - pub struct flock { pub l_type: c_short, pub l_whence: c_short, diff --git a/src/unix/linux_like/linux/gnu/b32/x86/mod.rs b/src/unix/linux_like/linux/gnu/b32/x86/mod.rs index 1bed38e18fcf..16c79f0ba51d 100644 --- a/src/unix/linux_like/linux/gnu/b32/x86/mod.rs +++ b/src/unix/linux_like/linux/gnu/b32/x86/mod.rs @@ -232,21 +232,6 @@ s! { __glibc_reserved5: Padding, } - pub struct siginfo_t { - pub si_signo: c_int, - pub si_errno: c_int, - pub si_code: c_int, - #[doc(hidden)] - #[deprecated( - since = "0.2.54", - note = "Please leave a comment on \ - https://github.com/rust-lang/libc/pull/1316 if you're using \ - this field" - )] - pub _pad: [c_int; 29], - _align: [usize; 0], - } - pub struct stack_t { pub ss_sp: *mut c_void, pub ss_flags: c_int, diff --git a/src/unix/linux_like/linux/gnu/b64/aarch64/mod.rs b/src/unix/linux_like/linux/gnu/b64/aarch64/mod.rs index f863aa435768..b75ec56b59c3 100644 --- a/src/unix/linux_like/linux/gnu/b64/aarch64/mod.rs +++ b/src/unix/linux_like/linux/gnu/b64/aarch64/mod.rs @@ -170,21 +170,6 @@ s! { __unused5: Padding, } - pub struct siginfo_t { - pub si_signo: c_int, - pub si_errno: c_int, - pub si_code: c_int, - #[doc(hidden)] - #[deprecated( - since = "0.2.54", - note = "Please leave a comment on \ - https://github.com/rust-lang/libc/pull/1316 if you're using \ - this field" - )] - pub _pad: [c_int; 29], - _align: [usize; 0], - } - pub struct stack_t { pub ss_sp: *mut c_void, pub ss_flags: c_int, diff --git a/src/unix/linux_like/linux/gnu/b64/loongarch64/mod.rs b/src/unix/linux_like/linux/gnu/b64/loongarch64/mod.rs index add1256ac6d2..8332a1ac47e0 100644 --- a/src/unix/linux_like/linux/gnu/b64/loongarch64/mod.rs +++ b/src/unix/linux_like/linux/gnu/b64/loongarch64/mod.rs @@ -141,21 +141,6 @@ s! { pub ss_size: size_t, } - pub struct siginfo_t { - pub si_signo: c_int, - pub si_errno: c_int, - pub si_code: c_int, - #[doc(hidden)] - #[deprecated( - since = "0.2.54", - note = "Please leave a comment on \ - https://github.com/rust-lang/libc/pull/1316 if you're using \ - this field" - )] - pub _pad: [c_int; 29], - _align: [u64; 0], - } - pub struct ipc_perm { pub __key: crate::key_t, pub uid: crate::uid_t, diff --git a/src/unix/linux_like/linux/gnu/b64/mips64/mod.rs b/src/unix/linux_like/linux/gnu/b64/mips64/mod.rs index df2b8f9745a7..0ebd6cb25666 100644 --- a/src/unix/linux_like/linux/gnu/b64/mips64/mod.rs +++ b/src/unix/linux_like/linux/gnu/b64/mips64/mod.rs @@ -143,14 +143,6 @@ s! { pub ss_flags: c_int, } - pub struct siginfo_t { - pub si_signo: c_int, - pub si_code: c_int, - pub si_errno: c_int, - _pad: Padding, - _pad2: Padding<[c_long; 14]>, - } - pub struct ipc_perm { pub __key: crate::key_t, pub uid: crate::uid_t, diff --git a/src/unix/linux_like/linux/gnu/b64/powerpc64/mod.rs b/src/unix/linux_like/linux/gnu/b64/powerpc64/mod.rs index 0f7e065c8532..67cdea2f3698 100644 --- a/src/unix/linux_like/linux/gnu/b64/powerpc64/mod.rs +++ b/src/unix/linux_like/linux/gnu/b64/powerpc64/mod.rs @@ -163,21 +163,6 @@ s! { __unused5: Padding, } - pub struct siginfo_t { - pub si_signo: c_int, - pub si_errno: c_int, - pub si_code: c_int, - #[doc(hidden)] - #[deprecated( - since = "0.2.54", - note = "Please leave a comment on \ - https://github.com/rust-lang/libc/pull/1316 if you're using \ - this field" - )] - pub _pad: [c_int; 29], - _align: [usize; 0], - } - pub struct stack_t { pub ss_sp: *mut c_void, pub ss_flags: c_int, diff --git a/src/unix/linux_like/linux/gnu/b64/riscv64/mod.rs b/src/unix/linux_like/linux/gnu/b64/riscv64/mod.rs index f473f8c7338c..b7e36b5c478b 100644 --- a/src/unix/linux_like/linux/gnu/b64/riscv64/mod.rs +++ b/src/unix/linux_like/linux/gnu/b64/riscv64/mod.rs @@ -123,21 +123,6 @@ s! { pub __f_spare: [c_int; 6], } - pub struct siginfo_t { - pub si_signo: c_int, - pub si_errno: c_int, - pub si_code: c_int, - #[doc(hidden)] - #[deprecated( - since = "0.2.54", - note = "Please leave a comment on \ - https://github.com/rust-lang/libc/pull/1316 if you're using \ - this field" - )] - pub _pad: [c_int; 29], - _align: [u64; 0], - } - pub struct stack_t { pub ss_sp: *mut c_void, pub ss_flags: c_int, diff --git a/src/unix/linux_like/linux/gnu/b64/s390x.rs b/src/unix/linux_like/linux/gnu/b64/s390x.rs index eae7b7124e6b..fb1cc22e9810 100644 --- a/src/unix/linux_like/linux/gnu/b64/s390x.rs +++ b/src/unix/linux_like/linux/gnu/b64/s390x.rs @@ -44,14 +44,6 @@ s! { pub l_pid: crate::pid_t, } - pub struct siginfo_t { - pub si_signo: c_int, - pub si_errno: c_int, - pub si_code: c_int, - _pad: Padding, - _pad2: Padding<[c_long; 14]>, - } - pub struct stack_t { pub ss_sp: *mut c_void, pub ss_flags: c_int, diff --git a/src/unix/linux_like/linux/gnu/b64/sparc64/mod.rs b/src/unix/linux_like/linux/gnu/b64/sparc64/mod.rs index dcfc7c442fa0..290b1d6b8a9a 100644 --- a/src/unix/linux_like/linux/gnu/b64/sparc64/mod.rs +++ b/src/unix/linux_like/linux/gnu/b64/sparc64/mod.rs @@ -28,21 +28,6 @@ s! { f_spare: [crate::__fsword_t; 5], } - pub struct siginfo_t { - pub si_signo: c_int, - pub si_errno: c_int, - pub si_code: c_int, - #[doc(hidden)] - #[deprecated( - since = "0.2.54", - note = "Please leave a comment on \ - https://github.com/rust-lang/libc/pull/1316 if you're using \ - this field" - )] - pub _pad: [c_int; 29], - _align: [usize; 0], - } - pub struct flock { pub l_type: c_short, pub l_whence: c_short, diff --git a/src/unix/linux_like/linux/gnu/b64/x86_64/mod.rs b/src/unix/linux_like/linux/gnu/b64/x86_64/mod.rs index 98506315c371..d8b1d49c1334 100644 --- a/src/unix/linux_like/linux/gnu/b64/x86_64/mod.rs +++ b/src/unix/linux_like/linux/gnu/b64/x86_64/mod.rs @@ -45,21 +45,6 @@ s! { pub l_pid: crate::pid_t, } - pub struct siginfo_t { - pub si_signo: c_int, - pub si_errno: c_int, - pub si_code: c_int, - #[doc(hidden)] - #[deprecated( - since = "0.2.54", - note = "Please leave a comment on \ - https://github.com/rust-lang/libc/pull/1316 if you're using \ - this field" - )] - pub _pad: [c_int; 29], - _align: [u64; 0], - } - pub struct stack_t { pub ss_sp: *mut c_void, pub ss_flags: c_int, diff --git a/src/unix/linux_like/linux/gnu/mod.rs b/src/unix/linux_like/linux/gnu/mod.rs index a5af6aceaf65..76525ba18505 100644 --- a/src/unix/linux_like/linux/gnu/mod.rs +++ b/src/unix/linux_like/linux/gnu/mod.rs @@ -408,32 +408,6 @@ s! { } } -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).cast::()).si_addr - } - - pub unsafe fn si_value(&self) -> crate::sigval { - #[repr(C)] - struct siginfo_timer { - _si_signo: c_int, - _si_errno: c_int, - _si_code: c_int, - _si_tid: c_int, - _si_overrun: c_int, - si_sigval: crate::sigval, - } - (*(self as *const siginfo_t).cast::()).si_sigval - } -} - s_no_extra_traits! { pub struct aiocb { pub aio_fildes: c_int, @@ -466,55 +440,6 @@ s_no_extra_traits! { pub h_source: [c_uchar; crate::ETH_ALEN as usize], pub h_proto: crate::__be16, } - - // Internal, for casts to access union fields - struct sifields_sigchld { - si_pid: crate::pid_t, - si_uid: crate::uid_t, - si_status: c_int, - si_utime: c_long, - si_stime: c_long, - } - - // Internal, for casts to access union fields - 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. - struct siginfo_f { - _siginfo_base: [c_int; 3], - sifields: sifields, - } -} - -impl siginfo_t { - unsafe fn sifields(&self) -> &sifields { - &(*(self as *const siginfo_t).cast::()).sifields - } - - pub unsafe fn si_pid(&self) -> crate::pid_t { - self.sifields().sigchld.si_pid - } - - pub unsafe fn si_uid(&self) -> crate::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 - } } s_no_extra_traits! { From ca95d9c21da2fdb2339196339632b95de3561445 Mon Sep 17 00:00:00 2001 From: Adam Martinez <149513579+dybucc@users.noreply.github.com> Date: Wed, 5 Aug 2026 18:37:45 +0200 Subject: [PATCH 4/7] linux(musl): complete `siginfo_t` definition Replace alignment/padding fields with a mirrored definition of the upstream `union`. See [^1] for details. [^1]: --- src/new/musl/mod.rs | 1 + src/new/musl/signal.rs | 209 +++++++++++++++++++++++++++++++++++++++++ 2 files changed, 210 insertions(+) create mode 100644 src/new/musl/signal.rs diff --git a/src/new/musl/mod.rs b/src/new/musl/mod.rs index 9edb38255422..e85523b3f88e 100644 --- a/src/new/musl/mod.rs +++ b/src/new/musl/mod.rs @@ -31,4 +31,5 @@ pub(crate) mod sys { } pub(crate) mod sched; +pub(crate) mod signal; pub(crate) mod unistd; diff --git a/src/new/musl/signal.rs b/src/new/musl/signal.rs new file mode 100644 index 000000000000..d941f1dd6aa4 --- /dev/null +++ b/src/new/musl/signal.rs @@ -0,0 +1,209 @@ +//! Header source: `include/signal.h` +//! +//! * Headers: (official) +//! * Headers: (mirror) + +use crate::prelude::*; + +s_no_extra_traits! { + // `mips*` targets swap the `s_errno` and `s_code` fields otherwise this struct is + // target-agnostic (see https://www.openwall.com/lists/musl/2016/01/27/1/2) + pub struct siginfo_t { + pub si_signo: c_int, + #[cfg(not(any(target_arch = "mips", target_arch = "mips64")))] + pub si_errno: c_int, + pub si_code: c_int, + #[cfg(any(target_arch = "mips", target_arch = "mips64"))] + pub si_errno: c_int, + __si_fields: __c_anonymous_siginfo_t___si_fields, + } + + union __c_anonymous_siginfo_t___si_fields { + __pad: [c_char; 128 - 2 * size_of::() - size_of::()], + __si_common: __c_anonymous___si_fields___si_common, + __sigfault: __c_anonymous___si_fields___sigfault, + __sigpoll: __c_anonymous___si_fields___sigpoll, + __sigsys: __c_anonymous___si_fields___sigsys, + } + + struct __c_anonymous___si_fields___si_common { + __first: __c_anonymous___si_common___first, + __second: __c_anonymous___si_common___second, + } + + struct __c_anonymous___si_fields___sigfault { + si_addr: *mut c_void, + si_addr_lsb: c_short, + __first: __c_anonymous___sigfault___first, + } + + struct __c_anonymous___si_fields___sigpoll { + si_band: c_long, + si_fd: c_int, + } + + struct __c_anonymous___si_fields___sigsys { + si_call_addr: *mut c_void, + si_syscall: c_int, + si_arch: c_uint, + } + + struct __c_anonymous___si_common___first { + __piduid: __c_anonymous___first___piduid, + __timer: __c_anonymous___first___timer, + } + + struct __c_anonymous___si_common___second { + si_value: crate::sigval, + __sigchld: __c_anonymous___second___sigchld, + } + + struct __c_anonymous___sigfault___first { + __addr_band: __c_anonymous___first___addr_band, + si_pkey: c_uint, + } + + struct __c_anonymous___first___piduid { + si_pid: crate::pid_t, + si_uid: crate::uid_t, + } + + struct __c_anonymous___first___timer { + si_timerid: c_int, + si_overrun: c_int, + } + + struct __c_anonymous___second___sigchld { + si_status: c_int, + si_utime: crate::clock_t, + si_stime: crate::clock_t, + } + + struct __c_anonymous___first___addr_band { + si_lower: *mut c_void, + si_upper: *mut c_void, + } +} + +impl siginfo_t { + #[inline] + pub unsafe fn si_pid(&self) -> crate::pid_t { + self.__si_fields.__si_common.__first.__piduid.si_pid + } + + #[inline] + pub unsafe fn si_uid(&self) -> crate::uid_t { + self.__si_fields.__si_common.__first.__piduid.si_uid + } + + #[inline] + pub unsafe fn si_status(&self) -> c_int { + self.__si_fields.__si_common.__second.__sigchld.si_status + } + + #[inline] + pub unsafe fn si_utime(&self) -> crate::clock_t { + self.__si_fields.__si_common.__second.__sigchld.si_utime + } + + #[inline] + pub unsafe fn si_stime(&self) -> crate::clock_t { + self.__si_fields.__si_common.__second.__sigchld.si_stime + } + + #[inline] + pub unsafe fn si_value(&self) -> crate::sigval { + self.__si_fields.__si_common.__second.si_value + } + + #[inline] + pub unsafe fn si_addr(&self) -> *mut c_void { + self.__si_fields.__sigfault.si_addr + } + + #[inline] + pub unsafe fn si_addr_lsb(&self) -> c_short { + self.__si_fields.__sigfault.si_addr_lsb + } + + #[inline] + pub unsafe fn si_lower(&self) -> *mut c_void { + self.__si_fields.__sigfault.__first.__addr_band.si_lower + } + + #[inline] + pub unsafe fn si_upper(&self) -> *mut c_void { + self.__si_fields.__sigfault.__first.__addr_band.si_upper + } + + #[inline] + pub unsafe fn si_pkey(&self) -> c_uint { + self.__si_fields.__sigfault.__first.si_pkey + } + + #[inline] + pub unsafe fn si_band(&self) -> c_long { + self.__si_fields.__sigpoll.si_band + } + + #[inline] + pub unsafe fn si_fd(&self) -> c_int { + self.__si_fields.__sigpoll.si_fd + } + + #[inline] + pub unsafe fn si_timerid(&self) -> c_int { + self.__si_fields.__si_common.__first.__timer.si_timerid + } + + #[inline] + pub unsafe fn si_overrun(&self) -> c_int { + self.__si_fields.__si_common.__first.__timer.si_overrun + } + + #[inline] + pub unsafe fn si_ptr(&self) -> *mut c_void { + self.__si_fields.__si_common.__second.si_value.sival_ptr + } + + #[inline] + pub unsafe fn si_int(&self) -> c_int { + self.__si_fields.__si_common.__second.si_value.sival_int + } + + #[inline] + pub unsafe fn si_call_addr(&self) -> *mut c_void { + self.__si_fields.__sigsys.si_call_addr + } + + #[inline] + pub unsafe fn si_syscall(&self) -> c_int { + self.__si_fields.__sigsys.si_syscall + } + + #[inline] + pub unsafe fn si_arch(&self) -> c_uint { + self.__si_fields.__sigsys.si_arch + } +} + +cfg_if! { + if #[cfg(feature = "extra_traits")] { + impl PartialEq for siginfo_t { + fn eq(&self, other: &Self) -> bool { + (self.si_signo, self.si_errno, self.si_code) + == (other.si_signo, other.si_errno, other.si_code) + } + } + + impl Eq for siginfo_t {} + + impl core::hash::Hash for siginfo_t { + fn hash(&self, state: &mut H) { + self.si_signo.hash(state); + self.si_errno.hash(state); + self.si_code.hash(state); + } + } + } +} From 0603249f41e80df42a0f3128f6a40ad021d96028 Mon Sep 17 00:00:00 2001 From: Adam Martinez <149513579+dybucc@users.noreply.github.com> Date: Wed, 5 Aug 2026 18:37:46 +0200 Subject: [PATCH 5/7] linux(musl): replace older `siginfo_t` bindings Remove older bindings to `siginfo_t` using dummy fields instead of the upstream `union`. This follows from the patch providing a full definition for musl bindings. Add modified bindings under `new`. --- src/new/mod.rs | 1 + src/unix/linux_like/linux/musl/mod.rs | 98 --------------------------- 2 files changed, 1 insertion(+), 98 deletions(-) diff --git a/src/new/mod.rs b/src/new/mod.rs index 370858f1e5e7..418369cddd69 100644 --- a/src/new/mod.rs +++ b/src/new/mod.rs @@ -247,6 +247,7 @@ cfg_if! { // Per-env headers we export cfg_if! { if #[cfg(any(target_env = "musl", target_env = "ohos"))] { + pub use signal::*; pub use sys::socket::*; } } diff --git a/src/unix/linux_like/linux/musl/mod.rs b/src/unix/linux_like/linux/musl/mod.rs index fa071954fd65..7864001afa70 100644 --- a/src/unix/linux_like/linux/musl/mod.rs +++ b/src/unix/linux_like/linux/musl/mod.rs @@ -57,83 +57,6 @@ 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).cast::()).si_addr - } - - pub unsafe fn si_value(&self) -> crate::sigval { - #[repr(C)] - struct siginfo_si_value { - _si_signo: c_int, - _si_errno: c_int, - _si_code: c_int, - _si_timerid: c_int, - _si_overrun: c_int, - si_value: crate::sigval, - } - (*(self as *const siginfo_t).cast::()).si_value - } -} - -s_no_extra_traits! { - // Internal, for casts to access union fields - struct sifields_sigchld { - si_pid: crate::pid_t, - si_uid: crate::uid_t, - si_status: c_int, - si_utime: c_long, - si_stime: c_long, - } - - // Internal, for casts to access union fields - 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. - struct siginfo_f { - _siginfo_base: [c_int; 3], - sifields: sifields, - } -} - -impl siginfo_t { - unsafe fn sifields(&self) -> &sifields { - &(*(self as *const siginfo_t).cast::()).sifields - } - - pub unsafe fn si_pid(&self) -> crate::pid_t { - self.sifields().sigchld.si_pid - } - - pub unsafe fn si_uid(&self) -> crate::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 - } -} - s! { #[repr(align(8))] pub struct fanotify_event_metadata { @@ -155,27 +78,6 @@ s! { pub sa_restorer: Option, } - // `mips*` targets swap the `s_errno` and `s_code` fields otherwise this struct is - // target-agnostic (see https://www.openwall.com/lists/musl/2016/01/27/1/2) - // - // FIXME(union): C implementation uses unions - pub struct siginfo_t { - pub si_signo: c_int, - #[cfg(not(any(target_arch = "mips", target_arch = "mips64")))] - pub si_errno: c_int, - pub si_code: c_int, - #[cfg(any(target_arch = "mips", target_arch = "mips64"))] - pub si_errno: c_int, - #[doc(hidden)] - #[deprecated( - since = "0.2.54", - note = "Please leave a comment on https://github.com/rust-lang/libc/pull/1316 \ - if you're using this field" - )] - pub _pad: [c_int; 29], - _align: [usize; 0], - } - pub struct statvfs { pub f_bsize: c_ulong, pub f_frsize: c_ulong, From f7f1a7fd3add5651674b426f30dc3436ac2b2e84 Mon Sep 17 00:00:00 2001 From: Adam Martinez <149513579+dybucc@users.noreply.github.com> Date: Wed, 5 Aug 2026 18:37:47 +0200 Subject: [PATCH 6/7] linux(uclibc): complete `siginfo_t` definition Replace alignment/padding dummy fields with a mirrored definition fitting that of upstream's `union`. uClibc supports targets for which we have no support in Rust. No architecture-specific definition has been provided for those. See [^1] for details on the generic definition and [^2] for details on the MIPS definition. [^1]: [^2]: --- src/new/uclibc/mod.rs | 10 + .../uclibc/sysdeps/linux/common/bits/mod.rs | 10 + .../sysdeps/linux/common/bits/siginfo.rs | 176 +++++++++++++++++ .../uclibc/sysdeps/linux/mips/bits/siginfo.rs | 178 ++++++++++++++++++ src/new/uclibc/sysdeps/linux/mips/mod.rs | 12 ++ src/new/uclibc/sysdeps/linux/mod.rs | 12 ++ 6 files changed, 398 insertions(+) create mode 100644 src/new/uclibc/sysdeps/linux/common/bits/mod.rs create mode 100644 src/new/uclibc/sysdeps/linux/common/bits/siginfo.rs create mode 100644 src/new/uclibc/sysdeps/linux/mips/bits/siginfo.rs create mode 100644 src/new/uclibc/sysdeps/linux/mips/mod.rs create mode 100644 src/new/uclibc/sysdeps/linux/mod.rs diff --git a/src/new/uclibc/mod.rs b/src/new/uclibc/mod.rs index 6bf83ef2e1d3..6f99b4e95c0c 100644 --- a/src/new/uclibc/mod.rs +++ b/src/new/uclibc/mod.rs @@ -4,4 +4,14 @@ //! * Headers: (mirror) pub(crate) mod pthread; + +/// Directory source: `libc/sysdeps` +/// +/// * Headers: (official) +/// * Headers: (mirror) +pub(crate) mod sysdeps { + #[cfg(target_os = "linux")] + pub(crate) mod linux; +} + pub(crate) mod unistd; diff --git a/src/new/uclibc/sysdeps/linux/common/bits/mod.rs b/src/new/uclibc/sysdeps/linux/common/bits/mod.rs new file mode 100644 index 000000000000..97cc8ce878be --- /dev/null +++ b/src/new/uclibc/sysdeps/linux/common/bits/mod.rs @@ -0,0 +1,10 @@ +//! Directory source: `libc/sysdeps/linux/common/bits` +//! +//! * Headers: (official) +//! * Headers: (mirror) + +#[cfg_attr( + any(target_arch = "mips", target_arch = "mips64"), + path = "../../mips/bits/siginfo.rs" +)] +pub(crate) mod siginfo; diff --git a/src/new/uclibc/sysdeps/linux/common/bits/siginfo.rs b/src/new/uclibc/sysdeps/linux/common/bits/siginfo.rs new file mode 100644 index 000000000000..5039f651237f --- /dev/null +++ b/src/new/uclibc/sysdeps/linux/common/bits/siginfo.rs @@ -0,0 +1,176 @@ +//! Header source: `libc/sysdeps/linux/common/bits/siginfo.h` +//! +//! * Headers: (official) +//! * Headers: (mirror) + +use crate::prelude::*; + +const __SI_MAX_SIZE: usize = 128; +const __SI_PAD_SIZE: usize = if cfg!(target_pointer_width = "64") { + __SI_MAX_SIZE / size_of::() - 4 +} else { + __SI_MAX_SIZE / size_of::() - 3 +}; + +s_no_extra_traits! { + pub struct siginfo_t { + pub si_signo: c_int, + pub si_errno: c_int, + pub si_code: c_int, + _sifields: __c_anonymous_siginfo_t__si_fields, + } + + union __c_anonymous_siginfo_t__si_fields { + _pad: Padding<[c_int; __SI_PAD_SIZE]>, + _kill: __c_anonymous__si_fields__kill, + _timer: __c_anonymous__si_fields__timer, + _rt: __c_anonymous__si_fields__rt, + _sigchld: __c_anonymous__si_fields__sigchld, + _sigfault: __c_anonymous__si_fields__sigfault, + _sigpoll: __c_anonymous__si_fields__sigpoll, + _sigsys: __c_anonymous__si_fields__sigsys, + } + + struct __c_anonymous__si_fields__kill { + si_pid: crate::pid_t, + si_uid: crate::uid_t, + } + + struct __c_anonymous__si_fields__timer { + si_tid: c_int, + si_overrun: c_int, + si_sigval: crate::sigval, + } + + struct __c_anonymous__si_fields__rt { + si_pid: crate::pid_t, + si_uid: crate::uid_t, + si_sigval: crate::sigval, + } + + struct __c_anonymous__si_fields__sigchld { + si_pid: crate::pid_t, + si_uid: crate::uid_t, + si_status: c_int, + si_utime: crate::clock_t, + si_stime: crate::clock_t, + } + + struct __c_anonymous__si_fields__sigfault { + si_addr: *mut c_void, + } + + struct __c_anonymous__si_fields__sigpoll { + si_band: c_long, + si_fd: c_int, + } + + struct __c_anonymous__si_fields__sigsys { + _call_addr: *mut c_void, + _syscall: c_int, + _arch: c_uint, + } +} + +impl siginfo_t { + #[inline] + pub unsafe fn si_pid(&self) -> crate::pid_t { + self._sifields._kill.si_pid + } + + #[inline] + pub unsafe fn si_uid(&self) -> crate::uid_t { + self._sifields._kill.si_uid + } + + #[inline] + pub unsafe fn si_timerid(&self) -> c_int { + self._sifields._timer.si_tid + } + + #[inline] + pub unsafe fn si_overrun(&self) -> c_int { + self._sifields._timer.si_overrun + } + + #[inline] + pub unsafe fn si_status(&self) -> c_int { + self._sifields._sigchld.si_status + } + + #[inline] + pub unsafe fn si_utime(&self) -> crate::clock_t { + self._sifields._sigchld.si_utime + } + + #[inline] + pub unsafe fn si_stime(&self) -> crate::clock_t { + self._sifields._sigchld.si_stime + } + + #[inline] + pub unsafe fn si_value(&self) -> crate::sigval { + self._sifields._rt.si_sigval + } + + #[inline] + pub unsafe fn si_int(&self) -> c_int { + self._sifields._rt.si_sigval.sival_int + } + + #[inline] + pub unsafe fn si_ptr(&self) -> *mut c_void { + self._sifields._rt.si_sigval.sival_ptr + } + + #[inline] + pub unsafe fn si_addr(&self) -> *mut c_void { + self._sifields._sigfault.si_addr + } + + #[inline] + pub unsafe fn si_band(&self) -> c_long { + self._sifields._sigpoll.si_band + } + + #[inline] + pub unsafe fn si_fd(&self) -> c_int { + self._sifields._sigpoll.si_fd + } + + #[inline] + pub unsafe fn si_call_addr(&self) -> *mut c_void { + self._sifields._sigsys._call_addr + } + + #[inline] + pub unsafe fn si_syscall(&self) -> c_int { + self._sifields._sigsys._syscall + } + + #[inline] + pub unsafe fn si_arch(&self) -> c_uint { + self._sifields._sigsys._arch + } +} + +cfg_if! { + if #[cfg(feature = "extra_traits")] { + impl PartialEq for siginfo_t { + fn eq(&self, other: &Self) -> bool { + (self.si_signo, self.si_code, self.si_errno) + == (other.si_signo, other.si_code, other.si_errno) + } + } + + impl Eq for siginfo_t {} + + impl core::hash::Hash for siginfo_t { + fn hash(&self, state: &mut H) { + self.si_signo.hash(state); + self.si_code.hash(state); + self.si_errno.hash(state); + } + } + } +} diff --git a/src/new/uclibc/sysdeps/linux/mips/bits/siginfo.rs b/src/new/uclibc/sysdeps/linux/mips/bits/siginfo.rs new file mode 100644 index 000000000000..cbdb29457c7c --- /dev/null +++ b/src/new/uclibc/sysdeps/linux/mips/bits/siginfo.rs @@ -0,0 +1,178 @@ +//! Header source: `libc/sysdeps/linux/mips/bits/siginfo.h` +//! +//! * Headers: (official) +//! * Headers: (mirror) + +use crate::prelude::*; + +const __SI_MAX_SIZE: usize = 128; +const __SI_PAD_SIZE: usize = if cfg!(target_pointer_width = "64") { + __SI_MAX_SIZE / size_of::() - 4 +} else { + __SI_MAX_SIZE / size_of::() - 3 +}; + +s_no_extra_traits! { + pub struct siginfo_t { + pub si_signo: c_int, + pub si_code: c_int, + pub si_errno: c_int, + __pad0: Padding<[c_int; __SI_MAX_SIZE / size_of::() - __SI_PAD_SIZE - 3]>, + _sifields: __c_anonymous_siginfo_t__si_fields, + } + + union __c_anonymous_siginfo_t__si_fields { + _pad: Padding<[c_int; __SI_PAD_SIZE]>, + _kill: __c_anonymous__si_fields__kill, + _timer: __c_anonymous__si_fields__timer, + _rt: __c_anonymous__si_fields__rt, + _sigchld: __c_anonymous__si_fields__sigchld, + _sigfault: __c_anonymous__si_fields__sigfault, + _sigpoll: __c_anonymous__si_fields__sigpoll, + _sigsys: __c_anonymous__si_fields__sigsys, + } + + struct __c_anonymous__si_fields__kill { + si_pid: crate::pid_t, + si_uid: crate::uid_t, + } + + struct __c_anonymous__si_fields__timer { + si_tid: c_int, + si_overrun: c_int, + si_sigval: crate::sigval, + } + + struct __c_anonymous__si_fields__rt { + si_pid: crate::pid_t, + si_uid: crate::uid_t, + si_sigval: crate::sigval, + } + + struct __c_anonymous__si_fields__sigchld { + si_pid: crate::pid_t, + si_uid: crate::uid_t, + si_status: c_int, + si_utime: crate::clock_t, + si_stime: crate::clock_t, + } + + struct __c_anonymous__si_fields__sigfault { + si_addr: *mut c_void, + si_addr_lsb: c_short, + } + + struct __c_anonymous__si_fields__sigpoll { + si_band: c_long, + si_fd: c_int, + } + + struct __c_anonymous__si_fields__sigsys { + _call_addr: *mut c_void, + _syscall: c_int, + _arch: c_uint, + } +} + +impl siginfo_t { + #[inline] + pub unsafe fn si_pid(&self) -> crate::pid_t { + self._sifields._kill.si_pid + } + + #[inline] + pub unsafe fn si_uid(&self) -> crate::uid_t { + self._sifields._kill.si_uid + } + + #[inline] + pub unsafe fn si_timerid(&self) -> c_int { + self._sifields._timer.si_tid + } + + #[inline] + pub unsafe fn si_overrun(&self) -> c_int { + self._sifields._timer.si_overrun + } + + #[inline] + pub unsafe fn si_status(&self) -> c_int { + self._sifields._sigchld.si_status + } + + #[inline] + pub unsafe fn si_utime(&self) -> crate::clock_t { + self._sifields._sigchld.si_utime + } + + #[inline] + pub unsafe fn si_stime(&self) -> crate::clock_t { + self._sifields._sigchld.si_stime + } + + #[inline] + pub unsafe fn si_value(&self) -> crate::sigval { + self._sifields._rt.si_sigval + } + + #[inline] + pub unsafe fn si_int(&self) -> c_int { + self._sifields._rt.si_sigval.sival_int + } + + #[inline] + pub unsafe fn si_ptr(&self) -> *mut c_void { + self._sifields._rt.si_sigval.sival_ptr + } + + #[inline] + pub unsafe fn si_addr(&self) -> *mut c_void { + self._sifields._sigfault.si_addr + } + + #[inline] + pub unsafe fn si_band(&self) -> c_long { + self._sifields._sigpoll.si_band + } + + #[inline] + pub unsafe fn si_fd(&self) -> c_int { + self._sifields._sigpoll.si_fd + } + + #[inline] + pub unsafe fn si_call_addr(&self) -> *mut c_void { + self._sifields._sigsys._call_addr + } + + #[inline] + pub unsafe fn si_syscall(&self) -> c_int { + self._sifields._sigsys._syscall + } + + #[inline] + pub unsafe fn si_arch(&self) -> c_uint { + self._sifields._sigsys._arch + } +} + +cfg_if! { + if #[cfg(feature = "extra_traits")] { + impl PartialEq for siginfo_t { + fn eq(&self, other: &Self) -> bool { + (self.si_signo, self.si_code, self.si_errno) + == (other.si_signo, other.si_code, other.si_errno) + } + } + + impl Eq for siginfo_t {} + + impl core::hash::Hash for siginfo_t { + fn hash(&self, state: &mut H) { + self.si_signo.hash(state); + self.si_code.hash(state); + self.si_errno.hash(state); + } + } + } +} diff --git a/src/new/uclibc/sysdeps/linux/mips/mod.rs b/src/new/uclibc/sysdeps/linux/mips/mod.rs new file mode 100644 index 000000000000..464e58e32abb --- /dev/null +++ b/src/new/uclibc/sysdeps/linux/mips/mod.rs @@ -0,0 +1,12 @@ +//! Directory source: `libc/sysdeps/linux/mips` +//! +//! * Headers: (official) +//! * Headers: (mirror) + +/// Directory source: `libc/sysdeps/linux/mips` +/// +/// * Headers: (official) +/// * Headers: (mirror) +pub(crate) mod bits { + pub(crate) mod siginfo; +} diff --git a/src/new/uclibc/sysdeps/linux/mod.rs b/src/new/uclibc/sysdeps/linux/mod.rs new file mode 100644 index 000000000000..130b2f927d25 --- /dev/null +++ b/src/new/uclibc/sysdeps/linux/mod.rs @@ -0,0 +1,12 @@ +//! Directory source: `libc/sysdeps/linux` +//! +//! * Headers: (official) +//! * Headers: (mirror) + +/// Directory source: `libc/sysdeps/linux/common` +/// +/// * Headers: (official) +/// * Headers: (mirror) +pub(crate) mod common { + pub(crate) mod bits; +} From f920138be45e6af7cef4e1975b868cb7be3f35a4 Mon Sep 17 00:00:00 2001 From: Adam Martinez <149513579+dybucc@users.noreply.github.com> Date: Wed, 5 Aug 2026 18:37:48 +0200 Subject: [PATCH 7/7] linux(uclibc): replace older `siginfo_t` bindings Remove older bindings to `siginfo_t` using dummy fields instead of the upstream `union`. This follows from the patch providing a full definition for uClibc bindings. Add modified bindings to `new` module. --- src/new/mod.rs | 2 + src/unix/linux_like/linux/uclibc/arm/mod.rs | 7 -- .../linux/uclibc/mips/mips32/mod.rs | 7 -- .../linux/uclibc/mips/mips64/mod.rs | 8 -- src/unix/linux_like/linux/uclibc/mod.rs | 77 ------------------- .../linux_like/linux/uclibc/x86_64/mod.rs | 8 -- 6 files changed, 2 insertions(+), 107 deletions(-) diff --git a/src/new/mod.rs b/src/new/mod.rs index 418369cddd69..929f8e522213 100644 --- a/src/new/mod.rs +++ b/src/new/mod.rs @@ -194,6 +194,8 @@ cfg_if! { pub use linux::sctp::*; pub use linux::tls::*; pub use linux::types::*; + #[cfg(target_env = "uclibc")] + pub use sysdeps::linux::common::bits::siginfo::*; #[cfg(target_env = "gnu")] pub use self::{ diff --git a/src/unix/linux_like/linux/uclibc/arm/mod.rs b/src/unix/linux_like/linux/uclibc/arm/mod.rs index 9d255b7388fc..ddeb9cf2866e 100644 --- a/src/unix/linux_like/linux/uclibc/arm/mod.rs +++ b/src/unix/linux_like/linux/uclibc/arm/mod.rs @@ -179,13 +179,6 @@ s! { pub c_ospeed: crate::speed_t, } - pub struct siginfo_t { - pub si_signo: c_int, - pub si_errno: c_int, - pub si_code: c_int, - pub _pad: [c_int; 29], - } - pub struct stack_t { pub ss_sp: *mut c_void, pub ss_flags: c_int, diff --git a/src/unix/linux_like/linux/uclibc/mips/mips32/mod.rs b/src/unix/linux_like/linux/uclibc/mips/mips32/mod.rs index 2c253f0164f1..e730a0d1441e 100644 --- a/src/unix/linux_like/linux/uclibc/mips/mips32/mod.rs +++ b/src/unix/linux_like/linux/uclibc/mips/mips32/mod.rs @@ -97,13 +97,6 @@ s! { __val: [c_ulong; 4], } - pub struct siginfo_t { - pub si_signo: c_int, - pub si_code: c_int, - pub si_errno: c_int, - pub _pad: [c_int; 29], - } - pub struct glob64_t { pub gl_pathc: size_t, pub gl_pathv: *mut *mut c_char, diff --git a/src/unix/linux_like/linux/uclibc/mips/mips64/mod.rs b/src/unix/linux_like/linux/uclibc/mips/mips64/mod.rs index a6a63a33a93b..8d65d62dd96d 100644 --- a/src/unix/linux_like/linux/uclibc/mips/mips64/mod.rs +++ b/src/unix/linux_like/linux/uclibc/mips/mips64/mod.rs @@ -79,14 +79,6 @@ s! { __size: [c_ulong; 16], } - pub struct siginfo_t { - pub si_signo: c_int, - pub si_code: c_int, - pub si_errno: c_int, - _pad: Padding, - _pad2: Padding<[c_long; 14]>, - } - pub struct ipc_perm { pub __key: crate::key_t, pub uid: crate::uid_t, diff --git a/src/unix/linux_like/linux/uclibc/mod.rs b/src/unix/linux_like/linux/uclibc/mod.rs index dd54a15e25fb..c8336c7fdf9e 100644 --- a/src/unix/linux_like/linux/uclibc/mod.rs +++ b/src/unix/linux_like/linux/uclibc/mod.rs @@ -135,83 +135,6 @@ s! { } } -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).cast::()).si_addr - } - - pub unsafe fn si_value(&self) -> crate::sigval { - #[repr(C)] - struct siginfo_si_value { - _si_signo: c_int, - _si_errno: c_int, - _si_code: c_int, - _si_timerid: c_int, - _si_overrun: c_int, - si_value: crate::sigval, - } - (*(self as *const siginfo_t).cast::()).si_value - } -} - -s_no_extra_traits! { - // Internal, for casts to access union fields - struct sifields_sigchld { - si_pid: crate::pid_t, - si_uid: crate::uid_t, - si_status: c_int, - si_utime: c_long, - si_stime: c_long, - } - - // Internal, for casts to access union fields - 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. - struct siginfo_f { - _siginfo_base: [c_int; 3], - sifields: sifields, - } -} - -impl siginfo_t { - unsafe fn sifields(&self) -> &sifields { - &(*(self as *const siginfo_t).cast::()).sifields - } - - pub unsafe fn si_pid(&self) -> crate::pid_t { - self.sifields().sigchld.si_pid - } - - pub unsafe fn si_uid(&self) -> crate::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 - } -} - pub const MCL_CURRENT: c_int = 0x0001; pub const MCL_FUTURE: c_int = 0x0002; pub const MCL_ONFAULT: c_int = 0x0004; diff --git a/src/unix/linux_like/linux/uclibc/x86_64/mod.rs b/src/unix/linux_like/linux/uclibc/x86_64/mod.rs index af4bedbc082c..76ff86e81422 100644 --- a/src/unix/linux_like/linux/uclibc/x86_64/mod.rs +++ b/src/unix/linux_like/linux/uclibc/x86_64/mod.rs @@ -51,14 +51,6 @@ s! { __sched_priority: c_int, } - pub struct siginfo_t { - si_signo: c_int, // signal number - si_errno: c_int, // if not zero: error value of signal, see errno.h - si_code: c_int, // signal code - pub _pad: [c_int; 28], // unported union - _align: [usize; 0], - } - pub struct shmid_ds { pub shm_perm: crate::ipc_perm, pub shm_segsz: size_t, // segment size in bytes