#[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),
}
}