sigaction.c 1.0 KB
Newer Older
R
Rich Felker 已提交
1 2 3 4 5
#include <stdlib.h>
#include <signal.h>
#include <errno.h>
#include "syscall.h"
#include "pthread_impl.h"
6
#include "libc.h"
7
#include "ksigaction.h"
R
Rich Felker 已提交
8

9
void __restore(), __restore_rt();
R
Rich Felker 已提交
10

11 12 13
static pthread_t dummy(void) { return 0; }
weak_alias(dummy, __pthread_self_def);

R
Rich Felker 已提交
14 15
int __libc_sigaction(int sig, const struct sigaction *sa, struct sigaction *old)
{
16
	struct k_sigaction ksa, *pksa=0;
R
Rich Felker 已提交
17 18
	if (sa) {
		ksa.handler = sa->sa_handler;
19
		ksa.flags = sa->sa_flags | SA_RESTORER;
20
		ksa.restorer = (sa->sa_flags & SA_SIGINFO) ? __restore_rt : __restore;
21
		memcpy(&ksa.mask, &sa->sa_mask, sizeof ksa.mask);
R
Rich Felker 已提交
22
	}
23
	__pthread_self_def();
24
	if (syscall(SYS_rt_sigaction, sig, sa?&ksa:0, old?&ksa:0, sizeof ksa.mask))
R
Rich Felker 已提交
25 26
		return -1;
	if (old) {
27 28 29
		old->sa_handler = ksa.handler;
		old->sa_flags = ksa.flags;
		memcpy(&old->sa_mask, &ksa.mask, sizeof ksa.mask);
R
Rich Felker 已提交
30 31 32 33 34 35
	}
	return 0;
}

int __sigaction(int sig, const struct sigaction *sa, struct sigaction *old)
{
36
	if (sig-32U < 3) {
R
Rich Felker 已提交
37 38 39 40 41 42 43
		errno = EINVAL;
		return -1;
	}
	return __libc_sigaction(sig, sa, old);
}

weak_alias(__sigaction, sigaction);