X-Git-Url: https://git.exim.org/exim.git/blobdiff_plain/75e0e026a196fa852a855d5148f29be29ac2d92f..91ecef39cad37bb5de008f557bded8dcbc8aa6e3:/src/src/host.c diff --git a/src/src/host.c b/src/src/host.c index 07d28395e..fdaab31e5 100644 --- a/src/src/host.c +++ b/src/src/host.c @@ -1,4 +1,4 @@ -/* $Cambridge: exim/src/src/host.c,v 1.22 2006/02/16 10:05:33 ph10 Exp $ */ +/* $Cambridge: exim/src/src/host.c,v 1.25 2006/09/05 14:05:43 ph10 Exp $ */ /************************************************* * Exim - an Internet mail transport agent * @@ -1890,13 +1890,13 @@ int af; #endif /* If we are in the test harness, a name ending in .test.again.dns always -forces a temporary error response. */ +forces a temporary error response, unless the name is in +dns_again_means_nonexist. */ if (running_in_test_harness) { uschar *endname = host->name + Ustrlen(host->name); - if (Ustrcmp(endname - 14, "test.again.dns") == 0) - return HOST_FIND_AGAIN; + if (Ustrcmp(endname - 14, "test.again.dns") == 0) goto RETURN_AGAIN; } /* In an IPv6 world, unless IPv6 has been disabled, we need to scan for both @@ -1936,7 +1936,7 @@ for (i = 1; i <= times; i++) { BOOL ipv4_addr; - int error_num; + int error_num = 0; struct hostent *hostdata; #if HAVE_IPV6 @@ -2071,7 +2071,7 @@ if (host->address == NULL) string_sprintf("no IP address found for host %s", host->name); HDEBUG(D_host_lookup) debug_printf("%s\n", msg); - if (temp_error) return HOST_FIND_AGAIN; + if (temp_error) goto RETURN_AGAIN; if (host_checking || !log_testing_mode) log_write(L_host_lookup_failed, LOG_MAIN, "%s", msg); return HOST_FIND_FAILED; @@ -2108,6 +2108,28 @@ HDEBUG(D_host_lookup) /* Return the found status. */ return yield; + +/* Handle the case when there is a temporary error. If the name matches +dns_again_means_nonexist, return permanent rather than temporary failure. */ + +RETURN_AGAIN: + { + #ifndef STAND_ALONE + int rc; + uschar *save = deliver_domain; + deliver_domain = host->name; /* set $domain */ + rc = match_isinlist(host->name, &dns_again_means_nonexist, 0, NULL, NULL, + MCL_DOMAIN, TRUE, NULL); + deliver_domain = save; + if (rc == OK) + { + DEBUG(D_host_lookup) debug_printf("%s is in dns_again_means_nonexist: " + "returning HOST_FIND_FAILED\n", host->name); + return HOST_FIND_FAILED; + } + #endif + return HOST_FIND_AGAIN; + } } @@ -2876,17 +2898,19 @@ single MX preference value, IPv6 addresses come first. This can separate the addresses of a multihomed host, but that should not matter. */ #if HAVE_IPV6 -if (h != last) +if (h != last && !disable_ipv6) { for (h = host; h != last; h = h->next) { host_item temp; host_item *next = h->next; - if (h->mx != next->mx || /* If next is different MX value */ - (h->sort_key % 1000) < 500 || /* OR this one is IPv6 */ - (next->sort_key % 1000) >= 500) /* OR next is IPv4 */ - continue; /* move on to next */ - temp = *h; + if (h->mx != next->mx || /* If next is different MX */ + h->address == NULL || /* OR this one is unset */ + Ustrchr(h->address, ':') != NULL || /* OR this one is IPv6 */ + (next->address != NULL && + Ustrchr(next->address, ':') == NULL)) /* OR next is IPv4 */ + continue; /* move on to next */ + temp = *h; /* otherwise, swap */ temp.next = next->next; *h = *next; h->next = next;