]>
Commit | Line | Data |
---|---|---|
af69217f UD |
1 | /* Copyright (C) 1998 Free Software Foundation, Inc. |
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 | |
5 | modify it under the terms of the GNU Library General Public License as | |
6 | published by the Free Software Foundation; either version 2 of the | |
7 | License, or (at your option) any later version. | |
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 | |
12 | Library General Public License for more details. | |
13 | ||
14 | You should have received a copy of the GNU Library General Public | |
15 | License along with the GNU C Library; see the file COPYING.LIB. If not, | |
16 | write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, | |
17 | Boston, MA 02111-1307, USA. */ | |
18 | ||
19 | #include <errno.h> | |
8619129f UD |
20 | #define __need_NULL |
21 | #include <stddef.h> | |
af69217f UD |
22 | #include <signal.h> |
23 | ||
24 | ||
25 | /* Set the disposition for SIG. */ | |
26 | __sighandler_t | |
27 | sigset (sig, disp) | |
28 | int sig; | |
29 | __sighandler_t disp; | |
30 | { | |
31 | struct sigaction act, oact; | |
32 | ||
9d141cae | 33 | #ifdef SIG_HOLD |
af69217f UD |
34 | /* Handle SIG_HOLD first. */ |
35 | if (disp == SIG_HOLD) | |
36 | { | |
37 | sigset_t set; | |
38 | ||
39 | /* Retrieve current signal set. */ | |
40 | if (__sigprocmask (SIG_SETMASK, NULL, &set) < 0) | |
41 | return SIG_ERR; | |
42 | ||
43 | /* Add the specified signal. */ | |
44 | if (sigaddset (&set, sig) < 0) | |
45 | return SIG_ERR; | |
46 | ||
47 | /* Set the new mask. */ | |
48 | if (__sigprocmask (SIG_SETMASK, &set, NULL) < 0) | |
49 | return SIG_ERR; | |
50 | ||
51 | return SIG_HOLD; | |
52 | } | |
9d141cae | 53 | #endif /* SIG_HOLD */ |
af69217f UD |
54 | |
55 | /* Check signal extents to protect __sigismember. */ | |
56 | if (disp == SIG_ERR || sig < 1 || sig >= NSIG) | |
57 | { | |
58 | __set_errno (EINVAL); | |
59 | return SIG_ERR; | |
60 | } | |
61 | ||
62 | act.sa_handler = disp; | |
63 | if (__sigemptyset (&act.sa_mask) < 0) | |
64 | return SIG_ERR; | |
65 | act.sa_flags = 0; | |
66 | if (__sigaction (sig, &act, &oact) < 0) | |
67 | return SIG_ERR; | |
68 | ||
69 | return oact.sa_handler; | |
70 | } |