diff --git a/include/bits/signal.h b/include/bits/signal.h
index 8812ba7932e2425c02f4bb79d8b654e90e6a74fb..d3645d9b039601d894e77a98771fae712fa06cc0 100644
--- a/include/bits/signal.h
+++ b/include/bits/signal.h
@@ -1,6 +1,3 @@
-#define SIG_ERR -1ULL
-
-#define NSIG 64
-
-// darn cbindgen
-typedef unsigned long sigset_t[NSIG / (8 * sizeof(unsigned long))];
+#define SIG_ERR ((void (*)(int)) -1)
+#define SIG_DFL ((void (*)(int)) 0)
+#define SIG_IGN ((void (*)(int)) 1)
diff --git a/src/platform/src/redox/mod.rs b/src/platform/src/redox/mod.rs
index 10c3fc6532d56e8cae493744f77c2dffc0bcb1ca..3619d499ead37721170ef9049f84af7232eb45e7 100644
--- a/src/platform/src/redox/mod.rs
+++ b/src/platform/src/redox/mod.rs
@@ -736,7 +736,7 @@ pub unsafe fn sigaction(sig: c_int, act: *const sigaction, oact: *mut sigaction)
         let m = (*act).sa_mask;
         Some(syscall::SigAction {
             sa_handler: sig_handler,
-            sa_mask: [m[0] as u64, 0],
+            sa_mask: [0, m as u64],
             sa_flags: (*act).sa_flags as usize
         })
     };
@@ -748,7 +748,7 @@ pub unsafe fn sigaction(sig: c_int, act: *const sigaction, oact: *mut sigaction)
     )) as c_int;
     if !oact.is_null() {
         let m = old.sa_mask;
-        (*oact).sa_mask = [m[0] as c_ulong];
+        (*oact).sa_mask = m[1] as c_ulong;
         (*oact).sa_flags = old.sa_flags as c_ulong;
     }
     ret
diff --git a/src/platform/src/types.rs b/src/platform/src/types.rs
index 0a03d28a477ee514e17370659a299fe8e6ea0b0a..8438ddf10c9356ad5e0075226de13ec41390715c 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
 }
 
-pub const NSIG: usize = 64;
-pub type sigset_t = [c_ulong; NSIG / (8 * mem::size_of::<c_ulong>())];
+pub type sigset_t = c_ulong;
 
 const UTSLENGTH: usize = 65;
 
diff --git a/src/signal/src/lib.rs b/src/signal/src/lib.rs
index 8ca3b7f07a6f7816fe69fb65a2f15012ccedada3..099ce1149ce5ab25b6d53240b26c15266d659076 100644
--- a/src/signal/src/lib.rs
+++ b/src/signal/src/lib.rs
@@ -14,6 +14,11 @@ pub mod sys;
 #[path = "redox.rs"]
 pub mod sys;
 
+pub use sys::*;
+
+use core::{mem, ptr};
+use platform::types::*;
+
 const SIG_ERR: usize = !0;
 
 pub const SIG_BLOCK: c_int = 0;
@@ -30,10 +35,8 @@ pub struct sigaction {
     pub sa_mask: sigset_t
 }
 
-pub use sys::*;
-
-use core::{mem, ptr};
-use platform::types::*;
+pub const NSIG: usize = 64;
+pub type sigset_t = c_ulong;
 
 #[no_mangle]
 pub extern "C" fn kill(pid: pid_t, sig: c_int) -> c_int {
@@ -73,9 +76,9 @@ pub extern "C" fn sigaddset(set: *mut sigset_t, mut signo: c_int) -> c_int {
     }
 
     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));
+    unsafe {
+        *set |= 1 << (signo & (8 * mem::size_of::<sigset_t>() - 1));
+    }
     0
 }
 
@@ -86,16 +89,16 @@ pub extern "C" fn sigdelset(set: *mut sigset_t, signo: c_int) -> c_int {
 
 #[no_mangle]
 pub extern "C" fn sigemptyset(set: *mut sigset_t) -> c_int {
-    for i in unsafe { &mut (*set) } {
-        *i = 0;
+    unsafe {
+        *set = 0;
     }
     0
 }
 
 #[no_mangle]
 pub extern "C" fn sigfillset(set: *mut sigset_t) -> c_int {
-    for i in unsafe { &mut (*set) } {
-        *i = c_ulong::max_value();
+    unsafe {
+        *set = c_ulong::max_value();
     }
     0
 }
diff --git a/src/sys_socket/cbindgen.toml b/src/sys_socket/cbindgen.toml
index fc968ead013d2be8ce589680553bb382e82309a9..dee4af3bed10dcd2b2d9035c1fd6e2b709450d66 100644
--- a/src/sys_socket/cbindgen.toml
+++ b/src/sys_socket/cbindgen.toml
@@ -1,4 +1,4 @@
-sys_includes = ["sys/types.h"]
+sys_includes = ["stddef.h", "sys/types.h"]
 include_guard = "_SYS_SOCKET_H"
 style = "Tag"
 language = "C"