Import (slightly modified) ru.koi8-r.win.kbd:1.1 from FreeBSD (fjoe):
[dragonfly.git] / contrib / diffutils-2.8.1 / lib / waitpid.c
1 /* Emulate waitpid on systems that just have wait.
2    Copyright (C) 1994, 1995, 1998, 1999 Free Software Foundation, Inc.
3
4    This program is free software; you can redistribute it and/or modify
5    it under the terms of the GNU General Public License as published by
6    the Free Software Foundation; either version 2, or (at your option)
7    any later version.
8
9    This program is distributed in the hope that it will be useful,
10    but WITHOUT ANY WARRANTY; without even the implied warranty of
11    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12    GNU General Public License for more details.
13
14    You should have received a copy of the GNU General Public License
15    along with this program; see the file COPYING.
16    If not, write to the Free Software Foundation,
17    59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.  */
18
19 #if HAVE_CONFIG_H
20 # include <config.h>
21 #endif
22
23 #include <errno.h>
24 #ifndef errno
25 extern int errno;
26 #endif
27
28 #define WAITPID_CHILDREN 8
29 static pid_t waited_pid[WAITPID_CHILDREN];
30 static int waited_status[WAITPID_CHILDREN];
31
32 pid_t
33 waitpid (pid_t pid, int *stat_loc, int options)
34 {
35   int i;
36   pid_t p;
37
38   if (!options && (pid == -1 || 0 < pid))
39     {
40       /* If we have already waited for this child, return it immediately.  */
41       for (i = 0;  i < WAITPID_CHILDREN;  i++)
42         {
43           p = waited_pid[i];
44           if (p && (p == pid || pid == -1))
45             {
46               waited_pid[i] = 0;
47               goto success;
48             }
49         }
50
51       /* The child has not returned yet; wait for it, accumulating status.  */
52       for (i = 0;  i < WAITPID_CHILDREN;  i++)
53         if (! waited_pid[i])
54           {
55             p = wait (&waited_status[i]);
56             if (p < 0)
57               return p;
58             if (p == pid || pid == -1)
59               goto success;
60             waited_pid[i] = p;
61           }
62     }
63
64   /* We cannot emulate this wait call, e.g. because of too many children.  */
65   errno = EINVAL;
66   return -1;
67
68 success:
69   if (stat_loc)
70     *stat_loc = waited_status[i];
71   return p;
72 }