master
 1#include <sys/wait.h>
 2#include "syscall.h"
 3
 4#ifndef SYS_wait4
 5hidden long __emulate_wait4(int pid, int *status, int options, void *kru, int cp)
 6{
 7	idtype_t t;
 8	int r;
 9	siginfo_t info;
10
11	info.si_pid = 0;
12	if (pid < -1) {
13		t = P_PGID;
14		pid = -pid;
15	} else if (pid == -1) {
16		t = P_ALL;
17	} else if (pid == 0) {
18		t = P_PGID;
19	} else {
20		t = P_PID;
21	}
22
23	if (cp) r = __syscall_cp(SYS_waitid, t, pid, &info, options|WEXITED, kru);
24	else r = __syscall(SYS_waitid, t, pid, &info, options|WEXITED, kru);
25
26	if (r<0) return r;
27
28	if (info.si_pid && status) {
29		int sw=0;
30		switch (info.si_code) {
31		case CLD_CONTINUED:
32			sw = 0xffff;
33			break;
34		case CLD_DUMPED:
35			sw = info.si_status&0x7f | 0x80;
36			break;
37		case CLD_EXITED:
38			sw = (info.si_status&0xff) << 8;
39			break;
40		case CLD_KILLED:
41			sw = info.si_status&0x7f;
42			break;
43		case CLD_STOPPED:
44		case CLD_TRAPPED:
45			/* see ptrace(2); the high bits of si_status can contain */
46			/* PTRACE_EVENT_ values which must be preserved */
47			sw = (info.si_status << 8) + 0x7f;
48			break;
49		}
50		*status = sw;
51	}
52
53	return info.si_pid;
54}
55#endif