summaryrefslogtreecommitdiffstats
path: root/rfc1035
diff options
context:
space:
mode:
authorSam Varshavchik2019-10-02 08:05:50 -0400
committerSam Varshavchik2019-10-02 08:05:50 -0400
commit4be1002d33838edbc78d508ef60cea198c94eb02 (patch)
tree2dcbf23deb0b9634590abd8412f03de358de1785 /rfc1035
parentee1f8e9ae175c44b00a68d274d9fcf57570f7b91 (diff)
downloadcourier-libs-4be1002d33838edbc78d508ef60cea198c94eb02.tar.bz2
If either ipv4 or ipv6 lookup succeeeds, ignore the other's SOFTFAIL.
Diffstat (limited to 'rfc1035')
-rw-r--r--rfc1035/rfc1035mxlist.c42
1 files changed, 27 insertions, 15 deletions
diff --git a/rfc1035/rfc1035mxlist.c b/rfc1035/rfc1035mxlist.c
index de2448e..48c5f3c 100644
--- a/rfc1035/rfc1035mxlist.c
+++ b/rfc1035/rfc1035mxlist.c
@@ -91,6 +91,7 @@ static int add_arecords(struct rfc1035_res *res, struct rfc1035_mxlist **list,
{
#if RFC1035_IPV6
struct in6_addr in;
+ int rc2;
int first_a=RFC1035_TYPE_A;
int second_a=RFC1035_TYPE_AAAA;
const char *prefer_ipv6=getenv("ESMTP_PREFER_IPV6_MX");
@@ -134,30 +135,41 @@ records weren't found.
if (mxreply && !(opts & RFC1035_MX_QUERYALL))
{
- if ((rc=harvest_records(res, list, mxreply, mxpreference,
- mxname, second_a, &found, HARVEST_NODUPE,
- port))
- != RFC1035_MX_OK)
- return (rc);
+ rc2=harvest_records(res, list, mxreply, mxpreference,
+ mxname, second_a, &found, HARVEST_NODUPE,
+ port);
+
+ if (rc2 != RFC1035_MX_OK && rc2 != RFC1035_MX_SOFTERR)
+ return rc2;
+
+ rc=harvest_records(res, list, mxreply, mxpreference,
+ mxname, first_a, &found, 0, port);
- if ((rc=harvest_records(res, list, mxreply, mxpreference,
- mxname, first_a, &found, 0, port))
- != RFC1035_MX_OK)
+ if (rc != RFC1035_MX_OK && rc != RFC1035_MX_SOFTERR)
return (rc);
+ if (rc == RFC1035_MX_SOFTERR && rc2 == RFC1035_MX_SOFTERR)
+ return rc;
+
if (found) return (RFC1035_MX_OK);
}
- if ((rc=harvest_records(res, list, mxreply, mxpreference, mxname,
- second_a, &found, HARVEST_AUTOQUERY|HARVEST_NODUPE, port))
- != RFC1035_MX_OK)
- return (rc);
+ rc2=harvest_records(res, list, mxreply, mxpreference, mxname,
+ second_a, &found, HARVEST_AUTOQUERY|HARVEST_NODUPE,
+ port);
- if ((rc=harvest_records(res, list, mxreply, mxpreference, mxname,
- first_a, &found, HARVEST_AUTOQUERY, port))
- != RFC1035_MX_OK)
+ if (rc2 != RFC1035_MX_OK && rc2 != RFC1035_MX_SOFTERR)
+ return rc2;
+
+ rc=harvest_records(res, list, mxreply, mxpreference, mxname,
+ first_a, &found, HARVEST_AUTOQUERY, port);
+
+ if (rc != RFC1035_MX_OK && rc != RFC1035_MX_SOFTERR)
return (rc);
+ if (rc == RFC1035_MX_SOFTERR && rc2 == RFC1035_MX_SOFTERR)
+ return rc;
+
if (found) return (RFC1035_MX_OK);
#else