From e5fd20fd25993097bf7fb5b1cfe8f28f7d8ecbf4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Helleu?= Date: Sat, 6 May 2017 15:57:42 +0200 Subject: [PATCH] irc: fix update of server addresses on reconnection when the evaluated content has changed (closes #925) --- ChangeLog.adoc | 1 + src/plugins/irc/irc-server.c | 101 ++++++++++++++++++++++++----------- src/plugins/irc/irc-server.h | 5 +- 3 files changed, 75 insertions(+), 32 deletions(-) diff --git a/ChangeLog.adoc b/ChangeLog.adoc index 31342fec3..19111d1cc 100644 --- a/ChangeLog.adoc +++ b/ChangeLog.adoc @@ -48,6 +48,7 @@ Bug fixes:: * core: fix memory leak in display of mouse event debug info * core: fix command /cursor stop (do not toggle cursor mode) (issue #964) * core: fix delayed refresh when the signal SIGWINCH is received (terminal resized), send signal "signal_sigwinch" after refreshes (issue #902) + * irc: fix update of server addresses on reconnection when the evaluated content has changed (issue #925) * irc: fix crash in case of invalid server reply during SASL authentication with dh-blowfish or dh-aes mechanism * irc: fix double decoding of IRC colors in messages sent/displayed by commands /msg and /query (issue #943) * irc: fix parsing of message 324 (modes) when there is a colon before the modes (issue #913) diff --git a/src/plugins/irc/irc-server.c b/src/plugins/irc/irc-server.c index d425d96dd..07c36fc01 100644 --- a/src/plugins/irc/irc-server.c +++ b/src/plugins/irc/irc-server.c @@ -405,16 +405,39 @@ irc_server_get_name_without_port (const char *name) /* * Sets addresses for server. + * + * Returns: + * 1: addresses have been set (changed) + * 0: nothing set (addresses unchanged) */ -void +int irc_server_set_addresses (struct t_irc_server *server, const char *addresses) { int i; char *pos, *error, *addresses_eval; long number; + addresses_eval = NULL; + + if (addresses && addresses[0]) + { + addresses_eval = weechat_string_eval_expression (addresses, + NULL, NULL, NULL); + if (server->addresses_eval + && (strcmp (server->addresses_eval, addresses_eval) == 0)) + { + free (addresses_eval); + return 0; + } + } + /* free data */ + if (server->addresses_eval) + { + free (server->addresses_eval); + server->addresses_eval = NULL; + } server->addresses_count = 0; if (server->addresses_array) { @@ -433,40 +456,38 @@ irc_server_set_addresses (struct t_irc_server *server, const char *addresses) } /* set new addresses/ports */ - if (addresses && addresses[0]) + server->addresses_eval = addresses_eval; + if (!addresses_eval) + return 1; + server->addresses_array = weechat_string_split ( + addresses_eval, ",", 0, 0, &server->addresses_count); + server->ports_array = malloc ( + server->addresses_count * sizeof (server->ports_array[0])); + server->retry_array = malloc ( + server->addresses_count * sizeof (server->retry_array[0])); + for (i = 0; i < server->addresses_count; i++) { - addresses_eval = weechat_string_eval_expression (addresses, - NULL, NULL, NULL); - server->addresses_array = weechat_string_split ( - (addresses_eval) ? addresses_eval : addresses, - ",", 0, 0, &server->addresses_count); - server->ports_array = malloc ( - server->addresses_count * sizeof (server->ports_array[0])); - server->retry_array = malloc ( - server->addresses_count * sizeof (server->retry_array[0])); - for (i = 0; i < server->addresses_count; i++) + pos = strchr (server->addresses_array[i], '/'); + if (pos) { - pos = strchr (server->addresses_array[i], '/'); - if (pos) - { - pos[0] = 0; - pos++; - error = NULL; - number = strtol (pos, &error, 10); - server->ports_array[i] = (error && !error[0]) ? - number : IRC_SERVER_DEFAULT_PORT; - } - else - { - server->ports_array[i] = IRC_SERVER_DEFAULT_PORT; - } - server->retry_array[i] = 0; + pos[0] = 0; + pos++; + error = NULL; + number = strtol (pos, &error, 10); + server->ports_array[i] = (error && !error[0]) ? + number : IRC_SERVER_DEFAULT_PORT; } - if (addresses_eval) - free (addresses_eval); + else + { + server->ports_array[i] = IRC_SERVER_DEFAULT_PORT; + } + server->retry_array[i] = 0; } + + return 1; } + /* * Sets index of current address for server. */ @@ -474,14 +495,29 @@ irc_server_set_addresses (struct t_irc_server *server, const char *addresses) void irc_server_set_index_current_address (struct t_irc_server *server, int index) { + int addresses_changed; + + addresses_changed = irc_server_set_addresses ( + server, + IRC_SERVER_OPTION_STRING(server, IRC_SERVER_OPTION_ADDRESSES)); + + if (addresses_changed) + { + /* if the addresses have changed, reset the index to 0 */ + index = 0; + } + if (server->current_address) { free (server->current_address); server->current_address = NULL; /* copy current retry value before loading next server */ - if (server->index_current_address < server->addresses_count) + if (!addresses_changed + && server->index_current_address < server->addresses_count) + { server->retry_array[server->index_current_address] = server->current_retry; + } } server->current_port = 0; server->current_retry = 0; @@ -1106,6 +1142,7 @@ irc_server_alloc (const char *name) new_server->temp_server = 0; new_server->reloading_from_config = 0; new_server->reloaded_from_config = 0; + new_server->addresses_eval = NULL; new_server->addresses_count = 0; new_server->addresses_array = NULL; new_server->ports_array = NULL; @@ -1620,6 +1657,8 @@ irc_server_free_data (struct t_irc_server *server) } if (server->name) free (server->name); + if (server->addresses_eval) + free (server->addresses_eval); if (server->addresses_array) weechat_string_free_split (server->addresses_array); if (server->ports_array) @@ -5415,6 +5454,7 @@ irc_server_hdata_server_cb (const void *pointer, void *data, WEECHAT_HDATA_VAR(struct t_irc_server, temp_server, INTEGER, 0, NULL, NULL); WEECHAT_HDATA_VAR(struct t_irc_server, reloading_from_config, INTEGER, 0, NULL, NULL); WEECHAT_HDATA_VAR(struct t_irc_server, reloaded_from_config, INTEGER, 0, NULL, NULL); + WEECHAT_HDATA_VAR(struct t_irc_server, addresses_eval, STRING, 0, NULL, NULL); WEECHAT_HDATA_VAR(struct t_irc_server, addresses_count, INTEGER, 0, NULL, NULL); WEECHAT_HDATA_VAR(struct t_irc_server, addresses_array, STRING, 0, "addresses_count", NULL); WEECHAT_HDATA_VAR(struct t_irc_server, ports_array, INTEGER, 0, "addresses_count", NULL); @@ -6024,6 +6064,7 @@ irc_server_print_log () weechat_log_printf (" temp_server. . . . . : %d", ptr_server->temp_server); weechat_log_printf (" reloading_from_config: %d", ptr_server->reloaded_from_config); weechat_log_printf (" reloaded_from_config : %d", ptr_server->reloaded_from_config); + weechat_log_printf (" addresses_eval . . . : '%s'", ptr_server->addresses_eval); weechat_log_printf (" addresses_count. . . : %d", ptr_server->addresses_count); weechat_log_printf (" addresses_array. . . : 0x%lx", ptr_server->addresses_array); weechat_log_printf (" ports_array. . . . . : 0x%lx", ptr_server->ports_array); diff --git a/src/plugins/irc/irc-server.h b/src/plugins/irc/irc-server.h index fc7d63e95..18c2621ef 100644 --- a/src/plugins/irc/irc-server.h +++ b/src/plugins/irc/irc-server.h @@ -155,6 +155,7 @@ struct t_irc_server int temp_server; /* temporary server (not saved) */ int reloading_from_config; /* 1 if reloading from config file */ int reloaded_from_config; /* 1 if reloaded from config file */ + char *addresses_eval; /* evaluation of addresses */ int addresses_count; /* number of addresses */ char **addresses_array; /* addresses (after split) */ int *ports_array; /* ports for addresses */ @@ -280,8 +281,8 @@ extern int irc_server_strncasecmp (struct t_irc_server *server, int max); extern int irc_server_sasl_enabled (struct t_irc_server *server); extern char *irc_server_get_name_without_port (const char *name); -extern void irc_server_set_addresses (struct t_irc_server *server, - const char *addresses); +extern int irc_server_set_addresses (struct t_irc_server *server, + const char *addresses); extern void irc_server_set_nicks (struct t_irc_server *server, const char *nicks); extern void irc_server_set_nick (struct t_irc_server *server, const char *nick); extern const char *irc_server_get_alternate_nick (struct t_irc_server *server);