int waitid(idtype_t which, id_t id, siginfo_t* info, int options) { /* the system call takes an option struct rusage that we don't need */ return __waitid(which, id, info, options, NULL); }
__pid_t __libc_waitpid (__pid_t pid, int *stat_loc, int options) { __idtype_t idtype; __pid_t tmp_pid = pid; __siginfo_t infop; if (pid <= WAIT_MYPGRP) { if (pid == WAIT_ANY) { /* Request the status for any child. */ idtype = P_ALL; } else if (pid == WAIT_MYPGRP) { /* Request the status for any child process that has a pgid that's equal to that of our parent. */ tmp_pid = __getpgid (0); idtype = P_PGID; } else /* PID < -1 */ { /* Request the status for any child whose pgid is equal to the absolute value of PID. */ tmp_pid = pid & ~0; /* XXX not pseudo-insn */ idtype = P_PGID; } } else { /* Request the status for the child whose pid is PID. */ idtype = P_PID; } if (__waitid (idtype, tmp_pid, &infop, options | WEXITED | WTRAPPED) < 0) return -1; switch (infop.__code) { case EXITED: *stat_loc = W_EXITCODE (infop.__status, 0); break; case STOPPED: case TRAPPED: *stat_loc = W_STOPCODE (infop.__status); break; case KILLED: /* Don't know what to do with continue, since it isn't documented. Putting it here seemed the right place though. */ case CONTINUED: *stat_loc = infop.__status; /* FALLTHROUGH */ case CORED: *stat_loc |= WCOREFLAG; break; } /* Return the PID out of the INFOP structure instead of the one we were called with, to account for cases of being called with -1 to signify any PID. */ return infop.__pid; }