irc: fix update of server addresses on reconnection when the evaluated content has changed (closes #925)
This commit is contained in:
parent
2867dcc45f
commit
e5fd20fd25
@ -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)
|
||||
|
@ -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);
|
||||
|
@ -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);
|
||||
|
Loading…
x
Reference in New Issue
Block a user