]> CyberLeo.Net >> Repos - FreeBSD/releng/9.2.git/blob - contrib/cvs/lib/waitpid.c
- Copy stable/9 to releng/9.2 as part of the 9.2-RELEASE cycle.
[FreeBSD/releng/9.2.git] / contrib / cvs / lib / waitpid.c
1 #ifdef HAVE_CONFIG_H
2 #include "config.h"
3 #endif
4
5 #include "system.h"
6 #include "wait.h"
7
8 #include <stdio.h>
9
10 struct unreaped {
11   pid_t pid;
12   int status;
13 };
14 static struct unreaped *unreaped;
15 static int n;
16
17 static struct unreaped *ualloc (oldptr, n)
18      struct unreaped *oldptr;
19      int n;
20 {
21   n *= sizeof (struct unreaped);
22   if (n == 0)
23     n = 1;
24   if (oldptr)
25     oldptr = (struct unreaped *) realloc ((char *) oldptr, n);
26   else
27     oldptr = (struct unreaped *) malloc (n);
28   if (oldptr == 0)
29     {
30       fprintf (stderr, "cannot allocate %d bytes\n", n);
31       exit (1);
32     }
33   return oldptr;
34 }
35
36 pid_t waitpid (pid, status, options)
37      pid_t pid;
38      int *status;
39      int options;
40 {
41   int i;
42
43   /* initialize */
44   if (unreaped == 0)
45     {
46       unreaped = ualloc (unreaped, 1);
47       unreaped[0].pid = 0;
48       n = 1;
49     }
50
51   for (i = 0; unreaped[i].pid; i++)
52     if (unreaped[i].pid == pid)
53       {
54         *status = unreaped[i].status;
55         while (unreaped[i].pid)
56           {
57             unreaped[i] = unreaped[i+1];
58             i++;
59           }
60         n--;
61         return pid;
62       }
63
64   while (1)
65     {
66 #ifdef HAVE_WAIT3
67       pid_t p = wait3 (status, options, (struct rusage *) 0);
68 #else
69       pid_t p = wait (status);
70 #endif
71
72       if (p == 0 || p == -1 || p == pid)
73         return p;
74
75       n++;
76       unreaped = ualloc (unreaped, n);
77       unreaped[n-1].pid = p;
78       unreaped[n-1].status = *status;
79     }
80 }