/* waitpid() emulation for MiNT, by Howard Chu. From wait3.c by Eric R. Smith */ #include #include #include #include #include #include #include extern int __mint; extern long __waitval; /* in thread.c */ int waitpid(pid, status, options) pid_t pid; union wait *status; int options; { long r; int exit_status, sig_term; if (__mint == 0) { r = __waitval; __waitval = -ENOENT; } else r = Pwaitpid(pid, options, 0L); if (r < 0) { errno = (int) -r; return -1; } pid = (int) ((r & 0xffff0000L) >> 16); if (pid) { status->_i = 0; if ( ((short)r) == -32) { sig_term = SIGINT; exit_status = 0; } else { exit_status = (int) (r & 0x000000ffL); sig_term = (int) ((r & 0x00007f00L) >> 8); } if (sig_term && exit_status != 0 && exit_status != 0177) sig_term = 0; if (exit_status == 0177 && sig_term) { status->w_termsig = WSTOPPED; status->w_stopsig = sig_term; } else { status->w_termsig = sig_term; status->w_retcode = exit_status; } status->w_coredump = 0; } return pid; }