]>
Commit | Line | Data |
---|---|---|
b168057a | 1 | /* Copyright (C) 1991-2015 Free Software Foundation, Inc. |
d38cd08c UD |
2 | This file is part of the GNU C Library. |
3 | ||
4 | The GNU C Library is free software; you can redistribute it and/or | |
41bdb6e2 AJ |
5 | modify it under the terms of the GNU Lesser General Public |
6 | License as published by the Free Software Foundation; either | |
7 | version 2.1 of the License, or (at your option) any later version. | |
d38cd08c UD |
8 | |
9 | The GNU C Library 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 GNU | |
41bdb6e2 | 12 | Lesser General Public License for more details. |
d38cd08c | 13 | |
41bdb6e2 | 14 | You should have received a copy of the GNU Lesser General Public |
59ba27a6 PE |
15 | License along with the GNU C Library; if not, see |
16 | <http://www.gnu.org/licenses/>. */ | |
d38cd08c UD |
17 | |
18 | #include <errno.h> | |
19 | #include <signal.h> | |
99c7f870 UD |
20 | #include <string.h> /* For the real memset prototype. */ |
21 | ||
d38cd08c | 22 | |
df4ef2ab UD |
23 | /* Tolerate non-threads versions of Posix */ |
24 | #ifndef SA_ONESHOT | |
25 | #define SA_ONESHOT 0 | |
26 | #endif | |
27 | #ifndef SA_NOMASK | |
28 | #define SA_NOMASK 0 | |
29 | #endif | |
30 | #ifndef SA_INTERRUPT | |
31 | #define SA_INTERRUPT 0 | |
32 | #endif | |
d38cd08c UD |
33 | |
34 | /* Set the handler for the signal SIG to HANDLER, | |
35 | returning the old handler, or SIG_ERR on error. */ | |
36 | __sighandler_t | |
bd2260a2 | 37 | __sysv_signal (int sig, __sighandler_t handler) |
d38cd08c UD |
38 | { |
39 | struct sigaction act, oact; | |
40 | ||
41 | /* Check signal extents to protect __sigismember. */ | |
42 | if (handler == SIG_ERR || sig < 1 || sig >= NSIG) | |
43 | { | |
44 | __set_errno (EINVAL); | |
45 | return SIG_ERR; | |
46 | } | |
47 | ||
48 | act.sa_handler = handler; | |
49 | if (__sigemptyset (&act.sa_mask) < 0) | |
50 | return SIG_ERR; | |
df4ef2ab UD |
51 | act.sa_flags = SA_ONESHOT | SA_NOMASK | SA_INTERRUPT; |
52 | act.sa_flags &= ~SA_RESTART; | |
d38cd08c UD |
53 | if (__sigaction (sig, &act, &oact) < 0) |
54 | return SIG_ERR; | |
55 | ||
56 | return oact.sa_handler; | |
57 | } | |
f43ce637 UD |
58 | |
59 | weak_alias (__sysv_signal, sysv_signal) |