ld-tool portability fix: MacOS build experience
[lunaix-os.git] / lunaix-os / usr / libc / arch / i386 / signal.c
index 681f193100c42dc7d8d817cbf1a631bca37b19bb..2434fc95b86743c3f3a609b9983061d5b75ae9f8 100644 (file)
@@ -1,7 +1,6 @@
 #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);
@@ -14,3 +13,51 @@ __LXSYSCALL3(int,
              *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;
+}
+
+extern pid_t
+getpid();
+
+int
+raise(int signum)
+{
+    return kill(getpid(), 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