gpsd-dev
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[gpsd-dev] [PATCH v2] gpsd: use sigaction() to register signals


From: Mike Frysinger
Subject: [gpsd-dev] [PATCH v2] gpsd: use sigaction() to register signals
Date: Sat, 14 Jan 2012 16:36:28 -0500

We want to avoid the unportable signal() semantics wrt handlers being
reset upon signal delivery, so use sigaction() instead.

While we're fixing this, we can move the signal setup logic outside
of the setjmp loop since we no longer have to reset anything.  We
know the kernel will do the right thing.

Also rename the incorrect "emptyset" to "oldset" to reflect what it
actually represents.

Signed-off-by: Mike Frysinger <address@hidden>
---
v2
        - rebased and updated new pselect code too

 gpsd.c |   39 +++++++++++++++++++++++----------------
 1 files changed, 23 insertions(+), 16 deletions(-)

diff --git a/gpsd.c b/gpsd.c
index 7c44db8..29cdec1 100644
--- a/gpsd.c
+++ b/gpsd.c
@@ -25,6 +25,7 @@
 #include <syslog.h>
 #include <errno.h>
 #include <fcntl.h>
+#include <signal.h>
 #include <pthread.h>
 #ifndef S_SPLINT_S
 #include <netdb.h>
@@ -1769,10 +1770,11 @@ int main(int argc, char *argv[])
 #ifdef COMPAT_SELECT
     struct timeval tv;
 #else
-    sigset_t emptyset, blockset;
+    sigset_t oldset, blockset;
 #endif /* COMPAT_SELECT */
     const struct gps_type_t **dp;
     bool in_restart;
+    struct sigaction sa;
 
 #ifdef PPS_ENABLE
     /address@hidden@*/
@@ -2043,6 +2045,25 @@ int main(int argc, char *argv[])
        subscribers[i].fd = UNALLOCATED_FD;
 #endif /* SOCKET_EXPORT_ENABLE*/
 
+    /* Handle some signals */
+#ifndef COMPAT_SELECT
+    (void)sigemptyset(&blockset);
+    (void)sigaddset(&blockset, SIGHUP);
+    (void)sigaddset(&blockset, SIGINT);
+    (void)sigaddset(&blockset, SIGTERM);
+    (void)sigaddset(&blockset, SIGQUIT);
+    (void)sigprocmask(SIG_BLOCK, &blockset, &oldset);
+#endif /* COMPAT_SELECT */
+
+    sa.sa_flags = 0;
+    sa.sa_handler = onsig;
+    (void)sigfillset(&sa.sa_mask);
+    (void)sigaction(SIGHUP, &sa, NULL);
+    (void)sigaction(SIGINT, &sa, NULL);
+    (void)sigaction(SIGTERM, &sa, NULL);
+    (void)sigaction(SIGQUIT, &sa, NULL);
+    (void)signal(SIGPIPE, SIG_IGN);
+
     /* daemon got termination or interrupt signal */
     if (setjmp(restartbuf) > 0) {
        /* try to undo all device configurations */
@@ -2054,21 +2075,7 @@ int main(int argc, char *argv[])
        gpsd_report(LOG_WARN, "gpsd restarted by SIGHUP\n");
     }
 
-    /* Handle some signals */
-#ifndef COMPAT_SELECT
-    (void)sigemptyset(&blockset);
-    (void)sigaddset(&blockset, SIGHUP);
-    (void)sigaddset(&blockset, SIGINT);
-    (void)sigaddset(&blockset, SIGTERM);
-    (void)sigaddset(&blockset, SIGQUIT);
-    (void)sigprocmask(SIG_BLOCK, &blockset, &emptyset);
-#endif /* COMPAT_SELECT */
     signalled = 0;
-    (void)signal(SIGHUP, onsig);
-    (void)signal(SIGINT, onsig);
-    (void)signal(SIGTERM, onsig);
-    (void)signal(SIGQUIT, onsig);
-    (void)signal(SIGPIPE, SIG_IGN);
 
     for (i = 0; i < AFCOUNT; i++)
        if (msocks[i] >= 0) {
@@ -2116,7 +2123,7 @@ int main(int argc, char *argv[])
        tv.tv_usec = 0;
        if (select(maxfd + 1, &rfds, NULL, NULL, &tv) == -1) {
 #else
-       if (pselect(maxfd + 1, &rfds, NULL, NULL, NULL, &emptyset) == -1) {
+       if (pselect(maxfd + 1, &rfds, NULL, NULL, NULL, &oldset) == -1) {
 #endif
            if (errno == EINTR)
                continue;
-- 
1.7.8.3




reply via email to

[Prev in Thread] Current Thread [Next in Thread]