interactive: Honor SIGTERM.
authorAndre Noll <maan@systemlinux.org>
Sun, 8 Apr 2012 03:03:52 +0000 (05:03 +0200)
committerAndre Noll <maan@systemlinux.org>
Sun, 18 Nov 2012 19:28:28 +0000 (20:28 +0100)
Currently i9e_signal_dispatch() only looks at SIGINT and ignores all
other signals. We'd like to honor SIGTERM as well because this provides
a handy way for other paraslash tasks to shut down the i9e subsystem,
even if no signal was received.

error.h
interactive.c

diff --git a/error.h b/error.h
index 43d9eef..8b1ae34 100644 (file)
--- a/error.h
+++ b/error.h
@@ -485,6 +485,7 @@ extern const char **para_errlist[];
 #define INTERACTIVE_ERRORS \
        PARA_ERROR(I9E_EOF, "end of input"), \
        PARA_ERROR(I9E_SETUPTERM, "failed to set up terminal"), \
+       PARA_ERROR(I9E_TERM_RQ, "received termination request"), \
 
 /** \endcond errors */
 
index f2e4a35..dda5f84 100644 (file)
@@ -33,6 +33,7 @@ struct i9e_private {
        bool line_handler_running;
        bool input_eof;
        bool caught_sigint;
+       bool caught_sigterm;
 };
 static struct i9e_private i9e_private, *i9ep = &i9e_private;
 
@@ -271,16 +272,19 @@ static void i9e_post_select(struct sched *s, struct task *t)
        char *buf;
        size_t sz;
 
-       if (i9ep->input_eof) {
-               t->error = -E_I9E_EOF;
-               return;
-       }
+       ret = -E_I9E_EOF;
+       if (i9ep->input_eof)
+               goto rm_btrn;
+       ret = -E_I9E_TERM_RQ;
+       if (i9ep->caught_sigterm)
+               goto rm_btrn;
        if (!btrn) {
                i9ep->caught_sigint = false;
                if (FD_ISSET(ici->fds[0], &s->rfds))
                        i9e_input();
                return;
        }
+       ret = 0;
        if (i9ep->caught_sigint)
                goto rm_btrn;
        ret = btr_node_status(i9ep->stdout_btrn, 0, BTR_NT_LEAF);
@@ -306,7 +310,7 @@ static void i9e_pre_select(struct sched *s, __a_unused struct task *t)
 {
        int ret;
 
-       if (i9ep->input_eof || i9ep->caught_sigint) {
+       if (i9ep->input_eof || i9ep->caught_sigint || i9ep->caught_sigterm) {
                sched_min_delay(s);
                return;
        }
@@ -433,6 +437,8 @@ void i9e_signal_dispatch(int sig_num)
                reset_line_state();
                i9ep->caught_sigint = true;
        }
+       if (sig_num == SIGTERM)
+               i9ep->caught_sigterm = true;
 }
 
 /**