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