diff options
| author | Sam Varshavchik | 2019-10-02 08:05:50 -0400 | 
|---|---|---|
| committer | Sam Varshavchik | 2019-10-02 08:05:50 -0400 | 
| commit | 4be1002d33838edbc78d508ef60cea198c94eb02 (patch) | |
| tree | 2dcbf23deb0b9634590abd8412f03de358de1785 | |
| parent | ee1f8e9ae175c44b00a68d274d9fcf57570f7b91 (diff) | |
| download | courier-libs-4be1002d33838edbc78d508ef60cea198c94eb02.tar.bz2 | |
If either ipv4 or ipv6 lookup succeeeds, ignore the other's SOFTFAIL.
| -rw-r--r-- | rfc1035/rfc1035mxlist.c | 42 | 
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 | 
