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); + } +}