Support to multi-threading and pthread interface (POSIX.1-2008) (#23)
[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 extern pid_t
37 getpid();
38
39 int
40 raise(int signum)
41 {
42     return kill(getpid(), signum);
43 }
44
45 int
46 sigaction(int signum, struct sigaction* action)
47 {
48     return sys_sigaction(signum, action);
49 }
50
51 struct siguctx
52 {
53     void* sigact;
54     void (*sa_handler)(int);
55     unsigned char saved_frame[0];
56 };
57
58 void
59 sig_dohandling(int signum, void* siginfo, void* sigctx)
60 {
61     struct siguctx* uctx = (struct siguctx*)sigctx;
62     uctx->sa_handler(signum);
63 }