Initial revision
[mmh] / sbr / pidwait.c
1
2 /*
3  * pidwait.c -- wait for child to exit
4  *
5  * $Id$
6  */
7
8 #include <h/mh.h>
9 #include <h/signals.h>
10 #include <signal.h>
11
12 #ifdef HAVE_SYS_WAIT_H
13 # include <sys/wait.h>
14 #endif
15
16 int
17 pidwait (pid_t id, int sigsok)
18 {
19     pid_t pid;
20     sigset_t set, oset;
21
22 #ifdef WAITINT
23     int status;
24 #else
25     union wait status;
26 #endif
27
28     if (sigsok == -1) {
29         /* block a couple of signals */
30         sigemptyset (&set);
31         sigaddset (&set, SIGINT);
32         sigaddset (&set, SIGQUIT);
33         SIGPROCMASK (SIG_BLOCK, &set, &oset);
34     }
35
36 #ifdef HAVE_WAITPID
37     pid = waitpid(id, &status, 0);
38 #else
39     while ((pid = wait(&status)) != -1 && pid != id)
40         continue;
41 #endif
42
43     if (sigsok == -1) {
44         /* reset the signal mask */
45         SIGPROCMASK (SIG_SETMASK, &oset, &set);
46     }
47
48 #ifdef WAITINT
49     return (pid == -1 ? -1 : status);
50 #else
51     return (pid == -1 ? -1 : status.w_status);
52 #endif
53 }