From 1a1306df018bd62cf1c5feb2e6e664f656bc9554 Mon Sep 17 00:00:00 2001 From: Andreas Schweitzer Date: Wed, 3 Jun 2015 23:33:38 +0200 Subject: [PATCH] dns: do not treat unreachable DNS server as permanent error getaddrinfo() does not distinguish between "DNS server not reachable" and "DNS server told me host does not exist". For SMARTHOSTS it is better to defer than to bounce in order to survive network outages. Bug: fixes #30 --- dns.c | 24 ++++++++++++++++++++---- 1 file changed, 20 insertions(+), 4 deletions(-) diff --git a/dns.c b/dns.c index 318b10b..dd9ebfc 100644 --- a/dns.c +++ b/dns.c @@ -68,7 +68,6 @@ add_host(int pref, const char *host, int port, struct mx_hostentry **he, size_t char servname[10]; struct mx_hostentry *p; const int count_inc = 10; - int err; memset(&hints, 0, sizeof(hints)); hints.ai_family = PF_UNSPEC; @@ -76,9 +75,26 @@ add_host(int pref, const char *host, int port, struct mx_hostentry **he, size_t hints.ai_protocol = IPPROTO_TCP; snprintf(servname, sizeof(servname), "%d", port); - err = getaddrinfo(host, servname, &hints, &res0); - if (err) - return (err == EAI_AGAIN ? 1 : -1); + switch (getaddrinfo(host, servname, &hints, &res0)) { + case 0: + break; + case EAI_AGAIN: + case EAI_NONAME: + /* + * EAI_NONAME gets returned for: + * SMARTHOST set but DNS server not reachable -> defer + * SMARTHOST set but DNS server returns "host does not exist" + * -> buggy configuration + * -> either defer or bounce would be ok -> defer + * MX entry was returned by DNS server but name doesn't resolve + * -> hopefully transient situation -> defer + * all other DNS problems should have been caught earlier + * in dns_get_mx_list(). + */ + goto out; + default: + return(-1); + } for (res = res0; res != NULL; res = res->ai_next) { if (*ps + 1 >= roundup(*ps, count_inc)) { -- 2.39.2