From 914bda1a74c92385e36707d9717f512522e4ce47 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Helleu?= Date: Sun, 1 Jan 2017 16:35:02 +0100 Subject: [PATCH] irc: fix close of server channels which are waiting for the JOIN when the server buffer is closed (issue #873) --- ChangeLog.adoc | 1 + src/plugins/irc/irc-buffer.c | 47 ++++++++++++++++++++++++++++++++++++ 2 files changed, 48 insertions(+) diff --git a/ChangeLog.adoc b/ChangeLog.adoc index 991010d65..9b5497b4c 100644 --- a/ChangeLog.adoc +++ b/ChangeLog.adoc @@ -45,6 +45,7 @@ Bug fixes:: * core: fix deadlock when quitting after a signal SIGHUP/SIGQUIT/SIGTERM is received (issue #32) * core: fix display of empty lines in search mode (issue #829) * api: fix crash in function string_expand_home() when the HOME environment variable is not set (issue #827) + * irc: fix close of server channels which are waiting for the JOIN when the server buffer is closed (issue #873) * irc: fix buffer switching on manual join for forwarded channels (issue #876) * irc: add missing tags on CTCP message sent * lua: fix integers returned in Lua >= 5.3 (issue #834) diff --git a/src/plugins/irc/irc-buffer.c b/src/plugins/irc/irc-buffer.c index 88eddb45a..b0a1e5ccd 100644 --- a/src/plugins/irc/irc-buffer.c +++ b/src/plugins/irc/irc-buffer.c @@ -107,6 +107,44 @@ irc_buffer_build_name (const char *server, const char *channel) return buffer; } +/* + * Closes all channels/privates of a given server. + */ + +void +irc_buffer_close_server_channels (struct t_irc_server *server) +{ + struct t_hdata *hdata_buffer; + struct t_gui_buffer *ptr_buffer, *ptr_next_buffer; + const char *ptr_type, *ptr_server_name; + + hdata_buffer = weechat_hdata_get ("buffer"); + ptr_buffer = weechat_hdata_get_list (hdata_buffer, "gui_buffers"); + + while (ptr_buffer) + { + ptr_next_buffer = weechat_hdata_move (hdata_buffer, ptr_buffer, 1); + + if (weechat_buffer_get_pointer (ptr_buffer, + "plugin") == weechat_irc_plugin) + { + ptr_type = weechat_buffer_get_string (ptr_buffer, "localvar_type"); + ptr_server_name = weechat_buffer_get_string (ptr_buffer, + "localvar_server"); + if (ptr_type && ptr_type[0] + && ptr_server_name && ptr_server_name[0] + && ((strcmp (ptr_type, "channel") == 0) + || (strcmp (ptr_type, "private") == 0)) + && (strcmp (ptr_server_name, server->name) == 0)) + { + weechat_buffer_close (ptr_buffer); + } + } + + ptr_buffer = ptr_next_buffer; + } +} + /* * Callback called when a buffer is closed. */ @@ -149,6 +187,8 @@ irc_buffer_close_cb (const void *pointer, void *data, irc_command_quit_server (ptr_server, NULL); irc_server_disconnect (ptr_server, 0, 0); } + + /* close server channels/privates */ ptr_channel = ptr_server->channels; while (ptr_channel) { @@ -157,6 +197,13 @@ irc_buffer_close_cb (const void *pointer, void *data, weechat_buffer_close (ptr_channel->buffer); ptr_channel = next_channel; } + + /* + * close remaining channels/privates + * (which are not yet in server->channels) + */ + irc_buffer_close_server_channels (ptr_server); + ptr_server->buffer = NULL; } }