loongarch64: add new syscall numbers
[musl.git] / src / internal / emulate_wait4.c
blobf630341212acc1bfc9d9fc8104f777367004b522
1 #include <sys/wait.h>
2 #include "syscall.h"
4 #ifndef SYS_wait4
5 hidden long __emulate_wait4(int pid, int *status, int options, void *kru, int cp)
7 idtype_t t;
8 int r;
9 siginfo_t info;
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;
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);
26 if (r<0) return r;
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;
50 *status = sw;
53 return info.si_pid;
55 #endif