$NetBSD$

--- sendmail/domain.c.orig	2020-06-02 11:41:43.000000000 +0200
+++ sendmail/domain.c	2021-03-18 15:13:07.177749609 +0100
@@ -48,9 +48,9 @@
 #  define MAXDNSRCH	6	/* number of possible domains to search */
 # endif
 
 # ifndef RES_DNSRCH_VARIABLE
-#  define RES_DNSRCH_VARIABLE	_res.dnsrch
+#  define RES_DNSRCH_VARIABLE	sm_res.dnsrch
 # endif
 
 # ifndef NO_DATA
 #  define NO_DATA	NO_ADDRESS
@@ -67,8 +67,10 @@
 # else
 #  define RES_UNC_T	unsigned char *
 # endif
 
+extern struct __res_state sm_res;
+
 static int	mxrand __P((char *));
 static int	fallbackmxrr __P((int, unsigned short *, char **));
 
 # if DANE
@@ -547,15 +549,13 @@
 	unsigned short localpref = 256;
 	char *fallbackMX = FallbackMX;
 	bool trycanon = false;
 	unsigned short *prefs;
-	int (*resfunc) __P((const char *, int, int, u_char *, int));
 	unsigned short prefer[MAXMXHOSTS];
 	int weight[MAXMXHOSTS];
 	int ttl = 0;
 	bool ad;
 	bool seennullmx = false;
-	extern int res_query(), res_search();
 # if DANE
 	bool cname2mx;
 	char qname[MAXNAME];
 	unsigned long old_options = 0;
@@ -572,11 +572,11 @@
 		return 0;
 # if DANE
 	cname2mx = false;
 	qname[0] = '\0';
-	old_options = _res.options;
+	old_options = sm_res.options;
 	if (ad)
-		_res.options |= SM_RES_DNSSEC;
+		sm_res.options |= SM_RES_DNSSEC;
 # endif
 
 	if ((fallbackMX != NULL && (flags & DROPLOCALHOST) != 0 &&
 	     wordinclass(fallbackMX, 'w')) || (flags & TRYFALLBACK) == 0)
@@ -631,21 +631,31 @@
 	*/
 
 	if (!UseNameServer)
 		goto punt;
-	if (HasWildcardMX && ConfigLevel >= 6)
-		resfunc = res_query;
-	else
-		resfunc = res_search;
 # if DNSSEC_TEST
 	if (tTd(8, 110))
 		resfunc = tstdns_search;
 # endif
 
 	errno = 0;
-	hp = (HEADER *)&answer;
-	n = (*resfunc)(host, C_IN, T_MX, (unsigned char *) &answer,
+	if (HasWildcardMX && ConfigLevel >= 6)
+#if NAMED_RESN
+	       n = res_nquery(&sm_res, host, C_IN, T_MX,
+		      (unsigned char *) &answer, sizeof(answer));
+#else
+	       n = res_query(host, C_IN, T_MX, (unsigned char *) &answer,
+		      sizeof(answer));
+#endif
+	else
+#if NAMED_RESN
+	       n = res_nsearch(&sm_res, host, C_IN, T_MX,
+		      (unsigned char *) &answer, sizeof(answer));
+#else
+	       n = res_search(host, C_IN, T_MX, (unsigned char *) &answer,
 		       sizeof(answer));
+#endif
+	hp = (HEADER *)&answer;
 	if (n < 0)
 	{
 		if (tTd(8, 1))
 # if DNSSEC_TEST
@@ -742,9 +752,9 @@
 			cname2mx = true;
 # endif
 		if (type != T_MX)
 		{
-			if ((tTd(8, 8) || _res.options & RES_DEBUG)
+			if ((tTd(8, 8) || sm_res.options & RES_DEBUG)
 # if DANE
 			    && type != T_RRSIG
 # endif
 			    )
@@ -1041,15 +1051,15 @@
 		nmx = fallbackmxrr(nmx, prefs, mxhosts);
 	}
     done:
 # if DANE
-	_res.options = old_options;
+	sm_res.options = old_options;
 # endif
 	return nmx;
 
    error:
 # if DANE
-	_res.options = old_options;
+	sm_res.options = old_options;
 # endif
 	return -1;
 }
 
@@ -1117,9 +1127,9 @@
 	char **av;
 	int *statp;
 {
 	int nmx;
-	int saveopts = _res.options;
+	int saveopts = sm_res.options;
 	int i;
 	ssize_t len = 0;
 	char *result;
 	char *mxhosts[MAXMXHOSTS + 1];
@@ -1129,11 +1139,11 @@
 	char *p;
 	char buf[PSBUFSIZE / 2];
 # endif
 
-	_res.options &= ~(RES_DNSRCH|RES_DEFNAMES);
+	sm_res.options &= ~(RES_DNSRCH|RES_DEFNAMES);
 	nmx = getmxrr(name, mxhosts, NULL, 0, statp, NULL, -1);
-	_res.options = saveopts;
+	sm_res.options = saveopts;
 	if (nmx <= 0)
 		return NULL;
 	if (bitset(MF_MATCHONLY, map->map_mflags))
 		return map_rewrite(map, name, strlen(name), NULL);
@@ -1270,9 +1280,8 @@
 #  define ADDSL	0
 # endif
 	char *searchlist[MAXDNSRCH + 2 + ADDSL];
 # define SLSIZE SM_ARRAY_SIZE(searchlist)
-	int (*resqdomain) __P((const char *, const char *, int, int, unsigned char *, int));
 # if DANE
 	unsigned long old_options = 0;
 # endif
 
@@ -1281,26 +1290,26 @@
 	ad = true;
 	if (tTd(8, 2))
 		sm_dprintf("dns_getcanonname(%s, trymx=%d)\n", host, trymx);
 
-	if ((_res.options & RES_INIT) == 0 && res_init() == -1)
-	{
-		*statp = EX_UNAVAILABLE;
-		return HOST_NOTFOUND;
+	if ((sm_res.options & RES_INIT) == 0)
+# if NAMED_RESN
+		memset(&sm_res, 0, sizeof(sm_res));
+		if (res_ninit(&sm_res) == -1) {
+# else
+		if (res_init() == -1) {
+# endif
+			*statp = EX_UNAVAILABLE;
+			return false;
 	}
 
 # if DANE
-	old_options = _res.options;
+	old_options = sm_res.options;
 	if (DANE_SECURE == Dane)
-		_res.options |= SM_RES_DNSSEC;
+		sm_res.options |= SM_RES_DNSSEC;
 # endif
 
 	*statp = EX_OK;
-	resqdomain = res_querydomain;
-# if DNSSEC_TEST
-	if (tTd(8, 110))
-		resqdomain = tstdns_querydomain;
-# endif
 
 	/*
 	**  Initialize domain search list.  If there is at least one
 	**  dot in the name, search the unmodified name first so we
@@ -1340,20 +1349,20 @@
 		SM_ASSERT(sli < SLSIZE);
 		searchlist[sli++] = NameSearchList;
 	}
 # endif
-	if (n >= 0 && *--cp != '.' && bitset(RES_DNSRCH, _res.options))
+	if (n >= 0 && *--cp != '.' && bitset(RES_DNSRCH, sm_res.options))
 	{
 		/* make sure there are less than MAXDNSRCH domains */
 		for (domain = RES_DNSRCH_VARIABLE, ret = 0;
 		     *domain != NULL && ret < MAXDNSRCH && sli < SLSIZE;
 		     ret++)
 			searchlist[sli++] = *domain++;
 	}
-	else if (n == 0 && bitset(RES_DEFNAMES, _res.options))
+	else if (n == 0 && bitset(RES_DEFNAMES, sm_res.options))
 	{
 		SM_ASSERT(sli < SLSIZE);
-		searchlist[sli++] = _res.defdname;
+		searchlist[sli++] = sm_res.defdname;
 	}
 	else if (*cp == '.')
 	{
 		*cp = '\0';
@@ -1391,10 +1400,23 @@
 				qtype == T_MX ? "MX" :
 				"???");
 		errno = 0;
 		hp = (HEADER *) &answer;
-		ret = (*resqdomain)(host, dp, C_IN, qtype,
-				      answer.qb2, sizeof(answer.qb2));
+# if DNSSEC_TEST
+		if (tTd(8, 110))
+			ret = tstdns_querydomain(host, dp, C_IN, qtype,
+					answer.qb2, sizeof(answer.qb2));
+		else
+# endif
+		{
+# if NAMED_RESN
+			ret = res_nquerydomain(&sm_res, host, *dp, C_IN, qtype,
+					answer.qb2, sizeof(answer.qb2));
+# else
+			ret = res_querydomain(host, dp, C_IN, qtype,
+					answer.qb2, sizeof(answer.qb2));
+# endif
+		}
 		if (ret <= 0)
 		{
 			int save_errno = errno;
 
@@ -1657,15 +1679,15 @@
 	/* return only one TTL entry, that should be sufficient */
 	if (ttl > 0 && pttl != NULL)
 		*pttl = ttl;
 # if DANE
-	_res.options = old_options;
+	sm_res.options = old_options;
 # endif
 	return ad ? HOST_SECURE : HOST_OK;
 
   error:
 # if DANE
-	_res.options = old_options;
+	sm_res.options = old_options;
 # endif
 	return HOST_NOTFOUND;
 }
 
