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