From: Andre Noll Date: Sun, 8 Apr 2012 03:03:52 +0000 (+0200) Subject: interactive: Honor SIGTERM. X-Git-Tag: v0.4.12~7^2~11 X-Git-Url: http://git.tuebingen.mpg.de/?p=paraslash.git;a=commitdiff_plain;h=56561c08cf6cfe28bccebc513bcec057d8bb9afa interactive: Honor SIGTERM. 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. --- diff --git a/error.h b/error.h index 43d9eef2..8b1ae341 100644 --- 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 */ diff --git a/interactive.c b/interactive.c index f2e4a355..dda5f84e 100644 --- a/interactive.c +++ b/interactive.c @@ -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; } /**