diff options
Diffstat (limited to 'libc/sysdeps/linux/xtensa/sigaction.c')
| -rw-r--r-- | libc/sysdeps/linux/xtensa/sigaction.c | 53 |
1 files changed, 19 insertions, 34 deletions
diff --git a/libc/sysdeps/linux/xtensa/sigaction.c b/libc/sysdeps/linux/xtensa/sigaction.c index 790a8f21f..2a20c6859 100644 --- a/libc/sysdeps/linux/xtensa/sigaction.c +++ b/libc/sysdeps/linux/xtensa/sigaction.c @@ -15,45 +15,30 @@ #define SA_RESTORER 0x04000000 -extern void __default_sa_restorer (void); +extern void __default_sa_restorer(void); -/* Experimentally off - libc_hidden_proto(memcpy) */ - -int __libc_sigaction (int signum, const struct sigaction *act, - struct sigaction *oldact) +int __libc_sigaction(int sig, const struct sigaction *act, + struct sigaction *oact) { - struct kernel_sigaction kact, koldact; - int result; - - if (act) { - kact.k_sa_handler = act->sa_handler; - memcpy(&kact.sa_mask, &act->sa_mask, sizeof (kact.sa_mask)); - kact.sa_flags = act->sa_flags; - - if (kact.sa_flags & SA_RESTORER) { - kact.sa_restorer = act->sa_restorer; - } else { - kact.sa_restorer = __default_sa_restorer; - kact.sa_flags |= SA_RESTORER; - } - } - - result = __syscall_rt_sigaction(signum, act ? __ptrvalue (&kact) : NULL, - oldact ? __ptrvalue (&koldact) : NULL, - _NSIG / 8); + struct sigaction kact; - if (oldact && result >= 0) { - oldact->sa_handler = koldact.k_sa_handler; - memcpy(&oldact->sa_mask, &koldact.sa_mask, sizeof(oldact->sa_mask)); - oldact->sa_flags = koldact.sa_flags; - oldact->sa_restorer = koldact.sa_restorer; + if (act && !(act->sa_flags & SA_RESTORER)) { + memcpy(&kact, act, sizeof(kact)); + kact.sa_restorer = __default_sa_restorer; + kact.sa_flags |= SA_RESTORER; + act = &kact; } - - return result; + /* NB: kernel (as of 2.6.25) will return EINVAL + * if sizeof(act->sa_mask) does not match kernel's sizeof(sigset_t) */ + return __syscall_rt_sigaction(sig, act, oact, sizeof(act->sa_mask)); } #ifndef LIBC_SIGACTION -libc_hidden_proto (sigaction) -weak_alias (__libc_sigaction, sigaction) -libc_hidden_weak (sigaction) +# ifndef __UCLIBC_HAS_THREADS__ +strong_alias(__libc_sigaction,sigaction) +libc_hidden_def(sigaction) +# else +weak_alias(__libc_sigaction,sigaction) +libc_hidden_weak(sigaction) +# endif #endif |
