13e12c5d1SDavid du Colombier #include "lib.h" 23e12c5d1SDavid du Colombier #include <stdlib.h> 33e12c5d1SDavid du Colombier #include <sys/wait.h> 4*219b2ee8SDavid du Colombier #include <sys/stat.h> 5*219b2ee8SDavid du Colombier #include <unistd.h> 63e12c5d1SDavid du Colombier #include <errno.h> 7*219b2ee8SDavid du Colombier #include <stdio.h> 83e12c5d1SDavid du Colombier #include "sys9.h" 93e12c5d1SDavid du Colombier 103e12c5d1SDavid du Colombier pid_t 113e12c5d1SDavid du Colombier wait(int *stat_loc) 123e12c5d1SDavid du Colombier { 133e12c5d1SDavid du Colombier return waitpid(-1, stat_loc, 0); 143e12c5d1SDavid du Colombier } 153e12c5d1SDavid du Colombier 163e12c5d1SDavid du Colombier pid_t 173e12c5d1SDavid du Colombier waitpid(int pid, int *stat_loc, int options) 183e12c5d1SDavid du Colombier { 193e12c5d1SDavid du Colombier int n, i, wfd, r, t, wpid; 20*219b2ee8SDavid du Colombier char *bp, *ep, pname[50]; 21*219b2ee8SDavid du Colombier struct stat buf; 223e12c5d1SDavid du Colombier Waitmsg w; 233e12c5d1SDavid du Colombier 24*219b2ee8SDavid du Colombier if(options&WNOHANG){ 25*219b2ee8SDavid du Colombier sprintf(pname, "/proc/%d/wait", getpid()); 26*219b2ee8SDavid du Colombier i = stat(pname, &buf); 27*219b2ee8SDavid du Colombier if(i >=0 && buf.st_size==0) 28*219b2ee8SDavid du Colombier return 0; 29*219b2ee8SDavid du Colombier } 303e12c5d1SDavid du Colombier n = 0; 313e12c5d1SDavid du Colombier while(n==0){ 323e12c5d1SDavid du Colombier n = _WAIT(&w); 333e12c5d1SDavid du Colombier if(n < 0){ 343e12c5d1SDavid du Colombier _syserrno(); 353e12c5d1SDavid du Colombier }else{ 363e12c5d1SDavid du Colombier wpid = strtol(w.pid, 0, 0); 373e12c5d1SDavid du Colombier if(pid>0 && wpid!=pid) 383e12c5d1SDavid du Colombier continue; 393e12c5d1SDavid du Colombier n = wpid; 403e12c5d1SDavid du Colombier if(stat_loc){ 413e12c5d1SDavid du Colombier r = 0; 423e12c5d1SDavid du Colombier t = 0; 433e12c5d1SDavid du Colombier if(w.msg[0]){ 44*219b2ee8SDavid du Colombier /* message is 'prog pid:string' */ 45*219b2ee8SDavid du Colombier bp = w.msg; 46*219b2ee8SDavid du Colombier while(*bp){ 47*219b2ee8SDavid du Colombier if(*bp++ == ':') 48*219b2ee8SDavid du Colombier break; 49*219b2ee8SDavid du Colombier } 50*219b2ee8SDavid du Colombier if(*bp == 0) 51*219b2ee8SDavid du Colombier bp = w.msg; 52*219b2ee8SDavid du Colombier r = strtol(bp, &ep, 10); 533e12c5d1SDavid du Colombier if(*ep == 0){ 543e12c5d1SDavid du Colombier if(r < 0 || r >= 256) 553e12c5d1SDavid du Colombier r = 1; 563e12c5d1SDavid du Colombier }else{ 57*219b2ee8SDavid du Colombier t = _stringsig(bp); 583e12c5d1SDavid du Colombier if(t == 0) 593e12c5d1SDavid du Colombier r = 1; 603e12c5d1SDavid du Colombier } 613e12c5d1SDavid du Colombier } 623e12c5d1SDavid du Colombier *stat_loc = (r << 8) | t; 633e12c5d1SDavid du Colombier } 643e12c5d1SDavid du Colombier } 653e12c5d1SDavid du Colombier } 663e12c5d1SDavid du Colombier return n; 673e12c5d1SDavid du Colombier } 683e12c5d1SDavid du Colombier 69