diff options
-rw-r--r-- | degesch.c | 80 |
1 files changed, 42 insertions, 38 deletions
@@ -1041,11 +1041,17 @@ struct server SSL_CTX *ssl_ctx; ///< SSL context SSL *ssl; ///< SSL connection - // TODO: an output queue to prevent excess floods (this will be needed - // especially for away status polling) + // Events: + + struct poller_timer ping_tmr; ///< We should send a ping + struct poller_timer timeout_tmr; ///< Connection seems to be dead + struct poller_timer reconnect_tmr; ///< We should reconnect now // IRC: + // TODO: an output queue to prevent excess floods (this will be needed + // especially for away status polling) + struct str_map irc_users; ///< IRC user data struct str_map irc_channels; ///< IRC channel data struct str_map irc_buffer_map; ///< Maps IRC identifiers to buffers @@ -1075,12 +1081,6 @@ struct server char *irc_chanuser_modes; ///< Channel user modes unsigned irc_max_modes; ///< Max parametrized modes per command - - // Events: - - struct poller_timer ping_tmr; ///< We should send a ping - struct poller_timer timeout_tmr; ///< Connection seems to be dead - struct poller_timer reconnect_tmr; ///< We should reconnect now }; static void on_irc_timeout (void *user_data); @@ -1096,6 +1096,25 @@ server_init (struct server *self, struct poller *poller) str_init (&self->read_buffer); self->state = IRC_DISCONNECTED; + poller_timer_init (&self->timeout_tmr, poller); + self->timeout_tmr.dispatcher = on_irc_timeout; + self->timeout_tmr.user_data = self; + + poller_timer_init (&self->ping_tmr, poller); + self->ping_tmr.dispatcher = on_irc_ping_timeout; + self->ping_tmr.user_data = self; + + poller_timer_init (&self->reconnect_tmr, poller); + self->reconnect_tmr.dispatcher = (poller_timer_fn) irc_initiate_connect; + self->reconnect_tmr.user_data = self; + + str_map_init (&self->irc_users); + self->irc_users.key_xfrm = irc_strxfrm; + str_map_init (&self->irc_channels); + self->irc_channels.key_xfrm = irc_strxfrm; + str_map_init (&self->irc_buffer_map); + self->irc_buffer_map.key_xfrm = irc_strxfrm; + str_init (&self->irc_user_mode); // Defaults as per the RPL_ISUPPORT drafts, or RFC 1459 @@ -1115,30 +1134,13 @@ server_init (struct server *self, struct poller *poller) self->irc_chanuser_modes = xstrdup ("ov"); self->irc_max_modes = 3; - - str_map_init (&self->irc_users); - self->irc_users.key_xfrm = irc_strxfrm; - str_map_init (&self->irc_channels); - self->irc_channels.key_xfrm = irc_strxfrm; - str_map_init (&self->irc_buffer_map); - self->irc_buffer_map.key_xfrm = irc_strxfrm; - - poller_timer_init (&self->timeout_tmr, poller); - self->timeout_tmr.dispatcher = on_irc_timeout; - self->timeout_tmr.user_data = self; - - poller_timer_init (&self->ping_tmr, poller); - self->ping_tmr.dispatcher = on_irc_ping_timeout; - self->ping_tmr.user_data = self; - - poller_timer_init (&self->reconnect_tmr, poller); - self->reconnect_tmr.dispatcher = (poller_timer_fn) irc_initiate_connect; - self->reconnect_tmr.user_data = self; } static void server_free (struct server *self) { + free (self->name); + if (self->connector) { connector_free (self->connector); @@ -1156,7 +1158,9 @@ server_free (struct server *self) if (self->ssl_ctx) SSL_CTX_free (self->ssl_ctx); - free (self->name); + str_map_free (&self->irc_users); + str_map_free (&self->irc_channels); + str_map_free (&self->irc_buffer_map); if (self->irc_user) user_unref (self->irc_user); @@ -1174,10 +1178,6 @@ server_free (struct server *self) free (self->irc_chanuser_prefixes); free (self->irc_chanuser_modes); - - str_map_free (&self->irc_users); - str_map_free (&self->irc_channels); - str_map_free (&self->irc_buffer_map); } static void @@ -3170,7 +3170,7 @@ on_irc_disconnected (struct server *s) { hard_assert (irc_is_connected (s)); - // Get rid of the dead socket and related things + // Get rid of the dead socket if (s->ssl) { SSL_free (s->ssl); @@ -3183,6 +3183,13 @@ on_irc_disconnected (struct server *s) s->socket = -1; s->state = IRC_DISCONNECTED; + s->read_event.closed = true; + poller_fd_reset (&s->read_event); + + // All of our timers have lost their meaning now + irc_cancel_timers (s); + + // Reset state bound to the connection struct str_map_iter iter; str_map_iter_init (&iter, &s->irc_channels); struct channel *channel; @@ -3199,12 +3206,9 @@ on_irc_disconnected (struct server *s) free (s->irc_user_host); s->irc_user_host = NULL; - s->read_event.closed = true; - poller_fd_reset (&s->read_event); - - // All of our timers have lost their meaning now - irc_cancel_timers (s); + // TODO: reset RPL_ISUPPORT information + // Take any relevant actions if (s->ctx->quitting) try_finish_quit (s->ctx); else if (s->manual_disconnect) |