xref: /plan9/sys/src/ape/lib/ap/plan9/wait.c (revision 219b2ee8daee37f4aad58d63f21287faa8e4ffdc)
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