xref: /openbsd/gnu/usr.bin/cvs/lib/waitpid.c (revision 780d15df)
11e72d8d2Sderaadt #ifdef HAVE_CONFIG_H
21e72d8d2Sderaadt #include "config.h"
31e72d8d2Sderaadt #endif
41e72d8d2Sderaadt 
51e72d8d2Sderaadt #include "system.h"
61e72d8d2Sderaadt #include "wait.h"
71e72d8d2Sderaadt 
81e72d8d2Sderaadt #include <stdio.h>
91e72d8d2Sderaadt 
101e72d8d2Sderaadt struct unreaped {
111e72d8d2Sderaadt   pid_t pid;
121e72d8d2Sderaadt   int status;
131e72d8d2Sderaadt };
141e72d8d2Sderaadt static struct unreaped *unreaped;
151e72d8d2Sderaadt static int n;
161e72d8d2Sderaadt 
ualloc(oldptr,n)171e72d8d2Sderaadt static struct unreaped *ualloc (oldptr, n)
181e72d8d2Sderaadt      struct unreaped *oldptr;
191e72d8d2Sderaadt      int n;
201e72d8d2Sderaadt {
211e72d8d2Sderaadt   n *= sizeof (struct unreaped);
221e72d8d2Sderaadt   if (n == 0)
231e72d8d2Sderaadt     n = 1;
241e72d8d2Sderaadt   if (oldptr)
251e72d8d2Sderaadt     oldptr = (struct unreaped *) realloc ((char *) oldptr, n);
261e72d8d2Sderaadt   else
271e72d8d2Sderaadt     oldptr = (struct unreaped *) malloc (n);
281e72d8d2Sderaadt   if (oldptr == 0)
291e72d8d2Sderaadt     {
301e72d8d2Sderaadt       fprintf (stderr, "cannot allocate %d bytes\n", n);
311e72d8d2Sderaadt       exit (1);
321e72d8d2Sderaadt     }
331e72d8d2Sderaadt   return oldptr;
341e72d8d2Sderaadt }
351e72d8d2Sderaadt 
waitpid(pid,status,options)361e72d8d2Sderaadt pid_t waitpid (pid, status, options)
371e72d8d2Sderaadt      pid_t pid;
381e72d8d2Sderaadt      int *status;
391e72d8d2Sderaadt      int options;
401e72d8d2Sderaadt {
411e72d8d2Sderaadt   int i;
421e72d8d2Sderaadt 
431e72d8d2Sderaadt   /* initialize */
441e72d8d2Sderaadt   if (unreaped == 0)
451e72d8d2Sderaadt     {
461e72d8d2Sderaadt       unreaped = ualloc (unreaped, 1);
471e72d8d2Sderaadt       unreaped[0].pid = 0;
481e72d8d2Sderaadt       n = 1;
491e72d8d2Sderaadt     }
501e72d8d2Sderaadt 
511e72d8d2Sderaadt   for (i = 0; unreaped[i].pid; i++)
521e72d8d2Sderaadt     if (unreaped[i].pid == pid)
531e72d8d2Sderaadt       {
541e72d8d2Sderaadt 	*status = unreaped[i].status;
551e72d8d2Sderaadt 	while (unreaped[i].pid)
561e72d8d2Sderaadt 	  {
571e72d8d2Sderaadt 	    unreaped[i] = unreaped[i+1];
581e72d8d2Sderaadt 	    i++;
591e72d8d2Sderaadt 	  }
601e72d8d2Sderaadt 	n--;
611e72d8d2Sderaadt 	return pid;
621e72d8d2Sderaadt       }
631e72d8d2Sderaadt 
641e72d8d2Sderaadt   while (1)
651e72d8d2Sderaadt     {
66*780d15dfStholo #ifdef HAVE_WAIT3
671e72d8d2Sderaadt       pid_t p = wait3 (status, options, (struct rusage *) 0);
68*780d15dfStholo #else
69*780d15dfStholo       pid_t p = wait (status);
70*780d15dfStholo #endif
711e72d8d2Sderaadt 
721e72d8d2Sderaadt       if (p == 0 || p == -1 || p == pid)
731e72d8d2Sderaadt 	return p;
741e72d8d2Sderaadt 
751e72d8d2Sderaadt       n++;
761e72d8d2Sderaadt       unreaped = ualloc (unreaped, n);
771e72d8d2Sderaadt       unreaped[n-1].pid = p;
781e72d8d2Sderaadt       unreaped[n-1].status = *status;
791e72d8d2Sderaadt     }
801e72d8d2Sderaadt }
81