$NetBSD$

--- sendmail/sm_resolve.c.orig	2020-06-08 10:35:03.000000000 +0200
+++ sendmail/sm_resolve.c	2021-03-18 16:28:46.586946441 +0100
@@ -54,8 +54,12 @@
 #include <arpa/inet.h>
 
 SM_RCSID("$Id: sm_resolve.c,v 8.40 2013-11-22 20:51:56 ca Exp $")
 
+#if NAMED_BIND
+extern struct __res_state sm_res;
+#endif
+
 static struct stot
 {
 	const char	*st_name;
 	int		st_type;
@@ -768,9 +772,9 @@
 		*h = '\0';
 	r = inet_pton(AF_INET, p, &nsip);
 	if (r > 0)
 	{
-		if ((_res.options & RES_INIT) == 0)
+		if ((sm_res.options & RES_INIT) == 0)
 			(void) res_init();
 		dns_setns(&nsip, port);
 	}
 	if (h != NULL)
@@ -793,13 +797,13 @@
 dns_setns(ns, port)
 	struct in_addr *ns;
 	unsigned int port;
 {
-	_res.nsaddr_list[0].sin_family = AF_INET;
-	_res.nsaddr_list[0].sin_addr = *ns;
+	sm_res.nsaddr_list[0].sin_family = AF_INET;
+	sm_res.nsaddr_list[0].sin_addr = *ns;
 	if (port != 0)
-		_res.nsaddr_list[0].sin_port = htons(port);
-	_res.nscount = 1;
+		sm_res.nsaddr_list[0].sin_port = htons(port);
+	sm_res.nscount = 1;
 	if (tTd(8, 61))
 		sm_dprintf("dns_setns(%s,%u)\n", inet_ntoa(*ns), port);
 }
 
@@ -942,9 +946,9 @@
 		if (strcmp(token, "ad") == 0)
 		{
 			bool adflag;
 
-			adflag = (_res.options & RES_USE_DNSSEC) != 0;
+			adflag = (sm_res.options & RES_USE_DNSSEC) != 0;
 
 			/* maybe print this only for the final RR? */
 			if (tTd(8, 61))
 				sm_dprintf("dnscrtrr: ad=1, adp=%d, adflag=%d\n",
@@ -1286,53 +1290,57 @@
 	int save_retry = 0;
 	DNS_REPLY_T *dr = NULL;
 	querybuf reply_buf;
 	unsigned char *reply;
-	int (*resfunc) __P((const char *, int, int, u_char *, int));
 
 #  define SMRBSIZE ((int) sizeof(reply_buf))
 #  ifndef IP_MAXPACKET
 #   define IP_MAXPACKET	65535
 #  endif
 
-	resfunc = res_search;
-#  if DNSSEC_TEST
-	if (tTd(8, 110))
-		resfunc = tstdns_search;
-#  endif
-
-	old_options = _res.options;
-	_res.options |= options;
+	old_options = sm_res.options;
+	sm_res.options |= options;
 	if (err != NULL)
 		*err = 0;
 	if (herr != NULL)
 		*herr = 0;
 	if (tTd(8, 16))
 	{
-		_res.options |= RES_DEBUG;
+		sm_res.options |= RES_DEBUG;
 		sm_dprintf("dns_lookup_int(%s, %d, %s, %x)\n", domain,
 			   rr_class, dns_type_to_string(rr_type), options);
 	}
 #  if DNSSEC_TEST
 	if (tTd(8, 15))
 		sm_dprintf("NS=%s, port=%d\n",
-			inet_ntoa(_res.nsaddr_list[0].sin_addr),
-			ntohs(_res.nsaddr_list[0].sin_port));
+			inet_ntoa(sm_res.nsaddr_list[0].sin_addr),
+			ntohs(sm_res.nsaddr_list[0].sin_port));
 #  endif
 	if (retrans > 0)
 	{
-		save_retrans = _res.retrans;
-		_res.retrans = retrans;
+		save_retrans = sm_res.retrans;
+		sm_res.retrans = retrans;
 	}
 	if (retry > 0)
 	{
-		save_retry = _res.retry;
-		_res.retry = retry;
+		save_retry = sm_res.retry;
+		sm_res.retry = retry;
 	}
 	errno = 0;
 	SM_SET_H_ERRNO(0);
 	reply = (unsigned char *)&reply_buf;
-	len = (*resfunc)(domain, rr_class, rr_type, reply, SMRBSIZE);
+#if DNSSEC_TEST
+	if (tTd(8, 110))
+		len = tstdns_search(domain, rr_class, rr_type, reply, SMRBSIZE);
+	else
+#endif
+	{
+#if NAMED_RESN
+		len = res_nsearch(&sm_res, domain, rr_class, rr_type, reply, SMRBSIZE);
+#else
+		len = res_search(domain, rr_class, rr_type, reply, SMRBSIZE);
+#endif
+	}
 	if (len >= SMRBSIZE)
 	{
 		if (len >= IP_MAXPACKET)
 		{
@@ -1350,14 +1358,19 @@
 				SM_SET_H_ERRNO(TRY_AGAIN);
 			else
 			{
 				SM_SET_H_ERRNO(0);
-				len = (*resfunc)(domain, rr_class, rr_type,
-						 reply, IP_MAXPACKET);
+#if NAMED_RESN
+				len = res_nsearch(&sm_res, domain, rr_class,
+						rr_type, reply, IP_MAXPACKET);
+#else
+				len = res_search(domain, rr_class,
+						rr_type, reply, IP_MAXPACKET);
+#endif
 			}
 		}
 	}
-	_res.options = old_options;
+	sm_res.options = old_options;
 	if (len < 0)
 	{
 		if (err != NULL)
 			*err = errno;
@@ -1391,11 +1404,11 @@
 		sm_free(reply);
 		reply = NULL;
 	}
 	if (retrans > 0)
-		_res.retrans = save_retrans;
+		sm_res.retrans = save_retrans;
 	if (retry > 0)
-		_res.retry = save_retry;
+		sm_res.retry = save_retry;
 	return dr;
 }
 
 /*
