source: trunk/third/findutils/lib/waitpid.c @ 18890

Revision 18890, 1.9 KB checked in by zacheiss, 22 years ago (diff)
This commit was generated by cvs2svn to compensate for changes in r18889, which included commits to RCS files with non-trunk default branches.
Line 
1/* Emulate waitpid on systems that just have wait.
2   Copyright 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
25extern int errno;
26#endif
27
28#define WAITPID_CHILDREN 8
29static pid_t waited_pid[WAITPID_CHILDREN];
30static int waited_status[WAITPID_CHILDREN];
31
32pid_t
33waitpid (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
68success:
69  if (stat_loc)
70    *stat_loc = waited_status[i];
71  return p;
72}
Note: See TracBrowser for help on using the repository browser.