X-Git-Url: http://git.tuebingen.mpg.de/?p=paraslash.git;a=blobdiff_plain;f=interactive.c;h=f75e4be531d94521bf87f8baf19b5f4dfb5b6739;hp=f2e4a355012ce1aa3861ba8b7bec56443a80df8e;hb=3ba7724e92b52f5933632ff7d948d0f9491440db;hpb=b56199aab3056d397697ac0c510d4e973c240d7d diff --git a/interactive.c b/interactive.c index f2e4a355..f75e4be5 100644 --- a/interactive.c +++ b/interactive.c @@ -27,12 +27,14 @@ struct i9e_private { struct i9e_client_info *ici; FILE *stderr_stream; + int num_columns; char empty_line[1000]; struct task task; struct btr_node *stdout_btrn; bool line_handler_running; bool input_eof; bool caught_sigint; + bool caught_sigterm; }; static struct i9e_private i9e_private, *i9ep = &i9e_private; @@ -271,16 +273,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 +311,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; } @@ -335,14 +340,15 @@ static void update_winsize(void) { struct winsize w; int ret = ioctl(i9ep->ici->fds[2], TIOCGWINSZ, (char *)&w); - int num_columns = 80; if (ret >= 0) { assert(w.ws_col < sizeof(i9ep->empty_line)); - num_columns = w.ws_col; - } - memset(i9ep->empty_line, ' ', num_columns); - i9ep->empty_line[num_columns] = '\0'; + i9ep->num_columns = w.ws_col; + } else + i9ep->num_columns = 80; + + memset(i9ep->empty_line, ' ', i9ep->num_columns); + i9ep->empty_line[i9ep->num_columns] = '\0'; } /** @@ -427,12 +433,16 @@ __printf_2_3 void i9e_log(int ll, const char* fmt,...) */ void i9e_signal_dispatch(int sig_num) { + if (sig_num == SIGWINCH) + return update_winsize(); if (sig_num == SIGINT) { fprintf(i9ep->stderr_stream, "\n"); rl_replace_line ("", false /* clear_undo */); reset_line_state(); i9ep->caught_sigint = true; } + if (sig_num == SIGTERM) + i9ep->caught_sigterm = true; } /**