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