diff --git a/src/header/signal/mod.rs b/src/header/signal/mod.rs index 26bd0dbfd3189c8ceccad700de1795413ce92a70..53a5b46014f27d44b4c03ede2b9b2232646970e7 100644 --- a/src/header/signal/mod.rs +++ b/src/header/signal/mod.rs @@ -1,6 +1,6 @@ //! signal implementation for Redox, following http://pubs.opengroup.org/onlinepubs/7908799/xsh/signal.h.html -use core::{mem, ptr}; +use core::mem; use cbitset::BitSet; @@ -21,9 +21,9 @@ pub mod sys; type SigSet = BitSet<[c_ulong; 1]>; -pub (crate) const SIG_DFL: usize = 0; -pub (crate) const SIG_IGN: usize = 1; -pub (crate) const SIG_ERR: isize = -1; +pub(crate) const SIG_DFL: usize = 0; +pub(crate) const SIG_IGN: usize = 1; +pub(crate) const SIG_ERR: isize = -1; pub const SIG_BLOCK: c_int = 0; pub const SIG_UNBLOCK: c_int = 1; @@ -86,18 +86,12 @@ pub unsafe extern "C" fn sigaction( act: *const sigaction, oact: *mut sigaction, ) -> c_int { - let act_opt = if !act.is_null() { - let mut act_clone = (*act).clone(); + let act_opt = act.as_ref().map(|act| { + let mut act_clone = act.clone(); act_clone.sa_flags |= SA_RESTORER as c_ulong; - Some(act_clone) - } else { - None - }; - println!("sig => {:?}", act_opt); - println!("osig => {:?}", (*oact)); - let out = Sys::sigaction(sig, act_opt.map_or(ptr::null_mut(), |x| &x), oact); - println!("aosig => {:?}", (*oact).sa_handler); - out + act_clone + }); + Sys::sigaction(sig, act_opt.as_ref(), oact.as_mut()) } #[no_mangle] @@ -198,8 +192,10 @@ extern "C" { } #[no_mangle] -pub extern "C" fn signal(sig: c_int, func: Option<extern "C" fn(c_int)>) -> Option<extern "C" fn(c_int)> { - println!("{:?}", func); +pub extern "C" fn signal( + sig: c_int, + func: Option<extern "C" fn(c_int)>, +) -> Option<extern "C" fn(c_int)> { let sa = sigaction { sa_handler: func, sa_flags: SA_RESTART as c_ulong, diff --git a/src/platform/linux/signal.rs b/src/platform/linux/signal.rs index 469b881d667bdc8a3473873bffa072e327f5005f..d8bf311c6208703bc598ba39709c022cc0e6025f 100644 --- a/src/platform/linux/signal.rs +++ b/src/platform/linux/signal.rs @@ -35,15 +35,16 @@ impl PalSignal for Sys { e(unsafe { syscall!(SETITIMER, which, new, old) }) as c_int } - unsafe fn sigaction(sig: c_int, act: *const sigaction, oact: *mut sigaction) -> c_int { - println!("in: {:?}", (*act)); - e(syscall!( - RT_SIGACTION, - sig, - act, - oact, - mem::size_of::<sigset_t>() - )) as c_int + fn sigaction(sig: c_int, act: Option<&sigaction>, oact: Option<&mut sigaction>) -> c_int { + e(unsafe { + syscall!( + RT_SIGACTION, + sig, + act.map_or_else(core::ptr::null, |x| x as *const _), + oact.map_or_else(core::ptr::null_mut, |x| x as *mut _), + mem::size_of::<sigset_t>() + ) + }) as c_int } fn sigaltstack(ss: *const stack_t, old_ss: *mut stack_t) -> c_int { diff --git a/src/platform/pal/signal.rs b/src/platform/pal/signal.rs index b2ebf71acad96beead12340dfffecda8e1870892..b432f57922969f15afb6a3a9ad029ed98cb7bf3f 100644 --- a/src/platform/pal/signal.rs +++ b/src/platform/pal/signal.rs @@ -15,7 +15,7 @@ pub trait PalSignal: Pal { fn setitimer(which: c_int, new: *const itimerval, old: *mut itimerval) -> c_int; - unsafe fn sigaction(sig: c_int, act: *const sigaction, oact: *mut sigaction) -> c_int; + fn sigaction(sig: c_int, act: Option<&sigaction>, oact: Option<&mut sigaction>) -> c_int; fn sigaltstack(ss: *const stack_t, old_ss: *mut stack_t) -> c_int; diff --git a/src/platform/redox/signal.rs b/src/platform/redox/signal.rs index 893f38c45d15fad6576effdf001169559309f954..1b945762cd2e159f7c9ae475e54123fa9c7c71ba 100644 --- a/src/platform/redox/signal.rs +++ b/src/platform/redox/signal.rs @@ -111,7 +111,9 @@ impl PalSignal for Sys { } else { let m = (*act).sa_mask; let sa_handler = mem::transmute((*act).sa_handler); - println!("signal called with {:x}", unsafe { mem::transmute::<_, usize>(sa_handler) }); + println!("signal called with {:x}", unsafe { + mem::transmute::<_, usize>(sa_handler) + }); Some(syscall::SigAction { sa_handler, sa_mask: [m as u64, 0], @@ -138,7 +140,7 @@ impl PalSignal for Sys { (*oact).sa_mask = m[0] as c_ulong; (*oact).sa_flags = old.sa_flags.bits() as c_ulong; } - println!("after : {:?}", oact); + println!("after : {:?}", (*oact)); ret } diff --git a/tests/signal.c b/tests/signal.c index 1176679e232a8a442594e056e28a052517f3b5d3..b322201b8cd30ad92ccc2b5d56e27f78d1a33c8d 100644 --- a/tests/signal.c +++ b/tests/signal.c @@ -11,12 +11,10 @@ void handler(int sig) { } int main(void) { - printf("handler: %x\n", handler); void (*signal_status)(int) = signal(SIGUSR1, handler); ERROR_IF(signal, signal_status, == SIG_ERR); signal_status = signal(SIGUSR1, handler); - ERROR_IF(signal, signal_status, == SIG_ERR); - printf("out: %x\n", signal_status); + ERROR_IF(signal, signal_status, != handler); puts("Raising...");