From 88dfa52e48532594996ee1120e615b32809d703c Mon Sep 17 00:00:00 2001
From: Nadav Har'El <nyh@cloudius-systems.com>
Date: Tue, 11 Mar 2014 18:44:10 +0200
Subject: [PATCH] signal() using sigaction()

Instead of duplicating sigaction()'s code, let's just use it.

Signed-off-by: Nadav Har'El <nyh@cloudius-systems.com>
Signed-off-by: Pekka Enberg <penberg@cloudius-systems.com>
---
 libc/signal.cc | 11 ++++++-----
 1 file changed, 6 insertions(+), 5 deletions(-)

diff --git a/libc/signal.cc b/libc/signal.cc
index 18f5f6e7e..122f689ff 100644
--- a/libc/signal.cc
+++ b/libc/signal.cc
@@ -153,13 +153,14 @@ int sigaction(int signum, const struct sigaction* act, struct sigaction* oldact)
 // programs like to call to do simple things, like ignoring a certain signal.
 sighandler_t signal(int signum, sighandler_t handler)
 {
-    if (signum < 0 || signum >= (int)nsignals) {
-        errno = EINVAL;
+    struct sigaction act;
+    memset(&act, 0, sizeof(act));
+    act.sa_handler = handler;
+    act.sa_flags = SA_RESTART;
+    struct sigaction old;
+    if (sigaction(signum, &act, &old) < 0) {
         return SIG_ERR;
     }
-    struct sigaction old = signal_actions[signum];
-    memset(&signal_actions[signum], 0, sizeof(signal_actions[signum]));
-    signal_actions[signum].sa_handler = handler;
     if (old.sa_flags & SA_SIGINFO) {
         // TODO: Is there anything sane to do here?
         return nullptr;
-- 
GitLab