vis

a vi-like editor based on Plan 9's structural regular expressions

git clone https://9o.is/git/vis.git

commit 607184b5f365bc04526e1da02038de9f9f5a0c6c
parent c8ce362263500873cb8342f31a04c3a12d2bb062
Author: Marc André Tanner <mat@brain-dump.org>
Date:   Sun, 27 Nov 2016 11:15:05 +0100

vis: install SIGTERM handler to properly restore terminal when being killed

Diffstat:
Mui-curses.c | 52+++++++++++++++++++++++++++++++++-------------------
1 file changed, 33 insertions(+), 19 deletions(-)

diff --git a/ui-curses.c b/ui-curses.c @@ -102,12 +102,33 @@ struct UiCursesWin { CellStyle styles[UI_STYLE_MAX]; }; -static volatile sig_atomic_t need_resize; /* TODO */ +static volatile sig_atomic_t need_resize; /* SIGWINCH received */ +static volatile sig_atomic_t terminate; /* SIGTERM received */ static void sigwinch_handler(int sig) { need_resize = true; } +static void sigterm_handler(int sig) { + terminate = true; +} + +__attribute__((noreturn)) static void ui_die(Ui *ui, const char *msg, va_list ap) { + UiCurses *uic = (UiCurses*)ui; + endwin(); + if (uic->termkey) + termkey_stop(uic->termkey); + vfprintf(stderr, msg, ap); + exit(EXIT_FAILURE); +} + +__attribute__((noreturn)) static void ui_die_msg(Ui *ui, const char *msg, ...) { + va_list ap; + va_start(ap, msg); + ui_die(ui, msg, ap); + va_end(ap); +} + typedef struct { unsigned char i; unsigned char r; @@ -828,6 +849,10 @@ static void ui_update(Ui *ui) { vis_update(uic->vis); return; } + + if (terminate) + ui_die_msg(ui, "Killed by SIGTERM\n"); + for (UiCursesWin *win = uic->windows; win; win = win->next) ui_window_update(win); debug("ui-doupdate\n"); @@ -1010,22 +1035,6 @@ static UiWin *ui_window_new(Ui *ui, View *view, File *file, enum UiOption option return &win->uiwin; } -__attribute__((noreturn)) static void ui_die(Ui *ui, const char *msg, va_list ap) { - UiCurses *uic = (UiCurses*)ui; - endwin(); - if (uic->termkey) - termkey_stop(uic->termkey); - vfprintf(stderr, msg, ap); - exit(EXIT_FAILURE); -} - -__attribute__((noreturn)) static void ui_die_msg(Ui *ui, const char *msg, ...) { - va_list ap; - va_start(ap, msg); - ui_die(ui, msg, ap); - va_end(ap); -} - static void ui_info(Ui *ui, const char *msg, va_list ap) { UiCurses *uic = (UiCurses*)ui; vsnprintf(uic->info, sizeof(uic->info), msg, ap); @@ -1151,8 +1160,13 @@ static bool ui_init(Ui *ui, Vis *vis) { sa.sa_flags = 0; sigemptyset(&sa.sa_mask); sa.sa_handler = sigwinch_handler; - sigaction(SIGWINCH, &sa, NULL); - sigaction(SIGCONT, &sa, NULL); + if (sigaction(SIGWINCH, &sa, NULL) == -1) + goto err; + if (sigaction(SIGCONT, &sa, NULL) == -1) + goto err; + sa.sa_handler = sigterm_handler; + if (sigaction(SIGTERM, &sa, NULL) == -1) + goto err; ui_resize(ui);