uapi 0.2.13

Wrappers for OS APIs on UNIX-like platform
Documentation
#[test]
#[cfg(target_os = "linux")]
fn exec2() {
    use testutils::*;
    use uapi::*;

    fn check_exit(n: c::pid_t, code: c::c_int) {
        let (pid, status) = waitpid(n, 0).unwrap();
        assert_eq!(pid, n);
        assert_eq!(WIFEXITED(status), true);
        assert_eq!(WEXITSTATUS(status), code);
    }

    fn sh() -> UstrPtr<'static> {
        ["sh", "-c"].iter().copied().collect()
    }

    match unsafe { fork().unwrap() } {
        0 => in_fork(|| {
            let mut buf = sh();
            buf.push("exit $a");

            let mut env = UstrPtr::new();
            env.push("a=55");

            execveat(*open("/bin", c::O_RDONLY, 0).unwrap(), "sh", &buf, &env, 0)
                .unwrap();
        }),
        n => check_exit(n, 55),
    }

    match unsafe { fork().unwrap() } {
        0 => in_fork(|| {
            let mut buf = sh();
            buf.push("exit $a");

            let mut env = UstrPtr::new();
            env.push("a=56");

            execveat(
                *open("/bin/sh", c::O_RDONLY, 0).unwrap(),
                "",
                &buf,
                &env,
                c::AT_EMPTY_PATH,
            )
            .unwrap();
        }),
        n => check_exit(n, 56),
    }
    match unsafe { fork().unwrap() } {
        0 => in_fork(|| {
            let mut buf = sh();
            buf.push("exit $a");

            let mut env = UstrPtr::new();
            env.push("a=57");

            execvpe("sh", &buf, &env).unwrap();
        }),
        n => check_exit(n, 57),
    }
}