From: Benoit Canet <benoit.canet.cont...@gmail.com>
Committer: Nadav Har'El <n...@scylladb.com>
Branch: master

syscall: implement rt_sigaction

This is one of the first syscall used by go binaries.
The kernel syscall have some custom layout that must
be convert forth and back to and from libc. Do it.

Signed-off-by: BenoƮt Canet <ben...@scylladb.com>
Message-Id: <1472475979-24981-2-git-send-email-ben...@scylladb.com>

---
diff --git a/linux.cc b/linux.cc
--- a/linux.cc
+++ b/linux.cc
@@ -17,6 +17,7 @@
 #include <syscall.h>
 #include <stdarg.h>
 #include <errno.h>
+#include <signal.h>
 #include <time.h>
 #include <sys/epoll.h>
 #include <sys/eventfd.h>
@@ -26,6 +27,8 @@

 #include <unordered_map>

+#include <musl/src/internal/ksigaction.h>
+
 extern "C" long gettid()
 {
     return sched::thread::current()->id();
@@ -263,6 +266,31 @@ long long_mmap(void *addr, size_t length, int prot, int flags, int fd, off_t off
         return fn(arg1, arg2, arg3, arg4, arg5, arg6);          \
         } while (0)

+int rt_sigaction(int sig, const struct k_sigaction * act, struct k_sigaction * oact, size_t sigsetsize)
+{
+    struct sigaction libc_act, libc_oact, *libc_act_p = nullptr;
+    memset(&libc_act, 0, sizeof(libc_act));
+    memset(&libc_oact, 0, sizeof(libc_act));
+
+    if (act) {
+        libc_act.sa_handler = act->handler;
+        libc_act.sa_flags = act->flags & ~SA_RESTORER;
+        libc_act.sa_restorer = nullptr;
+        memcpy(&libc_act.sa_mask, &act->mask, sizeof(libc_act.sa_mask));
+        libc_act_p = &libc_act;
+    }
+
+    int ret = sigaction(sig, libc_act_p, &libc_oact);
+
+    if (oact) {
+        oact->handler = libc_oact.sa_handler;
+        oact->flags = libc_oact.sa_flags;
+        oact->restorer = nullptr;
+        memcpy(oact->mask, &libc_oact.sa_mask, sizeof(oact->mask));
+    }
+
+    return ret;
+}

 long syscall(long number, ...)
 {
@@ -284,6 +312,7 @@ long syscall(long number, ...)
     SYSCALL3(sched_getaffinity_syscall, pid_t, unsigned, unsigned long *);
     SYSCALL6(long_mmap, void *, size_t, int, int, int, off_t);
     SYSCALL2(munmap, void *, size_t);
+ SYSCALL4(rt_sigaction, int, const struct k_sigaction *, struct k_sigaction *, size_t);
     }

     debug_always("syscall(): unimplemented system call %d\n", number);

--
You received this message because you are subscribed to the Google Groups "OSv 
Development" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to osv-dev+unsubscr...@googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to