From a5cfc5d260a2d446ac562a6619ea3484638c9495 Mon Sep 17 00:00:00 2001 From: David Carlier Date: Tue, 9 May 2023 20:33:03 +0100 Subject: [PATCH] signal adding sig(timed)wait implementations --- src/header/signal/cbindgen.toml | 5 ++++- src/header/signal/mod.rs | 34 +++++++++++++++++++++++++++++---- src/platform/linux/signal.rs | 7 ++++++- src/platform/pal/signal.rs | 5 ++++- src/platform/redox/signal.rs | 10 +++++++++- 5 files changed, 53 insertions(+), 8 deletions(-) diff --git a/src/header/signal/cbindgen.toml b/src/header/signal/cbindgen.toml index 46bbe11352..14ec586ebc 100644 --- a/src/header/signal/cbindgen.toml +++ b/src/header/signal/cbindgen.toml @@ -1,4 +1,4 @@ -sys_includes = ["stdint.h", "sys/types.h"] +sys_includes = ["stdint.h", "sys/types.h", "time.h"] include_guard = "_RELIBC_SIGNAL_H" trailer = "#include " language = "C" @@ -12,3 +12,6 @@ cpp_compat = true [enum] prefix_with_name = true + +[export.rename] +"timespec" = "struct timespec" diff --git a/src/header/signal/mod.rs b/src/header/signal/mod.rs index d0fe9fef83..1e4d37f924 100644 --- a/src/header/signal/mod.rs +++ b/src/header/signal/mod.rs @@ -5,8 +5,11 @@ use core::{mem, ptr}; use cbitset::BitSet; use crate::{ - header::errno, - platform::{self, types::*, PalSignal, Sys}, + header::{ + errno, + time::timespec, + }, + platform::{self, types::*, Pal, PalSignal, Sys}, }; pub use self::sys::*; @@ -47,6 +50,16 @@ pub struct sigaltstack { pub ss_size: size_t, } +#[repr(C)] +#[derive(Clone, Debug)] +pub struct siginfo_t { + pub si_signo: c_int, + pub si_errno: c_int, + pub si_code: c_int, + _padding: [c_int; 29], + _si_align: [usize; 0], +} + pub type sigset_t = c_ulong; pub type stack_t = sigaltstack; @@ -308,9 +321,22 @@ pub extern "C" fn sigsuspend(sigmask: *const sigset_t) -> c_int { Sys::sigsuspend(sigmask) } -// #[no_mangle] +#[no_mangle] pub extern "C" fn sigwait(set: *const sigset_t, sig: *mut c_int) -> c_int { - unimplemented!(); + let mut pinfo = mem::MaybeUninit::::uninit(); + if sigtimedwait(set, pinfo.as_mut_ptr(), ptr::null_mut()) < 0 { + return -1; + } + unsafe { + let mut info = pinfo.assume_init(); + (*sig) = info.si_signo; + } + 0 +} + +#[no_mangle] +pub extern "C" fn sigtimedwait(set: *const sigset_t, sig: *mut siginfo_t, tp: *const timespec) -> c_int { + Sys::sigtimedwait(set, sig, tp) } pub const _signal_strings: [&str; 32] = [ diff --git a/src/platform/linux/signal.rs b/src/platform/linux/signal.rs index c0ab260539..d12cf8b800 100644 --- a/src/platform/linux/signal.rs +++ b/src/platform/linux/signal.rs @@ -5,8 +5,9 @@ use super::{ e, Sys, }; use crate::header::{ - signal::{NSIG, sigaction, sigset_t, stack_t}, + signal::{NSIG, sigaction, siginfo_t, sigset_t, stack_t}, sys_time::itimerval, + time::timespec, }; impl PalSignal for Sys { @@ -62,4 +63,8 @@ impl PalSignal for Sys { fn sigsuspend(set: *const sigset_t) -> c_int { e(unsafe { syscall!(RT_SIGSUSPEND, set, NSIG/8) }) as c_int } + + fn sigtimedwait(set: *const sigset_t, sig: *mut siginfo_t, tp: *const timespec) -> c_int { + e(unsafe { syscall!(RT_SIGTIMEDWAIT, set, sig, tp, NSIG/8) }) as c_int + } } diff --git a/src/platform/pal/signal.rs b/src/platform/pal/signal.rs index a91c69d8c6..8441e6608c 100644 --- a/src/platform/pal/signal.rs +++ b/src/platform/pal/signal.rs @@ -1,7 +1,8 @@ use super::super::{types::*, Pal}; use crate::header::{ - signal::{sigaction, sigset_t, stack_t}, + signal::{sigaction, siginfo_t, sigset_t, stack_t}, sys_time::itimerval, + time::timespec, }; pub trait PalSignal: Pal { @@ -24,4 +25,6 @@ pub trait PalSignal: Pal { fn sigprocmask(how: c_int, set: *const sigset_t, oset: *mut sigset_t) -> c_int; fn sigsuspend(set: *const sigset_t) -> c_int; + + fn sigtimedwait(set: *const sigset_t, sig: *mut siginfo_t, tp: *const timespec) -> c_int; } diff --git a/src/platform/redox/signal.rs b/src/platform/redox/signal.rs index e406bec8ff..3fb367fc1f 100644 --- a/src/platform/redox/signal.rs +++ b/src/platform/redox/signal.rs @@ -8,8 +8,9 @@ use super::{ use crate::{ header::{ errno::{EINVAL, ENOSYS}, - signal::{sigaction, sigset_t, stack_t}, + signal::{sigaction, siginfo_t, sigset_t, stack_t}, sys_time::{itimerval, ITIMER_REAL}, + time::timespec, }, platform::errno, }; @@ -166,4 +167,11 @@ impl PalSignal for Sys { } -1 } + + fn sigtimedwait(set: *const sigset_t, sig: *mut siginfo_t, tp: *const timespec) -> c_int { + unsafe { + errno = ENOSYS; + } + -1 + } }