diff --git a/src/header/signal/mod.rs b/src/header/signal/mod.rs index 1b153c5b41ed10285e42cafa8fa4d7141705a0c9..4ae70a032072889894f891c1b7427a98896556d9 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; +use core::{mem, ptr}; use cbitset::BitSet; @@ -157,17 +157,37 @@ pub extern "C" fn sigfillset(set: *mut sigset_t) -> c_int { // #[no_mangle] pub extern "C" fn sighold(sig: c_int) -> c_int { - unimplemented!(); + let mut pset = mem::MaybeUninit::<sigset_t>::uninit(); + unsafe { sigemptyset(pset.as_mut_ptr()) }; + let mut set = unsafe { pset.assume_init() }; + if sigaddset(&mut set, sig) < 0 { + return -1; + } + sigprocmask(SIG_BLOCK, &set, ptr::null_mut()) } // #[no_mangle] pub extern "C" fn sigignore(sig: c_int) -> c_int { - unimplemented!(); + let mut psa = mem::MaybeUninit::<sigaction>::uninit(); + unsafe { sigemptyset(&mut (*psa.as_mut_ptr()).sa_mask) }; + let mut sa = unsafe { psa.assume_init() }; + sa.sa_handler = unsafe { mem::transmute(SIG_IGN) }; + sa.sa_flags = 0; + unsafe { sigaction(sig, &mut sa, ptr::null_mut()) } } // #[no_mangle] pub extern "C" fn siginterrupt(sig: c_int, flag: c_int) -> c_int { - unimplemented!(); + let mut psa = mem::MaybeUninit::<sigaction>::uninit(); + unsafe { sigaction(sig, ptr::null_mut(), psa.as_mut_ptr()) }; + let mut sa = unsafe { psa.assume_init() }; + if flag != 0 { + sa.sa_flags &= !SA_RESTART as c_ulong; + } else { + sa.sa_flags |= SA_RESTART as c_ulong; + } + + unsafe { sigaction(sig, &mut sa, ptr::null_mut()) } } #[no_mangle]