1 /*
2 * sigprocmask() for uClibc
3 *
4 * Copyright (C) 2000-2006 Erik Andersen <andersen@uclibc.org>
5 *
6 * Licensed under the LGPL v2.1, see the file COPYING.LIB in this tarball.
7 */
8
9 #include <sys/syscall.h>
10
11 #if defined __USE_POSIX
12 #include <signal.h>
13 #ifdef __UCLIBC_HAS_THREADS_NATIVE__
14 # include <pthreadP.h> /* SIGCANCEL */
15 #endif
16
17 #undef sigprocmask
18
libc_hidden_proto(sigprocmask)19 libc_hidden_proto(sigprocmask)
20
21 #ifdef __NR_rt_sigprocmask
22
23 # define __NR___rt_sigprocmask __NR_rt_sigprocmask
24 static __always_inline
25 _syscall4(int, __rt_sigprocmask, int, how, const sigset_t *, set,
26 sigset_t *, oldset, size_t, size)
27
28 int sigprocmask(int how, const sigset_t * set, sigset_t * oldset)
29 {
30 #ifdef SIGCANCEL
31 sigset_t local_newmask;
32
33 /*
34 * The only thing we have to make sure here is that SIGCANCEL and
35 * SIGSETXID are not blocked.
36 */
37 if (set != NULL && (unlikely (__sigismember (set, SIGCANCEL))
38 # ifdef SIGSETXID
39 || unlikely (__sigismember (set, SIGSETXID))
40 # endif
41 ))
42 {
43 local_newmask = *set;
44 __sigdelset (&local_newmask, SIGCANCEL);
45 # ifdef SIGSETXID
46 __sigdelset (&local_newmask, SIGSETXID);
47 # endif
48 set = &local_newmask;
49 }
50 #endif
51
52 return __rt_sigprocmask(how, set, oldset, __SYSCALL_SIGSET_T_SIZE);
53 }
54
55
56 #else
57
58 # define __NR___syscall_sigprocmask __NR_sigprocmask
59 static __always_inline
60 _syscall3(int, __syscall_sigprocmask, int, how, const sigset_t *, set,
61 sigset_t *, oldset)
62
63 int sigprocmask(int how, const sigset_t * set, sigset_t * oldset)
64 {
65 #ifdef SIGCANCEL
66 sigset_t local_newmask;
67
68 /*
69 * The only thing we have to make sure here is that SIGCANCEL and
70 * SIGSETXID are not blocked.
71 */
72 if (set != NULL && (unlikely (__sigismember (set, SIGCANCEL))
73 # ifdef SIGSETXID
74 || unlikely (__sigismember (set, SIGSETXID))
75 # endif
76 ))
77 {
78 local_newmask = *set;
79 __sigdelset (&local_newmask, SIGCANCEL);
80 # ifdef SIGSETXID
81 __sigdelset (&local_newmask, SIGSETXID);
82 # endif
83 set = &local_newmask;
84 }
85 #endif
86
87 return (__syscall_sigprocmask(how, set, oldset));
88 }
89 #endif
90 libc_hidden_def(sigprocmask)
91 #endif
92