diff --git a/Cargo.lock b/Cargo.lock index 7f79565567e8e848a2d471f1fd40000bf4a53d8a..c31c410c139f33e174415a569823c46971a9374f 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -424,6 +424,7 @@ name = "signal" version = "0.1.0" dependencies = [ "cbindgen 0.5.2", + "errno 0.1.0", "platform 0.1.0", ] diff --git a/src/platform/src/types.rs b/src/platform/src/types.rs index b0bf04d5e34ed249f3b15fb48dd5c677598d40c1..0a03d28a477ee514e17370659a299fe8e6ea0b0a 100644 --- a/src/platform/src/types.rs +++ b/src/platform/src/types.rs @@ -172,8 +172,7 @@ pub struct sigaction { pub sa_mask: sigset_t } -const NSIG: usize = 64; - +pub const NSIG: usize = 64; pub type sigset_t = [c_ulong; NSIG / (8 * mem::size_of::<c_ulong>())]; const UTSLENGTH: usize = 65; diff --git a/src/signal/Cargo.toml b/src/signal/Cargo.toml index b1847d0801dd0c8bcb7a61d068e26e1a26e82c83..c2a3bc938854c4c359793b45936202f24c2b2b9b 100644 --- a/src/signal/Cargo.toml +++ b/src/signal/Cargo.toml @@ -8,4 +8,5 @@ build = "build.rs" cbindgen = { path = "../../cbindgen" } [dependencies] +errno = { path = "../errno" } platform = { path = "../platform" } diff --git a/src/signal/src/lib.rs b/src/signal/src/lib.rs index ee6f23d16f63e819febea9c9de6af7248a7b5bed..2f9d24fd434eb4dc01b298a490acdeaf06a66094 100644 --- a/src/signal/src/lib.rs +++ b/src/signal/src/lib.rs @@ -3,7 +3,7 @@ #![no_std] #![feature(asm, const_fn, core_intrinsics, global_asm)] -#[macro_use] +extern crate errno; extern crate platform; #[cfg(target_os = "linux")] @@ -30,8 +30,6 @@ pub struct sigaction { pub sa_mask: sigset_t } -const NSIG: usize = 64; - pub use sys::*; use core::{mem, ptr}; @@ -65,9 +63,18 @@ pub unsafe extern "C" fn sigaction(sig: c_int, act: *const sigaction, oact: *mut platform::sigaction(sig, ptr, oact as *mut platform::types::sigaction) } -// #[no_mangle] -pub extern "C" fn sigaddset(set: *mut sigset_t, signo: c_int) -> c_int { - unimplemented!(); +#[no_mangle] +pub extern "C" fn sigaddset(set: *mut sigset_t, mut signo: c_int) -> c_int { + if signo <= 0 || signo as usize > NSIG { + platform::errno = errno::EINVAL; + return -1; + } + + let signo = signo as usize - 1; // 0-indexed usize, please! + + let bits_each = 8 * mem::size_of::<sigset_t>(); + (unsafe { *set })[signo / bits_each] = 1 << (signo & (bits_each - 1)); + 0 } // #[no_mangle] @@ -75,9 +82,12 @@ pub extern "C" fn sigdelset(set: *mut sigset_t, signo: c_int) -> c_int { unimplemented!(); } -// #[no_mangle] +#[no_mangle] pub extern "C" fn sigemptyset(set: *mut sigset_t) -> c_int { - unimplemented!(); + for i in unsafe { &mut (*set) } { + *i = 0; + } + 0 } #[no_mangle]