Switch to next server address when IRC error is received after TCP connection but before message 001 (bug #30884)
This commit is contained in:
parent
321210ff6e
commit
6e89c47bf1
@ -26,6 +26,8 @@ Version 0.3.4 (under dev!)
|
||||
* irc: add new info_hashtable "irc_parse_message"
|
||||
* irc: fix crash/bug when option "addresses" for a server is unset or changed
|
||||
when WeeChat is connected to this server (bug #31268)
|
||||
* irc: switch to next server address when IRC error is received after TCP
|
||||
connection but before message 001 (bug #30884)
|
||||
* irc: fix bug with hostmasks in command /ignore (bug #30716)
|
||||
* rmodifier: new plugin "rmodifier": alter modifier strings with regular
|
||||
expressions (bug #26964)
|
||||
|
@ -151,7 +151,7 @@ irc_buffer_close_cb (void *data, struct t_gui_buffer *buffer)
|
||||
weechat_buffer_close (ptr_channel->buffer);
|
||||
ptr_channel = next_channel;
|
||||
}
|
||||
irc_server_disconnect (ptr_server, 0);
|
||||
irc_server_disconnect (ptr_server, 0, 0);
|
||||
ptr_server->buffer = NULL;
|
||||
}
|
||||
}
|
||||
|
@ -1322,7 +1322,7 @@ irc_command_disconnect_one_server (struct t_irc_server *server)
|
||||
IRC_PLUGIN_NAME);
|
||||
}
|
||||
irc_command_quit_server (server, NULL);
|
||||
irc_server_disconnect (server, 0);
|
||||
irc_server_disconnect (server, 0, 0);
|
||||
|
||||
/* disconnect ok */
|
||||
return 1;
|
||||
@ -2985,7 +2985,7 @@ irc_command_reconnect_one_server (struct t_irc_server *server, int no_join)
|
||||
return 0;
|
||||
}
|
||||
irc_command_quit_server (server, NULL);
|
||||
irc_server_disconnect (server, 0);
|
||||
irc_server_disconnect (server, 0, 0);
|
||||
server->disable_autojoin = no_join;
|
||||
if (irc_server_connect (server))
|
||||
{
|
||||
|
@ -474,7 +474,9 @@ IRC_PROTOCOL_CALLBACK(error)
|
||||
ptr_args);
|
||||
|
||||
if (strncmp (ptr_args, "Closing Link", 12) == 0)
|
||||
irc_server_disconnect (server, 1);
|
||||
{
|
||||
irc_server_disconnect (server, !server->is_connected, 1);
|
||||
}
|
||||
|
||||
return WEECHAT_RC_OK;
|
||||
}
|
||||
@ -491,7 +493,7 @@ IRC_PROTOCOL_CALLBACK(generic_error)
|
||||
struct t_irc_channel *ptr_channel;
|
||||
|
||||
/*
|
||||
* Example of error:
|
||||
* example of error:
|
||||
* :server 404 nick #channel :Cannot send to channel
|
||||
*/
|
||||
|
||||
@ -3910,7 +3912,7 @@ IRC_PROTOCOL_CALLBACK(432)
|
||||
"connection with server"),
|
||||
weechat_prefix ("error"),
|
||||
IRC_PLUGIN_NAME);
|
||||
irc_server_disconnect (server, 1);
|
||||
irc_server_disconnect (server, 0, 1);
|
||||
return WEECHAT_RC_OK;
|
||||
}
|
||||
|
||||
@ -3962,7 +3964,7 @@ IRC_PROTOCOL_CALLBACK(433)
|
||||
"connection with server"),
|
||||
weechat_prefix ("error"),
|
||||
IRC_PLUGIN_NAME);
|
||||
irc_server_disconnect (server, 1);
|
||||
irc_server_disconnect (server, 0, 1);
|
||||
return WEECHAT_RC_OK;
|
||||
}
|
||||
|
||||
@ -4026,7 +4028,7 @@ IRC_PROTOCOL_CALLBACK(437)
|
||||
"connection with server"),
|
||||
weechat_prefix ("error"),
|
||||
IRC_PLUGIN_NAME);
|
||||
irc_server_disconnect (server, 1);
|
||||
irc_server_disconnect (server, 0, 1);
|
||||
return WEECHAT_RC_OK;
|
||||
}
|
||||
|
||||
|
@ -1997,7 +1997,7 @@ irc_server_recv_cb (void *data, int fd)
|
||||
weechat_printf (server->buffer,
|
||||
_("%s: disconnecting from server..."),
|
||||
IRC_PLUGIN_NAME);
|
||||
irc_server_disconnect (server, 1);
|
||||
irc_server_disconnect (server, !server->is_connected, 1);
|
||||
}
|
||||
}
|
||||
else
|
||||
@ -2015,7 +2015,7 @@ irc_server_recv_cb (void *data, int fd)
|
||||
weechat_printf (server->buffer,
|
||||
_("%s: disconnecting from server..."),
|
||||
IRC_PLUGIN_NAME);
|
||||
irc_server_disconnect (server, 1);
|
||||
irc_server_disconnect (server, !server->is_connected, 1);
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -2049,7 +2049,7 @@ irc_server_timer_connection_cb (void *data, int remaining_calls)
|
||||
weechat_printf (server->buffer,
|
||||
_("%s%s: connection timeout (message 001 not received)"),
|
||||
weechat_prefix ("error"), IRC_PLUGIN_NAME);
|
||||
irc_server_disconnect (server, 1);
|
||||
irc_server_disconnect (server, !server->is_connected, 1);
|
||||
}
|
||||
|
||||
return WEECHAT_RC_OK;
|
||||
@ -2169,7 +2169,7 @@ irc_server_timer_cb (void *data, int remaining_calls)
|
||||
_("%s: lag is high, disconnecting "
|
||||
"from server..."),
|
||||
IRC_PLUGIN_NAME);
|
||||
irc_server_disconnect (ptr_server, 1);
|
||||
irc_server_disconnect (ptr_server, 0, 1);
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -2277,8 +2277,6 @@ irc_server_reconnect_schedule (struct t_irc_server *server)
|
||||
{
|
||||
int minutes, seconds;
|
||||
|
||||
irc_server_set_index_current_address (server, 0);
|
||||
|
||||
if (IRC_SERVER_OPTION_BOOLEAN(server, IRC_SERVER_OPTION_AUTORECONNECT))
|
||||
{
|
||||
/* growing reconnect delay */
|
||||
@ -2382,21 +2380,30 @@ irc_server_login (struct t_irc_server *server)
|
||||
*/
|
||||
|
||||
void
|
||||
irc_server_switch_address (struct t_irc_server *server)
|
||||
irc_server_switch_address (struct t_irc_server *server, int connection)
|
||||
{
|
||||
if ((server->addresses_count > 1)
|
||||
&& (server->index_current_address < server->addresses_count - 1))
|
||||
if (server->addresses_count > 1)
|
||||
{
|
||||
irc_server_set_index_current_address (server, server->index_current_address + 1);
|
||||
irc_server_set_index_current_address (server,
|
||||
(server->index_current_address + 1) % server->addresses_count);
|
||||
weechat_printf (server->buffer,
|
||||
_("%s: switching address to %s/%d"),
|
||||
IRC_PLUGIN_NAME,
|
||||
server->current_address,
|
||||
server->current_port);
|
||||
irc_server_connect (server);
|
||||
if (connection)
|
||||
{
|
||||
if (server->index_current_address == 0)
|
||||
irc_server_reconnect_schedule (server);
|
||||
else
|
||||
irc_server_connect (server);
|
||||
}
|
||||
}
|
||||
else
|
||||
irc_server_reconnect_schedule (server);
|
||||
{
|
||||
if (connection)
|
||||
irc_server_reconnect_schedule (server);
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
@ -2450,7 +2457,7 @@ irc_server_connect_cb (void *data, int status, int gnutls_rc,
|
||||
error);
|
||||
}
|
||||
irc_server_close_connection (server);
|
||||
irc_server_switch_address (server);
|
||||
irc_server_switch_address (server, 1);
|
||||
break;
|
||||
case WEECHAT_HOOK_CONNECT_IP_ADDRESS_NOT_FOUND:
|
||||
weechat_printf (server->buffer,
|
||||
@ -2466,7 +2473,7 @@ irc_server_connect_cb (void *data, int status, int gnutls_rc,
|
||||
error);
|
||||
}
|
||||
irc_server_close_connection (server);
|
||||
irc_server_switch_address (server);
|
||||
irc_server_switch_address (server, 1);
|
||||
break;
|
||||
case WEECHAT_HOOK_CONNECT_CONNECTION_REFUSED:
|
||||
weechat_printf (server->buffer,
|
||||
@ -2482,7 +2489,7 @@ irc_server_connect_cb (void *data, int status, int gnutls_rc,
|
||||
error);
|
||||
}
|
||||
irc_server_close_connection (server);
|
||||
irc_server_switch_address (server);
|
||||
irc_server_switch_address (server, 1);
|
||||
break;
|
||||
case WEECHAT_HOOK_CONNECT_PROXY_ERROR:
|
||||
weechat_printf (server->buffer,
|
||||
@ -2500,7 +2507,7 @@ irc_server_connect_cb (void *data, int status, int gnutls_rc,
|
||||
error);
|
||||
}
|
||||
irc_server_close_connection (server);
|
||||
irc_server_switch_address (server);
|
||||
irc_server_switch_address (server, 1);
|
||||
break;
|
||||
case WEECHAT_HOOK_CONNECT_LOCAL_HOSTNAME_ERROR:
|
||||
weechat_printf (server->buffer,
|
||||
@ -2557,7 +2564,7 @@ irc_server_connect_cb (void *data, int status, int gnutls_rc,
|
||||
(void) gnutls_rc;
|
||||
#endif
|
||||
irc_server_close_connection (server);
|
||||
irc_server_switch_address (server);
|
||||
irc_server_switch_address (server, 1);
|
||||
break;
|
||||
case WEECHAT_HOOK_CONNECT_MEMORY_ERROR:
|
||||
weechat_printf (server->buffer,
|
||||
@ -3182,7 +3189,6 @@ irc_server_reconnect (struct t_irc_server *server)
|
||||
IRC_PLUGIN_NAME);
|
||||
|
||||
server->reconnect_start = 0;
|
||||
irc_server_set_index_current_address(server, 0);
|
||||
|
||||
if (irc_server_connect (server))
|
||||
server->reconnect_join = 1;
|
||||
@ -3215,7 +3221,8 @@ irc_server_auto_connect ()
|
||||
*/
|
||||
|
||||
void
|
||||
irc_server_disconnect (struct t_irc_server *server, int reconnect)
|
||||
irc_server_disconnect (struct t_irc_server *server, int switch_address,
|
||||
int reconnect)
|
||||
{
|
||||
struct t_irc_channel *ptr_channel;
|
||||
|
||||
@ -3245,7 +3252,11 @@ irc_server_disconnect (struct t_irc_server *server, int reconnect)
|
||||
IRC_PLUGIN_NAME);
|
||||
}
|
||||
|
||||
irc_server_set_index_current_address(server, 0);
|
||||
if (switch_address)
|
||||
irc_server_switch_address (server, 0);
|
||||
else
|
||||
irc_server_set_index_current_address(server, 0);
|
||||
|
||||
if (server->nick_modes)
|
||||
{
|
||||
free (server->nick_modes);
|
||||
@ -3303,7 +3314,7 @@ irc_server_disconnect_all ()
|
||||
for (ptr_server = irc_servers; ptr_server;
|
||||
ptr_server = ptr_server->next_server)
|
||||
{
|
||||
irc_server_disconnect (ptr_server, 0);
|
||||
irc_server_disconnect (ptr_server, 0, 0);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -232,7 +232,8 @@ extern void irc_server_set_away (struct t_irc_server *server, const char *nick,
|
||||
int is_away);
|
||||
extern void irc_server_remove_away ();
|
||||
extern void irc_server_check_away ();
|
||||
extern void irc_server_disconnect (struct t_irc_server *server, int reconnect);
|
||||
extern void irc_server_disconnect (struct t_irc_server *server,
|
||||
int switch_address, int reconnect);
|
||||
extern void irc_server_disconnect_all ();
|
||||
extern void irc_server_free (struct t_irc_server *server);
|
||||
extern int irc_server_xfer_send_ready_cb (void *data, const char *signal,
|
||||
|
@ -120,7 +120,7 @@ irc_signal_upgrade_cb (void *data, const char *signal, const char *type_data,
|
||||
"can't work for servers connected via SSL"),
|
||||
weechat_prefix ("error"),
|
||||
IRC_PLUGIN_NAME);
|
||||
irc_server_disconnect (ptr_server, 0);
|
||||
irc_server_disconnect (ptr_server, 0, 0);
|
||||
/*
|
||||
* schedule reconnection: WeeChat will reconnect to this server
|
||||
* after restart
|
||||
|
Loading…
x
Reference in New Issue
Block a user