1 | /* Convenience declarations when working with <signal.h>. |
2 | |
3 | Copyright (C) 2008-2019 Free Software Foundation, Inc. |
4 | |
5 | This program is free software: you can redistribute it and/or modify |
6 | it under the terms of the GNU General Public License as published by |
7 | the Free Software Foundation; either version 3 of the License, or |
8 | (at your option) any later version. |
9 | |
10 | This program is distributed in the hope that it will be useful, |
11 | but WITHOUT ANY WARRANTY; without even the implied warranty of |
12 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
13 | GNU General Public License for more details. |
14 | |
15 | You should have received a copy of the GNU General Public License |
16 | along with this program. If not, see <https://www.gnu.org/licenses/>. */ |
17 | |
18 | #ifndef _GL_SIG_HANDLER_H |
19 | #define _GL_SIG_HANDLER_H |
20 | |
21 | #include <signal.h> |
22 | |
23 | #ifndef _GL_INLINE_HEADER_BEGIN |
24 | #error "Please include config.h first." |
25 | #endif |
26 | _GL_INLINE_HEADER_BEGIN |
27 | #ifndef SIG_HANDLER_INLINE |
28 | # define SIG_HANDLER_INLINE _GL_INLINE |
29 | #endif |
30 | |
31 | /* Convenience type when working with signal handlers. */ |
32 | typedef void (*sa_handler_t) (int); |
33 | |
34 | /* Return the handler of a signal, as a sa_handler_t value regardless |
35 | of its true type. The resulting function can be compared to |
36 | special values like SIG_IGN but it is not portable to call it. */ |
37 | SIG_HANDLER_INLINE sa_handler_t _GL_ATTRIBUTE_PURE |
38 | get_handler (struct sigaction const *a) |
39 | { |
40 | /* POSIX says that special values like SIG_IGN can only occur when |
41 | action.sa_flags does not contain SA_SIGINFO. But in Linux 2.4, |
42 | for example, sa_sigaction and sa_handler are aliases and a signal |
43 | is ignored if sa_sigaction (after casting) equals SIG_IGN. In |
44 | this case, this implementation relies on the fact that the two |
45 | are aliases, and simply returns sa_handler. */ |
46 | return a->sa_handler; |
47 | } |
48 | |
49 | _GL_INLINE_HEADER_END |
50 | |
51 | #endif /* _GL_SIG_HANDLER_H */ |
52 | |