ref: 297c3c7dfa958231abe140ee00d38b0e684ad48c
dir: /src/libc/arch/linux/_sigaction.c/
#include <string.h>
#include <arch/sigaction.h>
#include <sys.h>
extern void _sigreturn(void);
int _sigaction(int sig, struct sigaction *sa, struct sigaction *old)
{
int r;
struct sigaction ksa, kold;
if (sa) {
ksa.sa_handler = sa->sa_handler;
ksa.sa_flags = sa->sa_flags | SA_RESTORER;
ksa.sa_restorer = _sigreturn;
memcpy(&ksa.sa_mask, &sa->sa_mask, sizeof(ksa.sa_mask));
}
r = __sigaction(sig,
sa ? &ksa : NULL,
old ? &kold : NULL,
sizeof(ksa.sa_mask));
if (r != 0)
return -1;
if (old) {
old->sa_handler = kold.sa_handler;
old->sa_flags = kold.sa_flags;
memcpy(&old->sa_mask, &kold.sa_mask, sizeof kold.sa_mask);
}
return 0;
}