annotate lib/sigprocmask.c @ 9084:2932e92d6e31

* lib/version-etc.c (version_etc_va): Default to GPLv3+. * NEWS: Document this change.
author Eric Blake <ebb9@byu.net>
date Tue, 10 Jul 2007 12:22:36 +0000
parents bb4e89fdfa87
children bbbbbf4cd1c5
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
7503
a55a9e67f244 New module 'sigprocmask'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
1 /* POSIX compatible signal blocking.
8783
bb4e89fdfa87 sigprocmask.h is replaced with <signal.h>.
Bruno Haible <bruno@clisp.org>
parents: 7517
diff changeset
2 Copyright (C) 2006-2007 Free Software Foundation, Inc.
7503
a55a9e67f244 New module 'sigprocmask'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
3 Written by Bruno Haible <bruno@clisp.org>, 2006.
a55a9e67f244 New module 'sigprocmask'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
4
a55a9e67f244 New module 'sigprocmask'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
5 This program is free software; you can redistribute it and/or modify
a55a9e67f244 New module 'sigprocmask'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
6 it under the terms of the GNU General Public License as published by
a55a9e67f244 New module 'sigprocmask'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
7 the Free Software Foundation; either version 2, or (at your option)
a55a9e67f244 New module 'sigprocmask'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
8 any later version.
a55a9e67f244 New module 'sigprocmask'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
9
a55a9e67f244 New module 'sigprocmask'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
10 This program is distributed in the hope that it will be useful,
a55a9e67f244 New module 'sigprocmask'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
11 but WITHOUT ANY WARRANTY; without even the implied warranty of
a55a9e67f244 New module 'sigprocmask'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
a55a9e67f244 New module 'sigprocmask'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
13 GNU General Public License for more details.
a55a9e67f244 New module 'sigprocmask'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
14
a55a9e67f244 New module 'sigprocmask'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
15 You should have received a copy of the GNU General Public License
a55a9e67f244 New module 'sigprocmask'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
16 along with this program; if not, write to the Free Software Foundation,
a55a9e67f244 New module 'sigprocmask'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
17 Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
a55a9e67f244 New module 'sigprocmask'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
18
a55a9e67f244 New module 'sigprocmask'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
19 #include <config.h>
a55a9e67f244 New module 'sigprocmask'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
20
a55a9e67f244 New module 'sigprocmask'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
21 /* Specification. */
8783
bb4e89fdfa87 sigprocmask.h is replaced with <signal.h>.
Bruno Haible <bruno@clisp.org>
parents: 7517
diff changeset
22 #include <signal.h>
7503
a55a9e67f244 New module 'sigprocmask'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
23
a55a9e67f244 New module 'sigprocmask'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
24 #include <errno.h>
a55a9e67f244 New module 'sigprocmask'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
25 #include <stdint.h>
a55a9e67f244 New module 'sigprocmask'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
26 #include <stdlib.h>
a55a9e67f244 New module 'sigprocmask'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
27
a55a9e67f244 New module 'sigprocmask'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
28 /* We assume that a platform without POSIX signal blocking functions also
a55a9e67f244 New module 'sigprocmask'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
29 does not have the POSIX sigaction() function, only the signal() function.
a55a9e67f244 New module 'sigprocmask'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
30 This is true for Woe32 platforms. */
a55a9e67f244 New module 'sigprocmask'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
31
a55a9e67f244 New module 'sigprocmask'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
32 /* A signal handler. */
a55a9e67f244 New module 'sigprocmask'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
33 typedef void (*handler_t) (int signal);
a55a9e67f244 New module 'sigprocmask'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
34
a55a9e67f244 New module 'sigprocmask'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
35 int
a55a9e67f244 New module 'sigprocmask'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
36 sigismember (const sigset_t *set, int sig)
a55a9e67f244 New module 'sigprocmask'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
37 {
a55a9e67f244 New module 'sigprocmask'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
38 if (sig >= 0 && sig < NSIG)
a55a9e67f244 New module 'sigprocmask'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
39 return (*set >> sig) & 1;
a55a9e67f244 New module 'sigprocmask'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
40 else
a55a9e67f244 New module 'sigprocmask'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
41 return 0;
a55a9e67f244 New module 'sigprocmask'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
42 }
a55a9e67f244 New module 'sigprocmask'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
43
a55a9e67f244 New module 'sigprocmask'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
44 int
a55a9e67f244 New module 'sigprocmask'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
45 sigemptyset (sigset_t *set)
a55a9e67f244 New module 'sigprocmask'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
46 {
a55a9e67f244 New module 'sigprocmask'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
47 *set = 0;
a55a9e67f244 New module 'sigprocmask'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
48 return 0;
a55a9e67f244 New module 'sigprocmask'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
49 }
a55a9e67f244 New module 'sigprocmask'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
50
a55a9e67f244 New module 'sigprocmask'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
51 int
a55a9e67f244 New module 'sigprocmask'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
52 sigaddset (sigset_t *set, int sig)
a55a9e67f244 New module 'sigprocmask'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
53 {
a55a9e67f244 New module 'sigprocmask'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
54 if (sig >= 0 && sig < NSIG)
a55a9e67f244 New module 'sigprocmask'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
55 {
a55a9e67f244 New module 'sigprocmask'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
56 *set |= 1U << sig;
a55a9e67f244 New module 'sigprocmask'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
57 return 0;
a55a9e67f244 New module 'sigprocmask'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
58 }
a55a9e67f244 New module 'sigprocmask'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
59 else
a55a9e67f244 New module 'sigprocmask'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
60 {
a55a9e67f244 New module 'sigprocmask'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
61 errno = EINVAL;
a55a9e67f244 New module 'sigprocmask'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
62 return -1;
a55a9e67f244 New module 'sigprocmask'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
63 }
a55a9e67f244 New module 'sigprocmask'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
64 }
a55a9e67f244 New module 'sigprocmask'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
65
a55a9e67f244 New module 'sigprocmask'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
66 int
a55a9e67f244 New module 'sigprocmask'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
67 sigdelset (sigset_t *set, int sig)
a55a9e67f244 New module 'sigprocmask'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
68 {
a55a9e67f244 New module 'sigprocmask'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
69 if (sig >= 0 && sig < NSIG)
a55a9e67f244 New module 'sigprocmask'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
70 {
a55a9e67f244 New module 'sigprocmask'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
71 *set &= ~(1U << sig);
a55a9e67f244 New module 'sigprocmask'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
72 return 0;
a55a9e67f244 New module 'sigprocmask'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
73 }
a55a9e67f244 New module 'sigprocmask'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
74 else
a55a9e67f244 New module 'sigprocmask'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
75 {
a55a9e67f244 New module 'sigprocmask'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
76 errno = EINVAL;
a55a9e67f244 New module 'sigprocmask'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
77 return -1;
a55a9e67f244 New module 'sigprocmask'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
78 }
a55a9e67f244 New module 'sigprocmask'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
79 }
a55a9e67f244 New module 'sigprocmask'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
80
a55a9e67f244 New module 'sigprocmask'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
81 int
a55a9e67f244 New module 'sigprocmask'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
82 sigfillset (sigset_t *set)
a55a9e67f244 New module 'sigprocmask'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
83 {
a55a9e67f244 New module 'sigprocmask'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
84 *set = (2U << (NSIG - 1)) - 1;
a55a9e67f244 New module 'sigprocmask'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
85 return 0;
a55a9e67f244 New module 'sigprocmask'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
86 }
a55a9e67f244 New module 'sigprocmask'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
87
a55a9e67f244 New module 'sigprocmask'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
88 /* Set of currently blocked signals. */
a55a9e67f244 New module 'sigprocmask'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
89 static sigset_t blocked_set /* = 0 */;
a55a9e67f244 New module 'sigprocmask'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
90
a55a9e67f244 New module 'sigprocmask'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
91 /* Set of currently blocked and pending signals. */
a55a9e67f244 New module 'sigprocmask'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
92 static volatile sig_atomic_t pending_array[NSIG] /* = { 0 } */;
a55a9e67f244 New module 'sigprocmask'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
93
a55a9e67f244 New module 'sigprocmask'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
94 /* Signal handler that is installed for blocked signals. */
a55a9e67f244 New module 'sigprocmask'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
95 static void
a55a9e67f244 New module 'sigprocmask'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
96 blocked_handler (int sig)
a55a9e67f244 New module 'sigprocmask'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
97 {
a55a9e67f244 New module 'sigprocmask'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
98 if (sig >= 0 && sig < NSIG)
a55a9e67f244 New module 'sigprocmask'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
99 pending_array[sig] = 1;
a55a9e67f244 New module 'sigprocmask'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
100 }
a55a9e67f244 New module 'sigprocmask'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
101
a55a9e67f244 New module 'sigprocmask'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
102 int
a55a9e67f244 New module 'sigprocmask'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
103 sigpending (sigset_t *set)
a55a9e67f244 New module 'sigprocmask'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
104 {
a55a9e67f244 New module 'sigprocmask'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
105 sigset_t pending = 0;
a55a9e67f244 New module 'sigprocmask'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
106 int sig;
a55a9e67f244 New module 'sigprocmask'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
107
a55a9e67f244 New module 'sigprocmask'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
108 for (sig = 0; sig < NSIG; sig++)
a55a9e67f244 New module 'sigprocmask'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
109 if (pending_array[sig])
a55a9e67f244 New module 'sigprocmask'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
110 pending |= 1U << sig;
a55a9e67f244 New module 'sigprocmask'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
111 return pending;
a55a9e67f244 New module 'sigprocmask'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
112 }
a55a9e67f244 New module 'sigprocmask'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
113
a55a9e67f244 New module 'sigprocmask'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
114 /* The previous signal handlers.
a55a9e67f244 New module 'sigprocmask'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
115 Only the array elements corresponding to blocked signals are relevant. */
a55a9e67f244 New module 'sigprocmask'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
116 static handler_t old_handlers[NSIG];
a55a9e67f244 New module 'sigprocmask'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
117
a55a9e67f244 New module 'sigprocmask'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
118 int
a55a9e67f244 New module 'sigprocmask'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
119 sigprocmask (int operation, const sigset_t *set, sigset_t *old_set)
a55a9e67f244 New module 'sigprocmask'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
120 {
a55a9e67f244 New module 'sigprocmask'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
121 if (old_set != NULL)
a55a9e67f244 New module 'sigprocmask'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
122 *old_set = blocked_set;
a55a9e67f244 New module 'sigprocmask'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
123
a55a9e67f244 New module 'sigprocmask'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
124 if (set != NULL)
a55a9e67f244 New module 'sigprocmask'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
125 {
a55a9e67f244 New module 'sigprocmask'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
126 sigset_t new_blocked_set;
a55a9e67f244 New module 'sigprocmask'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
127 sigset_t to_unblock;
a55a9e67f244 New module 'sigprocmask'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
128 sigset_t to_block;
a55a9e67f244 New module 'sigprocmask'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
129
a55a9e67f244 New module 'sigprocmask'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
130 switch (operation)
a55a9e67f244 New module 'sigprocmask'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
131 {
a55a9e67f244 New module 'sigprocmask'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
132 case SIG_BLOCK:
a55a9e67f244 New module 'sigprocmask'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
133 new_blocked_set = blocked_set | *set;
a55a9e67f244 New module 'sigprocmask'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
134 break;
a55a9e67f244 New module 'sigprocmask'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
135 case SIG_SETMASK:
a55a9e67f244 New module 'sigprocmask'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
136 new_blocked_set = *set;
a55a9e67f244 New module 'sigprocmask'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
137 break;
a55a9e67f244 New module 'sigprocmask'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
138 case SIG_UNBLOCK:
a55a9e67f244 New module 'sigprocmask'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
139 new_blocked_set = blocked_set & ~*set;
a55a9e67f244 New module 'sigprocmask'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
140 break;
a55a9e67f244 New module 'sigprocmask'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
141 default:
a55a9e67f244 New module 'sigprocmask'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
142 errno = EINVAL;
a55a9e67f244 New module 'sigprocmask'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
143 return -1;
a55a9e67f244 New module 'sigprocmask'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
144 }
a55a9e67f244 New module 'sigprocmask'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
145 to_unblock = blocked_set & ~new_blocked_set;
a55a9e67f244 New module 'sigprocmask'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
146 to_block = new_blocked_set & ~blocked_set;
a55a9e67f244 New module 'sigprocmask'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
147
a55a9e67f244 New module 'sigprocmask'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
148 if (to_block != 0)
a55a9e67f244 New module 'sigprocmask'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
149 {
a55a9e67f244 New module 'sigprocmask'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
150 int sig;
a55a9e67f244 New module 'sigprocmask'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
151
a55a9e67f244 New module 'sigprocmask'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
152 for (sig = 0; sig < NSIG; sig++)
a55a9e67f244 New module 'sigprocmask'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
153 if ((to_block >> sig) & 1)
a55a9e67f244 New module 'sigprocmask'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
154 {
a55a9e67f244 New module 'sigprocmask'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
155 pending_array[sig] = 0;
a55a9e67f244 New module 'sigprocmask'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
156 if ((old_handlers[sig] = signal (sig, blocked_handler)) != SIG_ERR)
a55a9e67f244 New module 'sigprocmask'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
157 blocked_set |= 1U << sig;
a55a9e67f244 New module 'sigprocmask'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
158 }
a55a9e67f244 New module 'sigprocmask'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
159 }
a55a9e67f244 New module 'sigprocmask'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
160
a55a9e67f244 New module 'sigprocmask'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
161 if (to_unblock != 0)
a55a9e67f244 New module 'sigprocmask'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
162 {
a55a9e67f244 New module 'sigprocmask'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
163 sig_atomic_t received[NSIG];
a55a9e67f244 New module 'sigprocmask'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
164 int sig;
a55a9e67f244 New module 'sigprocmask'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
165
a55a9e67f244 New module 'sigprocmask'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
166 for (sig = 0; sig < NSIG; sig++)
a55a9e67f244 New module 'sigprocmask'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
167 if ((to_unblock >> sig) & 1)
a55a9e67f244 New module 'sigprocmask'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
168 {
a55a9e67f244 New module 'sigprocmask'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
169 if (signal (sig, old_handlers[sig]) != blocked_handler)
a55a9e67f244 New module 'sigprocmask'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
170 /* The application changed a signal handler while the signal
a55a9e67f244 New module 'sigprocmask'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
171 was blocked. We don't support this. */
a55a9e67f244 New module 'sigprocmask'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
172 abort ();
a55a9e67f244 New module 'sigprocmask'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
173 received[sig] = pending_array[sig];
a55a9e67f244 New module 'sigprocmask'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
174 blocked_set &= ~(1U << sig);
a55a9e67f244 New module 'sigprocmask'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
175 pending_array[sig] = 0;
a55a9e67f244 New module 'sigprocmask'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
176 }
a55a9e67f244 New module 'sigprocmask'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
177 else
a55a9e67f244 New module 'sigprocmask'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
178 received[sig] = 0;
a55a9e67f244 New module 'sigprocmask'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
179
a55a9e67f244 New module 'sigprocmask'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
180 for (sig = 0; sig < NSIG; sig++)
7517
55b0b8000058 * lib/sigprocmask.c (sigprocmask): Fix typo.
Eric Blake <ebb9@byu.net>
parents: 7503
diff changeset
181 if (received[sig])
7503
a55a9e67f244 New module 'sigprocmask'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
182 {
a55a9e67f244 New module 'sigprocmask'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
183 #if HAVE_RAISE
a55a9e67f244 New module 'sigprocmask'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
184 raise (sig);
a55a9e67f244 New module 'sigprocmask'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
185 #else
a55a9e67f244 New module 'sigprocmask'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
186 kill (getpid (), sig);
a55a9e67f244 New module 'sigprocmask'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
187 #endif
a55a9e67f244 New module 'sigprocmask'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
188 }
a55a9e67f244 New module 'sigprocmask'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
189 }
a55a9e67f244 New module 'sigprocmask'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
190 }
a55a9e67f244 New module 'sigprocmask'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
191 return 0;
a55a9e67f244 New module 'sigprocmask'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
192 }