malloc: keep one freed pool to reuse later
[neatlibc.git] / signal.c
blobc19e7f03128c5df4fec82848e81d88a6070cfe3d
1 #include <signal.h>
3 #define SIG_BLOCK 0
4 #define SIG_UNBLOCK 1
5 #define SIG_SETMASK 2
7 #define SA_NOCLDSTOP 1
8 #define SA_NOCLDWAIT 2
9 #define SA_SIGINFO 4
10 #define SA_ONSTACK 0x08000000
11 #define SA_RESTART 0x10000000
12 #define SA_NODEFER 0x40000000
13 #define SA_RESETHAND 0x80000000
14 #define SA_RESTORER 0x04000000
16 struct sigset_t {
17 unsigned long __bits[128 / sizeof(long)];
19 typedef struct sigset_t sigset_t;
21 struct sigaction {
22 void (*sa_handler)(int);
23 sigset_t sa_mask;
24 int sa_flags;
25 void (*sa_restorer)(void);
28 int sigreturn(unsigned long n);
30 struct ksa {
31 void *handler;
32 unsigned long flags;
33 int (*restorer)(unsigned long n);
34 sigset_t mask;
37 int __sigaction(int sig, const struct sigaction *sa, struct sigaction *old)
39 struct ksa ksa, _ksa;
40 if (sa) {
41 ksa.handler = sa->sa_handler;
42 ksa.flags = sa->sa_flags | SA_RESTORER;
43 ksa.restorer = sigreturn;
44 ksa.mask = sa->sa_mask;
46 if (sigaction(sig, sa ? (long) &ksa : 0, old ? (long) &_ksa : 0, 8))
47 return -1;
48 if (old) {
49 old->sa_handler = _ksa.handler;
50 old->sa_flags = _ksa.flags;
51 old->sa_mask = _ksa.mask;
53 return 0;
56 int sigaction(int sig, struct sigaction *sa, struct sigaction *old_sa);
58 sighandler_t signal(int sig, sighandler_t func)
60 struct sigaction sa = {.sa_handler = func, .sa_flags = SA_RESTART};
61 if (__sigaction(sig, &sa, &sa) < 0)
62 return SIG_ERR;
63 return sa.sa_handler;