]> git.tuebingen.mpg.de Git - paraslash.git/blobdiff - interactive.c
interactive: Honor SIGTERM.
[paraslash.git] / interactive.c
index f2e4a355012ce1aa3861ba8b7bec56443a80df8e..dda5f84e5184b398a10652bd45ddda941e3a703e 100644 (file)
@@ -33,6 +33,7 @@ struct i9e_private {
        bool line_handler_running;
        bool input_eof;
        bool caught_sigint;
        bool line_handler_running;
        bool input_eof;
        bool caught_sigint;
+       bool caught_sigterm;
 };
 static struct i9e_private i9e_private, *i9ep = &i9e_private;
 
 };
 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;
 
        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;
        }
        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);
        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;
 
 {
        int ret;
 
-       if (i9ep->input_eof || i9ep->caught_sigint) {
+       if (i9ep->input_eof || i9ep->caught_sigint || i9ep->caught_sigterm) {
                sched_min_delay(s);
                return;
        }
                sched_min_delay(s);
                return;
        }
@@ -433,6 +437,8 @@ void i9e_signal_dispatch(int sig_num)
                reset_line_state();
                i9ep->caught_sigint = true;
        }
                reset_line_state();
                i9ep->caught_sigint = true;
        }
+       if (sig_num == SIGTERM)
+               i9ep->caught_sigterm = true;
 }
 
 /**
 }
 
 /**