From 32cdc6abdf18a1f5a568929c359e43432ae48a07 Mon Sep 17 00:00:00 2001 From: LemonBoy Date: Thu, 30 Jun 2016 13:30:49 +0200 Subject: [PATCH] Better interaction between reverse-DNS resolution and reconnection. --- src/core/server-rec.h | 1 + src/core/servers-reconnect.c | 5 ++++- src/core/servers.c | 1 + 3 files changed, 6 insertions(+), 1 deletion(-) diff --git a/src/core/server-rec.h b/src/core/server-rec.h index 69e990c6..4ba1fb58 100644 --- a/src/core/server-rec.h +++ b/src/core/server-rec.h @@ -36,6 +36,7 @@ unsigned int server_operator:1; unsigned int usermode_away:1; unsigned int banned:1; /* not allowed to connect to this server */ unsigned int dns_error:1; /* DNS said the host doesn't exist */ +unsigned int dns_reverse:1; GTimeVal lag_sent; /* 0 or time when last lag query was sent to server */ time_t lag_last_check; /* last time we checked lag */ diff --git a/src/core/servers-reconnect.c b/src/core/servers-reconnect.c index 58c9dd09..4040dc7a 100644 --- a/src/core/servers-reconnect.c +++ b/src/core/servers-reconnect.c @@ -248,7 +248,10 @@ static void sig_reconnect(SERVER_REC *server) sserver->dns_error = server->dns_error; } - if (sserver == NULL || conn->chatnet == NULL) { + /* server_setup_fill fails if we've reverse-resolved the connrec + * address, so let's pick another server from the chatnet if possible. */ + if ((sserver == NULL && server->dns_reverse == FALSE) || + conn->chatnet == NULL) { /* not in any chatnet, just reconnect back to same server */ conn->family = server->connrec->family; conn->address = g_strdup(server->connrec->address); diff --git a/src/core/servers.c b/src/core/servers.c index d6297c4d..91a1d792 100644 --- a/src/core/servers.c +++ b/src/core/servers.c @@ -311,6 +311,7 @@ static void server_connect_callback_readpipe(SERVER_REC *server) if (servername) { g_free(server->connrec->address); server->connrec->address = g_strdup(servername); + server->dns_reverse = TRUE; } server_real_connect(server, ip, NULL); errormsg = NULL;