diff options
-rw-r--r-- | degesch.c | 234 |
1 files changed, 117 insertions, 117 deletions
@@ -1666,72 +1666,6 @@ init_colors (struct app_context *ctx) g_log_message_real = log_message_attributed; } -// --- Signals ----------------------------------------------------------------- - -static int g_signal_pipe[2]; ///< A pipe used to signal... signals - -/// Program termination has been requested by a signal -static volatile sig_atomic_t g_termination_requested; -/// The window has changed in size -static volatile sig_atomic_t g_winch_received; - -static void -sigterm_handler (int signum) -{ - (void) signum; - - g_termination_requested = true; - - int original_errno = errno; - if (write (g_signal_pipe[1], "t", 1) == -1) - soft_assert (errno == EAGAIN); - errno = original_errno; -} - -static void -sigwinch_handler (int signum) -{ - (void) signum; - - g_winch_received = true; - - int original_errno = errno; - if (write (g_signal_pipe[1], "w", 1) == -1) - soft_assert (errno == EAGAIN); - errno = original_errno; -} - -static void -setup_signal_handlers (void) -{ - if (pipe (g_signal_pipe) == -1) - exit_fatal ("%s: %s", "pipe", strerror (errno)); - - set_cloexec (g_signal_pipe[0]); - set_cloexec (g_signal_pipe[1]); - - // So that the pipe cannot overflow; it would make write() block within - // the signal handler, which is something we really don't want to happen. - // The same holds true for read(). - set_blocking (g_signal_pipe[0], false); - set_blocking (g_signal_pipe[1], false); - - signal (SIGPIPE, SIG_IGN); - - struct sigaction sa; - sa.sa_flags = SA_RESTART; - sa.sa_handler = sigwinch_handler; - sigemptyset (&sa.sa_mask); - - if (sigaction (SIGWINCH, &sa, NULL) == -1) - exit_fatal ("sigaction: %s", strerror (errno)); - - sa.sa_handler = sigterm_handler; - if (sigaction (SIGINT, &sa, NULL) == -1 - || sigaction (SIGTERM, &sa, NULL) == -1) - exit_fatal ("sigaction: %s", strerror (errno)); -} - // --- Output formatter -------------------------------------------------------- // This complicated piece of code makes attributed text formatting simple. @@ -5796,49 +5730,6 @@ app_editline_init (struct input *self) #endif // HAVE_EDITLINE -// --- I/O event handlers ------------------------------------------------------ - -static void -on_signal_pipe_readable (const struct pollfd *fd, struct app_context *ctx) -{ - char dummy; - (void) read (fd->fd, &dummy, 1); - - if (g_termination_requested && !ctx->quitting) - { - // There may be a timer set to reconnect to the server - // TODO: multiserver - struct server *s = &ctx->server; - // TODO: a faster timer for quitting - irc_reset_connection_timeouts (s); - - // FIXME: use a normal quit message - if (irc_is_connected (s)) - irc_send (s, "QUIT :Terminated by signal"); - initiate_quit (ctx); - } - - if (g_winch_received) - { - input_on_terminal_resized (&ctx->input); - update_screen_size (); - } -} - -static void -on_tty_readable (const struct pollfd *fd, struct app_context *ctx) -{ - (void) ctx; - - if (fd->revents & ~(POLLIN | POLLHUP | POLLERR)) - print_debug ("fd %d: unexpected revents: %d", fd->fd, fd->revents); - - // XXX: this may loop for a bit: stop the event or eat the input? - // (This prevents a segfault when the input has been stopped.) - if (ctx->input.active) - input_on_readable (&ctx->input); -} - // --- Configuration loading --------------------------------------------------- static bool @@ -5963,7 +5854,114 @@ load_configuration (struct app_context *ctx) get_config_integer (ctx, "server.reconnect_delay"); } -// --- Main program ------------------------------------------------------------ +// --- Signals ----------------------------------------------------------------- + +static int g_signal_pipe[2]; ///< A pipe used to signal... signals + +/// Program termination has been requested by a signal +static volatile sig_atomic_t g_termination_requested; +/// The window has changed in size +static volatile sig_atomic_t g_winch_received; + +static void +sigterm_handler (int signum) +{ + (void) signum; + + g_termination_requested = true; + + int original_errno = errno; + if (write (g_signal_pipe[1], "t", 1) == -1) + soft_assert (errno == EAGAIN); + errno = original_errno; +} + +static void +sigwinch_handler (int signum) +{ + (void) signum; + + g_winch_received = true; + + int original_errno = errno; + if (write (g_signal_pipe[1], "w", 1) == -1) + soft_assert (errno == EAGAIN); + errno = original_errno; +} + +static void +setup_signal_handlers (void) +{ + if (pipe (g_signal_pipe) == -1) + exit_fatal ("%s: %s", "pipe", strerror (errno)); + + set_cloexec (g_signal_pipe[0]); + set_cloexec (g_signal_pipe[1]); + + // So that the pipe cannot overflow; it would make write() block within + // the signal handler, which is something we really don't want to happen. + // The same holds true for read(). + set_blocking (g_signal_pipe[0], false); + set_blocking (g_signal_pipe[1], false); + + signal (SIGPIPE, SIG_IGN); + + struct sigaction sa; + sa.sa_flags = SA_RESTART; + sa.sa_handler = sigwinch_handler; + sigemptyset (&sa.sa_mask); + + if (sigaction (SIGWINCH, &sa, NULL) == -1) + exit_fatal ("sigaction: %s", strerror (errno)); + + sa.sa_handler = sigterm_handler; + if (sigaction (SIGINT, &sa, NULL) == -1 + || sigaction (SIGTERM, &sa, NULL) == -1) + exit_fatal ("sigaction: %s", strerror (errno)); +} + +// --- I/O event handlers ------------------------------------------------------ + +static void +on_signal_pipe_readable (const struct pollfd *fd, struct app_context *ctx) +{ + char dummy; + (void) read (fd->fd, &dummy, 1); + + if (g_termination_requested && !ctx->quitting) + { + // There may be a timer set to reconnect to the server + // TODO: multiserver + struct server *s = &ctx->server; + // TODO: a faster timer for quitting + irc_reset_connection_timeouts (s); + + // FIXME: use a normal quit message + if (irc_is_connected (s)) + irc_send (s, "QUIT :Terminated by signal"); + initiate_quit (ctx); + } + + if (g_winch_received) + { + input_on_terminal_resized (&ctx->input); + update_screen_size (); + } +} + +static void +on_tty_readable (const struct pollfd *fd, struct app_context *ctx) +{ + (void) ctx; + + if (fd->revents & ~(POLLIN | POLLHUP | POLLERR)) + print_debug ("fd %d: unexpected revents: %d", fd->fd, fd->revents); + + // XXX: this may loop for a bit: stop the event or eat the input? + // (This prevents a segfault when the input has been stopped.) + if (ctx->input.active) + input_on_readable (&ctx->input); +} static void init_poller_events (struct app_context *ctx) @@ -5979,17 +5977,19 @@ init_poller_events (struct app_context *ctx) poller_fd_set (&ctx->tty_event, POLLIN); } +// --- Main program ------------------------------------------------------------ + static void display_logo (void) { const char *logo = - " __ __ \n" - " __/ / ____ ____ ____ ____ ____ / /_ \n" - " / / / , / / / / , / / __/ / __/ / __ \\ \n" - " / / / / __/ / / / / __/ /_ / / /_ / / / / \n" - " /___/ /___/ /_ / /___/ /___/ /___/ /_/ /_/ \n" - " /___/ \n" - " "; + " __ __ \n" + " __/ / ____ ____ ____ ____ ____ / /_ \n" + " / / / , / / / / , / / __/ / __/ / __ \\ \n" + " / / / / __/ / / / / __/ /_ / / /_ / / / / \n" + " /___/ /___/ /_ / /___/ /___/ /___/ /_/ /_/ \n" + " /___/ \n" + " "; struct str_vector v; str_vector_init (&v); |