|
|
|
@ -4,6 +4,7 @@ |
|
|
|
#include "syscall.h" |
|
|
|
#include "pthread_impl.h" |
|
|
|
#include "libc.h" |
|
|
|
#include "ksigaction.h" |
|
|
|
|
|
|
|
void __restore(), __restore_rt(); |
|
|
|
|
|
|
|
@ -12,28 +13,20 @@ weak_alias(dummy, __pthread_self_def); |
|
|
|
|
|
|
|
int __libc_sigaction(int sig, const struct sigaction *sa, struct sigaction *old) |
|
|
|
{ |
|
|
|
struct { |
|
|
|
void *handler; |
|
|
|
unsigned long flags; |
|
|
|
void (*restorer)(void); |
|
|
|
sigset_t mask; |
|
|
|
} ksa, kold; |
|
|
|
long pksa=0, pkold=0; |
|
|
|
struct k_sigaction ksa, *pksa=0; |
|
|
|
if (sa) { |
|
|
|
ksa.handler = sa->sa_handler; |
|
|
|
ksa.flags = sa->sa_flags | SA_RESTORER; |
|
|
|
ksa.restorer = (sa->sa_flags & SA_SIGINFO) ? __restore_rt : __restore; |
|
|
|
ksa.mask = sa->sa_mask; |
|
|
|
pksa = (long)&ksa; |
|
|
|
memcpy(&ksa.mask, &sa->sa_mask, sizeof ksa.mask); |
|
|
|
} |
|
|
|
if (old) pkold = (long)&kold; |
|
|
|
__pthread_self_def(); |
|
|
|
if (syscall(SYS_rt_sigaction, sig, pksa, pkold, 8)) |
|
|
|
if (syscall(SYS_rt_sigaction, sig, sa?&ksa:0, old?&ksa:0, sizeof ksa.mask)) |
|
|
|
return -1; |
|
|
|
if (old) { |
|
|
|
old->sa_handler = kold.handler; |
|
|
|
old->sa_flags = kold.flags; |
|
|
|
old->sa_mask = kold.mask; |
|
|
|
old->sa_handler = ksa.handler; |
|
|
|
old->sa_flags = ksa.flags; |
|
|
|
memcpy(&old->sa_mask, &ksa.mask, sizeof ksa.mask); |
|
|
|
} |
|
|
|
return 0; |
|
|
|
} |
|
|
|
|