[Top][All Lists]
[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