--- /dev/null
+#ifdef HAVE_CONFIG_H
+# include "config.h"
+#endif
+
+#include <assert.h>
+#include <signal.h>
+#include <unistd.h>
+#include <sys/wait.h>
+#include <sys/resource.h>
+
+int
+main(void)
+{
+ int fds[2];
+ int s;
+ pid_t pid;
+ struct rusage rusage = {};
+ siginfo_t info = {};
+
+ (void) close(0);
+ (void) close(1);
+ assert(!pipe(fds) && fds[0] == 0 && fds[1] == 1);
+
+ pid = fork();
+ assert(pid >= 0);
+ if (!pid) {
+ char c;
+ (void) close(1);
+ assert(read(0, &c, sizeof(c)) == 1);
+ return 42;
+ }
+
+ (void) close(0);
+ assert(wait4(pid, &s, WNOHANG | __WALL, NULL) == 0);
+ assert(waitid(P_PID, pid, &info, WNOHANG | WEXITED) == 0);
+
+ assert(write(1, "", 1) == 1);
+ (void) close(1);
+ assert(wait4(pid, &s, 0, &rusage) == pid);
+ assert(WIFEXITED(s) && WEXITSTATUS(s) == 42);
+
+ pid = fork();
+ assert(pid >= 0);
+ if (!pid) {
+ (void) raise(SIGUSR1);
+ return 77;
+ }
+ assert(wait4(pid, &s, __WALL, NULL) == pid);
+ assert(WIFSIGNALED(s) && WTERMSIG(s) == SIGUSR1);
+
+ pid = fork();
+ assert(pid >= 0);
+ if (!pid) {
+ raise(SIGSTOP);
+ return 0;
+ }
+ assert(wait4(pid, &s, WUNTRACED, NULL) == pid);
+ assert(WIFSTOPPED(s) && WSTOPSIG(s) == SIGSTOP);
+
+ assert(kill(pid, SIGCONT) == 0);
+ assert(waitid(P_PID, pid, &info, WEXITED | WSTOPPED) == 0);
+ assert(info.si_code == CLD_EXITED && info.si_status == 0);
+
+ assert(wait4(-1, &s, WNOHANG | WUNTRACED | __WALL, &rusage) == -1);
+
+ return 0;
+}
--- /dev/null
+wait4\([[:digit:]]+, 0x[[:xdigit:]]+, WNOHANG\|__WALL, NULL\) += 0
+waitid\(P_PID, [[:digit:]]+, \{\}, WNOHANG\|WEXITED, NULL\) += 0
+wait4\([[:digit:]]+, \[\{WIFEXITED\(s\) && WEXITSTATUS\(s\) == 42\}\], 0, \{ru_utime=\{[[:digit:]], [[:digit:]]+\}, ru_stime=\{[[:digit:]], [[:digit:]]+\}, ru_maxrss=[[:digit:]]+, ru_ixrss=0, ru_idrss=0, ru_isrss=0, ru_minflt=[[:digit:]]+, ru_majflt=[[:digit:]]+, ru_nswap=0, ru_inblock=[[:digit:]]+, ru_oublock=[[:digit:]]+, ru_msgsnd=0, ru_msgrcv=0, ru_nsignals=0, ru_nvcsw=[[:digit:]]+, ru_nivcsw=[[:digit:]]+\}\) += [[:digit:]]+
+--- SIGCHLD \{si_signo=SIGCHLD, si_code=CLD_EXITED, si_pid=[[:digit:]]+, si_uid=[[:digit:]]+, si_status=42, si_utime=[[:digit:]], si_stime=[[:digit:]]} ---
+wait4\([[:digit:]]+, \[\{WIFSIGNALED\(s\) && WTERMSIG\(s\) == SIGUSR1\}\], __WALL, NULL\) += [[:digit:]]+
+--- SIGCHLD \{si_signo=SIGCHLD, si_code=CLD_KILLED, si_pid=[[:digit:]]+, si_uid=[[:digit:]]+, si_status=SIGUSR1, si_utime=[[:digit:]], si_stime=[[:digit:]]\} ---
+wait4\([[:digit:]]+, \[\{WIFSTOPPED\(s\) && WSTOPSIG\(s\) == SIGSTOP\}\], WSTOPPED, NULL\) += [[:digit:]]+
+--- SIGCHLD \{si_signo=SIGCHLD, si_code=CLD_STOPPED, si_pid=[[:digit:]]+, si_uid=[[:digit:]]+, si_status=SIGSTOP, si_utime=[[:digit:]], si_stime=[[:digit:]]\} ---
+--- SIGCHLD \{si_signo=SIGCHLD, si_code=CLD_CONTINUED, si_pid=[[:digit:]]+, si_uid=[[:digit:]]+, si_status=SIGCONT, si_utime=[[:digit:]], si_stime=[[:digit:]]\} ---
+waitid\(P_PID, [[:digit:]]+, \{si_signo=SIGCHLD, si_code=CLD_EXITED, si_pid=[[:digit:]]+, si_uid=[[:digit:]]+, si_status=0, si_utime=[[:digit:]], si_stime=[[:digit:]]\}, WEXITED\|WSTOPPED, NULL\) += 0
+wait4\(-1, 0x[[:xdigit:]]+, WNOHANG\|WSTOPPED\|__WALL, 0x[[:xdigit:]]+\) += -1 ECHILD .*