8#include <sys/syscall.h>
11 int failed = 0, status = 0x5a5a;
14 struct cw_child child = CW_CHILD_INIT;
15 void* bad = mmap(NULL, cw_page, PROT_NONE, MAP_PRIVATE | MAP_ANONYMOUS, -1, 0);
16 CHECK(bad != MAP_FAILED);
17 CHECK(cw_spawn(&child, -1, (uid_t)-1, 9) == 0);
22 } invalid[] = {{99, 0, WEXITED},
24 {P_PID, (id_t)-1, WEXITED},
25 {P_PGID, (id_t)-1, WEXITED},
28 {P_ALL, 0, WEXITED | 0x1000}};
29 for (
size_t i = 0; i <
sizeof(invalid) /
sizeof(invalid[0]); ++i) {
30 memset(&info, 0xa5,
sizeof(info));
32 CHECK(cw_raw_waitid(invalid[i].type, invalid[i].
id, &info, invalid[i].
options, NULL) == -1);
33 CHECK(errno == EINVAL && !cw_empty_info(&info));
36 CHECK(cw_raw_waitid(99, 0, bad, WEXITED, NULL) == -1 && errno == EFAULT);
37 CHECK(cw_raw_waitid(3, 0, &info, WEXITED, NULL) == -1 && errno == EOPNOTSUPP);
38 CHECK(cw_raw_waitid(3, (id_t)-1, &info, WEXITED, NULL) == -1 && errno == EINVAL);
39 CHECK(cw_raw_waitid(P_ALL, 0, &info, WEXITED | 0x80000000u, NULL) == -1 && errno == EOPNOTSUPP);
40 CHECK(syscall(SYS_wait4, child.pid, &status, WNOWAIT, NULL) == -1 && errno == EINVAL);
41 CHECK(syscall(SYS_wait4, child.pid, &status, WEXITED, NULL) == -1 && errno == EINVAL);
42 CHECK(syscall(SYS_wait4, INT_MIN, &status, 0, NULL) == -1 && errno == ESRCH);
43 CHECK(status == 0x5a5a);
45 memset(&info, 0xa5,
sizeof(info));
46 CHECK(cw_raw_waitid(P_PID, child.pid, &info, WEXITED | WNOHANG, &
usage) == 0);
47 CHECK(!cw_empty_info(&info) && cw_bytes(&
usage,
sizeof(
usage), 0xa5) == 0);
48 CHECK(cw_raw_waitid(P_PID, child.pid, NULL, WEXITED | WNOHANG, bad) == 0);
49 CHECK(syscall(SYS_wait4, child.pid, bad, WNOHANG, bad) == 0);
51 CHECK(cw_send(child.command,
'E') == 0);
52 CHECK(waitid(P_PID, child.pid, &info, WEXITED) == 0);
53 pid_t retired = child.pid;
55 memset(&info, 0xa5,
sizeof(info));
56 CHECK(waitid(P_PID, retired, &info, WEXITED) == -1 && errno == ECHILD);
57 CHECK(!cw_empty_info(&info));
58 CHECK(cw_raw_waitid(P_PID, retired, bad, WEXITED, NULL) == -1 && errno == EFAULT);
59 CHECK(cw_raw_waitid(P_ALL, 0, NULL, WEXITED | WNOHANG, bad) == -1 && errno == ECHILD);
62 if (bad != MAP_FAILED)