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

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

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

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

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

weak_alias(__sigaction, sigaction);