d4026c604e3a0c1246fcd116c0c15055c7630e6b
[lunaix-os.git] / lunaix-os / usr / libc / arch / i386 / signal.c
1 #include "syscall.h"
2 #include <lunaix/signal_defs.h>
3 #include <lunaix/types.h>
4
5 __LXSYSCALL1(int, sigpending, sigset_t, *set);
6 __LXSYSCALL1(int, sigsuspend, const sigset_t, *mask);
7
8 __LXSYSCALL3(int,
9              sigprocmask,
10              int,
11              how,
12              const sigset_t,
13              *set,
14              sigset_t,
15              *oldset);
16
17 __LXSYSCALL2(int, sys_sigaction, int, signum, struct sigaction*, action);
18
19 __LXSYSCALL2(int, kill, pid_t, pid, int, signum);
20
21 extern void
22 sigtrampoline();
23
24 sighandler_t
25 signal(int signum, sighandler_t handler)
26 {
27     struct sigaction sa = { .sa_handler = (void*)handler,
28                             .sa_mask = (sigset_t)-1,
29                             .sa_sigaction = (void*)sigtrampoline };
30
31     sys_sigaction(signum, &sa);
32
33     return handler;
34 }
35
36 int
37 raise(int signum)
38 {
39     return kill(0, signum);
40 }
41
42 int
43 sigaction(int signum, struct sigaction* action)
44 {
45     return sys_sigaction(signum, action);
46 }
47
48 struct siguctx
49 {
50     void* sigact;
51     void (*sa_handler)(int);
52     unsigned char saved_frame[0];
53 };
54
55 void
56 sig_dohandling(int signum, void* siginfo, void* sigctx)
57 {
58     struct siguctx* uctx = (struct siguctx*)sigctx;
59     uctx->sa_handler(signum);
60 }