diff --git a/src/lib.rs b/src/lib.rs
index 8becd7bd0de31a7f58d4982ed4435eee611fbc70..a45c9d7115eb2e28a2daddefbb19766c5e9eb305 100644
--- a/src/lib.rs
+++ b/src/lib.rs
@@ -17,6 +17,7 @@ extern crate string;
 extern crate sys_time;
 extern crate time;
 extern crate unistd;
+extern crate wait;
 extern crate wctype;
 
 #[lang = "eh_personality"]
diff --git a/src/platform/src/linux/mod.rs b/src/platform/src/linux/mod.rs
index 3f0ef34edebf6f22d7c0aea2df487049b6b012af..f26076e6c14157a6f70b6278513c1f241730c17c 100644
--- a/src/platform/src/linux/mod.rs
+++ b/src/platform/src/linux/mod.rs
@@ -160,7 +160,7 @@ pub fn unlink(path: *const c_char) -> c_int {
 }
 
 pub fn waitpid(pid: pid_t, stat_loc: *mut c_int, options: c_int) -> pid_t {
-    e(unsafe { syscall!(WAIT4, pid, stat_loc, options) }) as pid_t
+    e(unsafe { syscall!(WAIT4, pid, stat_loc, options, 0) }) as pid_t
 }
 
 pub fn write(fildes: c_int, buf: &[u8]) -> ssize_t {
diff --git a/src/platform/src/redox/mod.rs b/src/platform/src/redox/mod.rs
index 4d98965beb6536b59b9393b8e1fe35504cd13a92..a0b2c1d1371f2c4df45d281797caae9ae287d242 100644
--- a/src/platform/src/redox/mod.rs
+++ b/src/platform/src/redox/mod.rs
@@ -203,7 +203,12 @@ pub fn unlink(path: *const c_char) -> c_int {
 }
 
 pub fn waitpid(pid: pid_t, stat_loc: *mut c_int, options: c_int) -> pid_t {
-    e(syscall::waitpid(pid as usize, stat_loc as &mut usize, options as usize))
+    unsafe {
+        let mut temp: usize = *stat_loc as usize;
+        let res = e(syscall::waitpid(pid as usize, &mut temp, options as usize));
+        *stat_loc = temp as c_int;
+        res
+    }
 }
 
 pub fn write(fd: c_int, buf: &[u8]) -> ssize_t {
diff --git a/src/resource/cbindgen.toml b/src/resource/cbindgen.toml
index 788d105537cead2894f82a9ca6f85657dc1065da..1b33a4e4383d52da0b59effa2dc33a7ff4b46b05 100644
--- a/src/resource/cbindgen.toml
+++ b/src/resource/cbindgen.toml
@@ -1,7 +1,7 @@
-sys_includes = ["sys/types.h", "sys/time.h"]
+sys_includes = ["sys/types.h", "stdint.h", "sys/time.h"]
 include_guard = "_SYS_RESOURCE_H"
 language = "C"
-style = "Tag"
+style = "Both"
 
 [enum]
 prefix_with_name = true
diff --git a/src/wait/src/lib.rs b/src/wait/src/lib.rs
index c64108a58a358a1966543fd93c33257bd36a0797..2563e41d029a701aa72e19309ab76f89c087d7f3 100644
--- a/src/wait/src/lib.rs
+++ b/src/wait/src/lib.rs
@@ -11,7 +11,7 @@ use resource::rusage;
 
 #[no_mangle]
 pub unsafe extern "C" fn wait(stat_loc: *mut c_int) -> pid_t {
-    waitpid(-1, stat_loc, 0)
+    waitpid(0-1, stat_loc, 0)
 }
 
 #[no_mangle]
diff --git a/tests/.gitignore b/tests/.gitignore
index 6cfb8396be3a812afe7c47d4c3e7b4af7639e310..0edf72a5dcc12d503821a0e0aad1524118ee4105 100644
--- a/tests/.gitignore
+++ b/tests/.gitignore
@@ -33,5 +33,6 @@
 /string/strrchr
 /string/strspn
 /unlink
+/waitpid
 /write
 
diff --git a/tests/Makefile b/tests/Makefile
index a2528896058cbcc1690c00a79b65746959f760c9..e0bbb3fffb52f045b8632beccad6ec0134bb98f0 100644
--- a/tests/Makefile
+++ b/tests/Makefile
@@ -28,6 +28,7 @@ EXPECT_BINS=\
 	string/strrchr \
 	string/strspn \
 	unlink \
+	waitpid \
 	write
 
 # Binaries that may generate varied output
diff --git a/tests/waitpid.c b/tests/waitpid.c
new file mode 100644
index 0000000000000000000000000000000000000000..dc8fe52a614b14a558d0e61771bfb1ca90b6ecc3
--- /dev/null
+++ b/tests/waitpid.c
@@ -0,0 +1,16 @@
+#include <sys/wait.h>
+#include <unistd.h>
+#include <stdlib.h>
+
+int main(int argc, char** argv) {
+    pid_t pid = fork();
+    if (pid == 0) {
+    // child
+    sleep(1);
+    exit(0);
+} else {
+    // parent
+    int* stat_loc;
+    waitpid(pid, stat_loc, 0);
+    }
+}