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]