refactor: full rewrite of signal feature
[lunaix-os.git] / lunaix-os / usr / libc / arch / i386 / signal.c
index 681f193100c42dc7d8d817cbf1a631bca37b19bb..d4026c604e3a0c1246fcd116c0c15055c7630e6b 100644 (file)
@@ -1,7 +1,6 @@
 #include "syscall.h"
 #include <lunaix/signal_defs.h>
 #include "syscall.h"
 #include <lunaix/signal_defs.h>
-
-__LXSYSCALL2(int, signal, int, signum, sighandler_t, handler);
+#include <lunaix/types.h>
 
 __LXSYSCALL1(int, sigpending, sigset_t, *set);
 __LXSYSCALL1(int, sigsuspend, const sigset_t, *mask);
 
 __LXSYSCALL1(int, sigpending, sigset_t, *set);
 __LXSYSCALL1(int, sigsuspend, const sigset_t, *mask);
@@ -14,3 +13,48 @@ __LXSYSCALL3(int,
              *set,
              sigset_t,
              *oldset);
              *set,
              sigset_t,
              *oldset);
+
+__LXSYSCALL2(int, sys_sigaction, int, signum, struct sigaction*, action);
+
+__LXSYSCALL2(int, kill, pid_t, pid, int, signum);
+
+extern void
+sigtrampoline();
+
+sighandler_t
+signal(int signum, sighandler_t handler)
+{
+    struct sigaction sa = { .sa_handler = (void*)handler,
+                            .sa_mask = (sigset_t)-1,
+                            .sa_sigaction = (void*)sigtrampoline };
+
+    sys_sigaction(signum, &sa);
+
+    return handler;
+}
+
+int
+raise(int signum)
+{
+    return kill(0, signum);
+}
+
+int
+sigaction(int signum, struct sigaction* action)
+{
+    return sys_sigaction(signum, action);
+}
+
+struct siguctx
+{
+    void* sigact;
+    void (*sa_handler)(int);
+    unsigned char saved_frame[0];
+};
+
+void
+sig_dohandling(int signum, void* siginfo, void* sigctx)
+{
+    struct siguctx* uctx = (struct siguctx*)sigctx;
+    uctx->sa_handler(signum);
+}
\ No newline at end of file