diff options
author | Přemysl Janouch <p.janouch@gmail.com> | 2015-06-02 22:34:03 +0200 |
---|---|---|
committer | Přemysl Janouch <p.janouch@gmail.com> | 2015-06-02 22:36:22 +0200 |
commit | 4dd2a80ba22654231c1e2bfef521eca4840e62a5 (patch) | |
tree | 0dcd4f297c68a59538cd6b6b85a0e48f5f9f543f /degesch.c | |
parent | 897bb00af12ac069a8c1fc717ee40e9333329b48 (diff) | |
download | xK-4dd2a80ba22654231c1e2bfef521eca4840e62a5.tar.gz xK-4dd2a80ba22654231c1e2bfef521eca4840e62a5.tar.xz xK-4dd2a80ba22654231c1e2bfef521eca4840e62a5.zip |
degesch: cleanup wrt. quitting
Diffstat (limited to 'degesch.c')
-rw-r--r-- | degesch.c | 43 |
1 files changed, 16 insertions, 27 deletions
@@ -2840,6 +2840,7 @@ irc_queue_reconnect (struct server *s) int64_t delay = get_config_integer (s->config, "reconnect_delay"); // TODO: exponentional backoff + // XXX: maybe add a state for when a connect is queued? hard_assert (s->state == IRC_DISCONNECTED); buffer_send_status (s->ctx, s->buffer, "Trying to reconnect in %ld seconds...", delay); @@ -3031,12 +3032,13 @@ irc_send (struct server *s, const char *format, ...) static void irc_shutdown (struct server *s) { - // TODO: set a timer after which we cut the connection? // Generally non-critical if (s->ssl) soft_assert (SSL_shutdown (s->ssl) != -1); else soft_assert (shutdown (s->socket, SHUT_WR) == 0); + + // TODO: set a timer after which we cut the connection } static void @@ -3072,21 +3074,27 @@ try_finish_quit (struct app_context *ctx) static void initiate_quit (struct app_context *ctx) { + buffer_send_status (ctx, ctx->global_buffer, "Shutting down"); + // Destroy the user interface input_stop (&ctx->input); - buffer_send_status (ctx, ctx->global_buffer, "Shutting down"); - - // Initiate a connection close struct str_map_iter iter; str_map_iter_init (&iter, &ctx->servers); + // Initiate a connection close struct server *s; while ((s = str_map_iter_next (&iter))) { + // There may be a timer set to reconnect to the server + poller_timer_reset (&s->reconnect_tmr); + if (irc_is_connected (s)) + { // XXX: when we go async, we'll have to flush output buffers first irc_shutdown (s); + s->manual_disconnect = true; + } else if (s->state == IRC_CONNECTING) irc_destroy_connector (s); } @@ -7144,26 +7152,6 @@ setup_signal_handlers (void) // --- I/O event handlers ------------------------------------------------------ -// FIXME: merge this with initiate_quit() -static void -preinitiate_quit (struct app_context *ctx) -{ - struct str_map_iter iter; - str_map_iter_init (&iter, &ctx->servers); - - struct server *s; - while ((s = str_map_iter_next (&iter))) - { - // There may be a timer set to reconnect to the server - // TODO: a faster timer for quitting - // XXX: why do we do this? Just to reset the reconnect timer? - irc_reset_connection_timeouts (s); - - if (irc_is_connected (s)) - irc_initiate_disconnect (s, NULL); - } -} - static void on_signal_pipe_readable (const struct pollfd *fd, struct app_context *ctx) { @@ -7171,10 +7159,11 @@ on_signal_pipe_readable (const struct pollfd *fd, struct app_context *ctx) (void) read (fd->fd, &dummy, 1); if (g_termination_requested && !ctx->quitting) - { - preinitiate_quit (ctx); + // TODO: this way we don't send a QUIT message but just close the + // connection from our side and wait for a full close. + // Once we allow for custom quit messages, we will probably want to + // call irc_initiate_disconnect() for all servers. initiate_quit (ctx); - } if (g_winch_received) { |