uapi 0.2.13

Wrappers for OS APIs on UNIX-like platform
Documentation
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()
}

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

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

            execve("/bin/sh", &buf, &env).unwrap();
        }),
        n => check_exit(n, 55),
    }

    std::env::set_var("a", "99");

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

            execv("/bin/sh", &buf).unwrap();
        }),
        n => check_exit(n, 99),
    }

    std::env::set_var("a", "68");

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

            execvp("sh", &buf).unwrap();
        }),
        n => check_exit(n, 68),
    }

    #[cfg(not(any(target_os = "macos", target_os = "openbsd")))]
    match unsafe { fork().unwrap() } {
        0 => in_fork(|| {
            let mut buf = sh();
            buf.push("exit 22");

            fexecve(
                *open("/bin/sh", c::O_RDONLY, 0).unwrap(),
                &buf,
                &UstrPtr::new(),
            )
            .unwrap();
        }),
        n => check_exit(n, 22),
    }
}