mirror of
https://github.com/irssi/irssi.git
synced 2026-08-11 12:53:42 +02:00
fix #641
Track the address family of the last failed connection attempt (either immediately or during TLS handshake), then disprefer that address family during reconnection.
This commit is contained in:
parent
50f8791f1e
commit
7d44964dcd
3 changed files with 15 additions and 3 deletions
|
|
@ -156,6 +156,7 @@ static void server_connect_callback_init(SERVER_REC *server, GIOChannel *handle)
|
|||
error = net_geterror(handle);
|
||||
if (error != 0) {
|
||||
server->connection_lost = TRUE;
|
||||
server->connrec->last_failed_family = server->connrec->chosen_family;
|
||||
server_connect_failed(server, g_strerror(error));
|
||||
return;
|
||||
}
|
||||
|
|
@ -176,6 +177,7 @@ static void server_connect_callback_init_ssl(SERVER_REC *server, GIOChannel *han
|
|||
error = irssi_ssl_handshake(handle);
|
||||
if (error == -1) {
|
||||
server->connection_lost = TRUE;
|
||||
server->connrec->last_failed_family = server->connrec->chosen_family;
|
||||
server_connect_failed(server, NULL);
|
||||
return;
|
||||
}
|
||||
|
|
@ -216,6 +218,7 @@ static void server_real_connect(SERVER_REC *server, IPADDR *ip,
|
|||
return;
|
||||
|
||||
if (ip != NULL) {
|
||||
server->connrec->chosen_family = ip->family;
|
||||
own_ip = IPADDR_IS_V6(ip) ? server->connrec->own_ip6 : server->connrec->own_ip4;
|
||||
port = server->connrec->proxy != NULL ?
|
||||
server->connrec->proxy_port : server->connrec->port;
|
||||
|
|
@ -241,9 +244,11 @@ static void server_real_connect(SERVER_REC *server, IPADDR *ip,
|
|||
server->no_reconnect = TRUE;
|
||||
|
||||
server->connection_lost = TRUE;
|
||||
server->connrec->last_failed_family = ip->family;
|
||||
server_connect_failed(server, errmsg2 ? errmsg2 : errmsg);
|
||||
g_free(errmsg2);
|
||||
} else {
|
||||
server->connrec->last_failed_family = 0;
|
||||
server->handle = net_sendbuffer_create(handle, 0);
|
||||
if (server->connrec->use_tls)
|
||||
server_connect_callback_init_ssl(server, handle);
|
||||
|
|
@ -289,11 +294,15 @@ static void server_connect_callback_readpipe(SERVER_REC *server)
|
|||
ip = iprec.ip6.family == 0 ? NULL : &iprec.ip6;
|
||||
servername = iprec.host6;
|
||||
} else {
|
||||
/* pick the one that was found, or if both do it like
|
||||
/SET resolve_prefer_ipv6 says. */
|
||||
/* pick the one that was found. if both were found:
|
||||
1. disprefer the last one that failed
|
||||
2. prefer ipv4 over ipv6 unless resolve_prefer_ipv6 is set
|
||||
*/
|
||||
if (iprec.ip4.family == 0 ||
|
||||
(iprec.ip6.family != 0 &&
|
||||
settings_get_bool("resolve_prefer_ipv6"))) {
|
||||
(server->connrec->last_failed_family == AF_INET ||
|
||||
(settings_get_bool("resolve_prefer_ipv6") &&
|
||||
server->connrec->last_failed_family != AF_INET6)))) {
|
||||
ip = &iprec.ip6;
|
||||
servername = iprec.host6;
|
||||
} else {
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue