summaryrefslogtreecommitdiff
path: root/gpsmon.c
diff options
context:
space:
mode:
authorEric S. Raymond <esr@thyrsus.com>2013-11-14 23:17:08 -0500
committerEric S. Raymond <esr@thyrsus.com>2013-11-14 23:17:08 -0500
commit40aaf34d0b8474196c745cbdf9569c1e5c1cf58a (patch)
treecdb8f7e2ef17159b356803f352f61f2a2dd42f57 /gpsmon.c
parent4f440cd62dd0b2d5356b3ee8875c130ce52ece40 (diff)
downloadgpsd-40aaf34d0b8474196c745cbdf9569c1e5c1cf58a.tar.gz
In gpsmon, better signal protection.
Diffstat (limited to 'gpsmon.c')
-rw-r--r--gpsmon.c21
1 files changed, 15 insertions, 6 deletions
diff --git a/gpsmon.c b/gpsmon.c
index 7f64382f..14f0b94c 100644
--- a/gpsmon.c
+++ b/gpsmon.c
@@ -133,7 +133,8 @@ static jmp_buf terminate;
#define TERM_DRIVER_SWITCH 2
#define TERM_EMPTY_READ 3
#define TERM_READ_ERROR 4
-#define TERM_QUIT 5
+#define TERM_SIGNAL 5
+#define TERM_QUIT 6
/* PPS monitoring */
#if defined(PPS_ENABLE)
@@ -974,7 +975,10 @@ static jmp_buf assertbuf;
static void onsig(int sig UNUSED)
{
- longjmp(assertbuf, 1);
+ if (sig == SIGABRT)
+ longjmp(assertbuf, 1);
+ else
+ longjmp(terminate, TERM_SIGNAL);
}
#define WATCHRAW "?WATCH={\"raw\":2,\"pps\":true}\r\n"
@@ -1181,10 +1185,6 @@ int main(int argc, char **argv)
exit(EXIT_FAILURE);
}
- (void)cbreak();
- if (!nocurses && !curses_init())
- goto quit;
-
FD_ZERO(&all_fds);
FD_SET(0, &all_fds); /* accept keystroke inputs */
@@ -1192,7 +1192,15 @@ int main(int argc, char **argv)
if (session.gpsdata.gps_fd > maxfd)
maxfd = session.gpsdata.gps_fd;
+
if ((bailout = setjmp(terminate)) == 0) {
+ signal(SIGQUIT, onsig);
+ signal(SIGINT, onsig);
+ signal(SIGTERM, onsig);
+ (void)cbreak();
+ if (!nocurses && !curses_init())
+ goto quit;
+
for (;;)
{
switch(gpsd_await_data(&rfds, maxfd, &all_fds, context.debug))
@@ -1267,6 +1275,7 @@ int main(int argc, char **argv)
case TERM_READ_ERROR:
explanation = "Read error from device\n";
break;
+ case TERM_SIGNAL:
case TERM_QUIT:
/* normal exit, no message */
break;