main shrub/shrubtools / shared / wait_pid.c
 1/* Public domain. */
 2
 3#include <sys/types.h>
 4#include <sys/wait.h>
 5#include "error.h"
 6#include "haswaitp.h"
 7
 8#ifdef HASWAITPID
 9
10int wait_pid(wstat,pid) int *wstat; int pid;
11{
12  int r;
13
14  do
15    r = waitpid(pid,wstat,0);
16  while ((r == -1) && (errno == error_intr));
17  return r;
18}
19
20#else
21
22/* XXX untested */
23/* XXX breaks down with more than two children */
24static int oldpid = 0;
25static int oldwstat; /* defined if(oldpid) */
26
27int wait_pid(wstat,pid) int *wstat; int pid;
28{
29  int r;
30
31  if (pid == oldpid) { *wstat = oldwstat; oldpid = 0; return pid; }
32
33  do {
34    r = wait(wstat);
35    if ((r != pid) && (r != -1)) { oldwstat = *wstat; oldpid = r; continue; }
36  }
37  while ((r == -1) && (errno == error_intr));
38  return r;
39}
40
41#endif