From 892ce75eb46f047d1845ebc2cb0748af95441737 Mon Sep 17 00:00:00 2001 From: jD91mZM2 <me@krake.one> Date: Sat, 28 Jul 2018 14:10:57 +0200 Subject: [PATCH] sigemptyset and sigaddset --- Cargo.lock | 1 + src/platform/src/types.rs | 3 +-- src/signal/Cargo.toml | 1 + src/signal/src/lib.rs | 26 ++++++++++++++++++-------- 4 files changed, 21 insertions(+), 10 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 7f795655..c31c410c 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 b0bf04d5..0a03d28a 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 b1847d08..c2a3bc93 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 ee6f23d1..2f9d24fd 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] -- GitLab