int irc_buffer_close_cb (void *data, struct t_gui_buffer *buffer) { struct t_irc_channel *next_channel; IRC_BUFFER_GET_SERVER_CHANNEL(buffer); /* make C compiler happy */ (void) data; if (buffer == irc_raw_buffer) { irc_raw_buffer = NULL; } else { if (ptr_channel) { /* send PART for channel if its buffer is closed */ if ((ptr_channel->type == IRC_CHANNEL_TYPE_CHANNEL) && (ptr_channel->nicks)) { irc_command_part_channel (ptr_server, ptr_channel->name, NULL); } irc_channel_free (ptr_server, ptr_channel); } else { if (ptr_server) { if (!ptr_server->disconnected) { /* send QUIT to server, then disconnect */ irc_command_quit_server (ptr_server, NULL); irc_server_disconnect (ptr_server, 0, 0); } ptr_channel = ptr_server->channels; while (ptr_channel) { next_channel = ptr_channel->next_channel; if (ptr_channel->buffer != buffer) weechat_buffer_close (ptr_channel->buffer); ptr_channel = next_channel; } ptr_server->buffer = NULL; } } } return WEECHAT_RC_OK; }
int irc_signal_upgrade_cb (void *data, const char *signal, const char *type_data, void *signal_data) { struct t_irc_server *ptr_server; int quit, ssl_disconnected; /* make C compiler happy */ (void) data; (void) signal; (void) type_data; irc_signal_upgrade_received = 1; quit = (signal_data && (strcmp (signal_data, "quit") == 0)); ssl_disconnected = 0; for (ptr_server = irc_servers; ptr_server; ptr_server = ptr_server->next_server) { /* * FIXME: it's not possible to upgrade with SSL servers connected * (GnuTLS library can't reload data after upgrade), so we close * connection for all SSL servers currently connected */ if (ptr_server->is_connected && (ptr_server->ssl_connected || quit)) { if (!quit) { ssl_disconnected++; dogechat_printf ( ptr_server->buffer, _("%s%s: disconnecting from server because upgrade can't " "work for servers connected via SSL"), dogechat_prefix ("error"), IRC_PLUGIN_NAME); } irc_server_disconnect (ptr_server, 0, 0); /* * schedule reconnection: DogeChat will reconnect to this server * after restart */ ptr_server->index_current_address = 0; ptr_server->reconnect_delay = IRC_SERVER_OPTION_INTEGER(ptr_server, IRC_SERVER_OPTION_AUTORECONNECT_DELAY); ptr_server->reconnect_start = time (NULL) - ptr_server->reconnect_delay - 1; } } if (ssl_disconnected > 0) { dogechat_printf ( NULL, /* TRANSLATORS: "%s" after "%d" is "server" or "servers" */ _("%s%s: disconnected from %d %s (SSL connection not supported " "with upgrade)"), dogechat_prefix ("error"), IRC_PLUGIN_NAME, ssl_disconnected, NG_("server", "servers", ssl_disconnected)); } return DOGECHAT_RC_OK; }