]> mj.ucw.cz Git - arexx.git/commitdiff
All sleeps should be interruptible by SIGINT and SIGTERM
authorMartin Mares <mj@ucw.cz>
Thu, 9 Feb 2012 15:52:53 +0000 (16:52 +0100)
committerMartin Mares <mj@ucw.cz>
Thu, 9 Feb 2012 15:52:53 +0000 (16:52 +0100)
arexxd.c

index 005c2a38f074117c33e35f3911f1b0d1eaa8facf..3baaefd669ca9b168eff4dbedc82018c297204de 100644 (file)
--- a/arexxd.c
+++ b/arexxd.c
@@ -486,6 +486,7 @@ static void set_clock(void)
 
 /*** Main ***/
 
+static sigset_t term_sigs;
 static volatile sig_atomic_t want_shutdown;
 
 static void sigterm_handler(int sig __attribute__((unused)))
@@ -493,6 +494,13 @@ static void sigterm_handler(int sig __attribute__((unused)))
        want_shutdown = 1;
 }
 
+static void interruptible_sleep(int seconds)
+{
+       sigprocmask(SIG_UNBLOCK, &term_sigs, NULL);
+       sleep(seconds);
+       sigprocmask(SIG_BLOCK, &term_sigs, NULL);
+}
+
 static const struct option long_options[] = {
        { "debug",              0, NULL, 'd' },
        { "log-dir",            1, NULL, 'l' },
@@ -566,7 +574,6 @@ int main(int argc, char **argv)
        sigaction(SIGTERM, &sa, NULL);
        sigaction(SIGINT, &sa, NULL);
 
-       sigset_t term_sigs;
        sigemptyset(&term_sigs);
        sigaddset(&term_sigs, SIGTERM);
        sigaddset(&term_sigs, SIGINT);
@@ -579,7 +586,7 @@ int main(int argc, char **argv)
                                inited = 1;
                                log_error("Data logger not connected, waiting until it appears");
                        }
-                       sleep(30);
+                       interruptible_sleep(30);
                        continue;
                }
                log_info("Listening");
@@ -611,18 +618,16 @@ int main(int argc, char **argv)
                        want_sleep = 1;
                        if (err > 0 && parse_packet(reply))
                                want_sleep = 0;
-                       sigprocmask(SIG_UNBLOCK, &term_sigs, NULL);
                        if (want_sleep) {
-                               sleep(4);
+                               interruptible_sleep(4);
                                want_stats = 1;
                        }
-                       sigprocmask(SIG_BLOCK, &term_sigs, NULL);
                }
 
                log_info("Disconnecting data logger");
                release_device();
                inited = 0;
-               sleep(10);
+               interruptible_sleep(10);
        }
 
        log_info("Terminated");