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);
}
/*
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);
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)
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,
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);
{
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()) {
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)
__noreturn static void com_quit(void)
{
- finish(0);
+ die(EXIT_SUCCESS, "%s", "");
}
static void com_refresh(void)
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 = {
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);