interactive: Honor SIGWINCH.
[paraslash.git] / interactive.c
index f2e4a355012ce1aa3861ba8b7bec56443a80df8e..f75e4be531d94521bf87f8baf19b5f4dfb5b6739 100644 (file)
 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;
 }
 
 /**