From 2b8250e7d8b4bb34727470ee208fc9b725371bec Mon Sep 17 00:00:00 2001 From: Andre Noll Date: Tue, 7 Jan 2014 17:35:08 +0000 Subject: [PATCH 1/1] gui: Combine exit functions. Currently we have kill_pg_and_die(), finish(), msg_n_exit(), which is kind of excessive. This patch replaces these three functions by the single die() which does the right thing in all cases. --- gui.c | 55 ++++++++++++++++++++----------------------------------- 1 file changed, 20 insertions(+), 35 deletions(-) diff --git a/gui.c b/gui.c index 6e3c3e1e..8ec009cc 100644 --- a/gui.c +++ b/gui.c @@ -543,39 +543,25 @@ static void setup_signal_handling(void) para_install_sighandler(SIGUSR1); } -/* kill every process in the process group and exit */ -__noreturn static void kill_pg_and_die(int ret) -{ - para_sigaction(SIGTERM, SIG_IGN); - kill(0, SIGTERM); - exit(ret); -} - static void shutdown_curses(void) { def_prog_mode(); endwin(); } -__noreturn static void finish(int ret) -{ - shutdown_curses(); - kill_pg_and_die(ret); -} - -/* - * exit curses and print given message to stdout/stderr - */ -__noreturn __printf_2_3 static void msg_n_exit(int ret, const char* fmt, ...) +/* disable curses, print a message, kill running processes and exit */ +__noreturn __printf_2_3 static void die(int exit_code, const char* fmt, ...) { va_list argp; - FILE *outfd = ret? stderr: stdout; shutdown_curses(); va_start(argp, fmt); - vfprintf(outfd, fmt, argp); + vfprintf(stderr, fmt, argp); va_end(argp); - kill_pg_and_die(ret); + /* kill every process in the process group and exit */ + para_sigaction(SIGTERM, SIG_IGN); + kill(0, SIGTERM); + exit(exit_code); } /* @@ -615,7 +601,7 @@ static void init_wins(int top_lines) sb.win = newwin(sb.lines, sb.cols, sb_y, 0); in.win = newwin(in.lines, in.cols, in_y, 0); if (!top.win || !bot.win || !sb.win || !in.win || !sep.win) - msg_n_exit(1, "Error: Cannot create curses windows\n"); + die(EXIT_FAILURE, "Error: Cannot create curses windows\n"); wclear(bot.win); wclear(sb.win); wclear(in.win); @@ -754,7 +740,7 @@ static void clear_all_items(void) static void init_pair_or_die(short pair, short f, short b) { if (init_pair(pair, f, b) == ERR) - msg_n_exit(EXIT_FAILURE, "fatal: init_pair() failed\n"); + die(EXIT_FAILURE, "fatal: init_pair() failed\n"); } static void init_colors_or_die(void) @@ -762,9 +748,9 @@ static void init_colors_or_die(void) int i; if (!has_colors()) - msg_n_exit(EXIT_FAILURE, "fatal: No color term\n"); + die(EXIT_FAILURE, "fatal: No color term\n"); if (start_color() == ERR) - msg_n_exit(EXIT_FAILURE, "fatal: failed to start colors\n"); + die(EXIT_FAILURE, "fatal: failed to start colors\n"); FOR_EACH_STATUS_ITEM(i) if (theme.data[i].len) init_pair_or_die(i + 1, theme.data[i].fg, @@ -785,19 +771,19 @@ static void init_curses(void) if (curses_active()) return; if (top.win && refresh() == ERR) /* refresh is really needed */ - msg_n_exit(EXIT_FAILURE, "refresh() failed\n"); + die(EXIT_FAILURE, "refresh() failed\n"); if (LINES < theme.lines_min || COLS < theme.cols_min) - msg_n_exit(EXIT_FAILURE, "Error: Terminal (%dx%d) too small" + die(EXIT_FAILURE, "Terminal (%dx%d) too small" " (need at least %dx%d)\n", COLS, LINES, theme.cols_min, theme.lines_min); curs_set(0); /* make cursor invisible, ignore errors */ nonl(); /* do not NL->CR/NL on output, always returns OK */ /* don't echo input */ if (noecho() == ERR) - msg_n_exit(EXIT_FAILURE, "fatal: noecho() failed\n"); + die(EXIT_FAILURE, "fatal: noecho() failed\n"); /* take input chars one at a time, no wait for \n */ if (cbreak() == ERR) - msg_n_exit(EXIT_FAILURE, "fatal: cbreak() failed\n"); + die(EXIT_FAILURE, "fatal: cbreak() failed\n"); init_colors_or_die(); clear(); /* ignore non-fatal errors */ init_wins(theme.top_lines_default); @@ -877,8 +863,7 @@ static void handle_signal(int sig) { switch (sig) { case SIGTERM: - msg_n_exit(EXIT_FAILURE, - "only the good die young (caught SIGTERM))\n"); + die(EXIT_FAILURE, "only the good die young (caught SIGTERM)\n"); return; case SIGWINCH: if (curses_active()) { @@ -1302,7 +1287,7 @@ static void com_reread_conf(void) init_curses(); PARA_NOTICE_LOG("config file reloaded\n"); if (check_key_map_args() < 0) - finish(EXIT_FAILURE); + die(EXIT_FAILURE, "invalid key map\n"); } static void com_help(void) @@ -1371,7 +1356,7 @@ static void com_version(void) __noreturn static void com_quit(void) { - finish(0); + die(EXIT_SUCCESS, "%s", ""); } static void com_refresh(void) @@ -1455,7 +1440,7 @@ int main(int argc, char *argv[]) print_help_and_die(); cf = configfile_exists(); if (!cf && conf.config_file_given) - msg_n_exit(EXIT_FAILURE, "can not read config file %s\n", + die(EXIT_FAILURE, "can not read config file %s\n", conf.config_file_arg); if (cf) { struct gui_cmdline_parser_params params = { @@ -1469,7 +1454,7 @@ int main(int argc, char *argv[]) loglevel = get_loglevel_by_name(conf.loglevel_arg); } if (check_key_map_args() < 0) - msg_n_exit(EXIT_FAILURE, "invalid key map\n"); + die(EXIT_FAILURE, "invalid key map\n"); theme_init(conf.theme_arg, &theme); setup_signal_handling(); bot_win_rb = ringbuffer_new(RINGBUFFER_SIZE); -- 2.39.2