e007372f2109f43bf1b542b2c032f1b305aba007
[platform/upstream/glibc.git] / sysdeps / unix / sysv / linux / internal-signals.h
1 /* Special use of signals internally.  Linux version.
2    Copyright (C) 2014-2018 Free Software Foundation, Inc.
3    This file is part of the GNU C Library.
4
5    The GNU C Library is free software; you can redistribute it and/or
6    modify it under the terms of the GNU Lesser General Public
7    License as published by the Free Software Foundation; either
8    version 2.1 of the License, or (at your option) any later version.
9
10    The GNU C Library 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 GNU
13    Lesser General Public License for more details.
14
15    You should have received a copy of the GNU Lesser General Public
16    License along with the GNU C Library; if not, see
17    <http://www.gnu.org/licenses/>.  */
18
19 #ifndef __INTERNAL_SIGNALS_H
20 # define __INTERNAL_SIGNALS_H
21
22 #include <signal.h>
23 #include <sigsetops.h>
24
25 /* The signal used for asynchronous cancelation.  */
26 #define SIGCANCEL       __SIGRTMIN
27
28
29 /* Signal needed for the kernel-supported POSIX timer implementation.
30    We can reuse the cancellation signal since we can distinguish
31    cancellation from timer expirations.  */
32 #define SIGTIMER        SIGCANCEL
33
34
35 /* Signal used to implement the setuid et.al. functions.  */
36 #define SIGSETXID       (__SIGRTMIN + 1)
37
38
39 /* Return is sig is used internally.  */
40 static inline int
41 __is_internal_signal (int sig)
42 {
43   return (sig == SIGCANCEL) || (sig == SIGSETXID);
44 }
45
46 /* Remove internal glibc signal from the mask.  */
47 static inline void
48 __clear_internal_signals (sigset_t *set)
49 {
50   __sigdelset (set, SIGCANCEL);
51   __sigdelset (set, SIGSETXID);
52 }
53
54 #define SIGALL_SET \
55   ((__sigset_t) { .__val = {[0 ...  _SIGSET_NWORDS-1 ] =  -1 } })
56
57 /* Block all signals, including internal glibc ones.  */
58 static inline int
59 __libc_signal_block_all (sigset_t *set)
60 {
61   INTERNAL_SYSCALL_DECL (err);
62   return INTERNAL_SYSCALL (rt_sigprocmask, err, 4, SIG_BLOCK, &SIGALL_SET,
63                            set, _NSIG / 8);
64 }
65
66 /* Block all application signals (excluding internal glibc ones).  */
67 static inline int
68 __libc_signal_block_app (sigset_t *set)
69 {
70   sigset_t allset = SIGALL_SET;
71   __clear_internal_signals (&allset);
72   INTERNAL_SYSCALL_DECL (err);
73   return INTERNAL_SYSCALL (rt_sigprocmask, err, 4, SIG_BLOCK, &allset, set,
74                            _NSIG / 8);
75 }
76
77 /* Restore current process signal mask.  */
78 static inline int
79 __libc_signal_restore_set (const sigset_t *set)
80 {
81   INTERNAL_SYSCALL_DECL (err);
82   return INTERNAL_SYSCALL (rt_sigprocmask, err, 4, SIG_SETMASK, set, NULL,
83                            _NSIG / 8);
84 }
85
86 /* Used to communicate with signal handler.  */
87 extern struct xid_command *__xidcmd attribute_hidden;
88
89 #endif