$NetBSD$

--- sendmail/domain.c.orig	2018-08-23 21:52:20.000000000 +0900
+++ sendmail/domain.c	2018-09-08 21:22:29.906315766 +0900
@@ -45,7 +45,7 @@ static char	MXHostBuf[MXHOSTBUFSIZE];
 # endif /* ! MAXDNSRCH */
 
 # ifndef RES_DNSRCH_VARIABLE
-#  define RES_DNSRCH_VARIABLE	_res.dnsrch
+#  define RES_DNSRCH_VARIABLE	sm_res.dnsrch
 # endif /* ! RES_DNSRCH_VARIABLE */
 
 # ifndef NO_DATA
@@ -64,6 +64,8 @@ static char	MXHostBuf[MXHOSTBUFSIZE];
 #  define RES_UNC_T	unsigned char *
 # endif /* defined(__RES) && (__RES >= 19940415) */
 
+extern struct __res_state sm_res;
+
 static int	mxrand __P((char *));
 static int	fallbackmxrr __P((int, unsigned short *, char **));
 
@@ -439,12 +441,10 @@ getmxrr(host, mxhosts, mxprefs, flags, r
 	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;
-	extern int res_query(), res_search();
 
 	if (tTd(8, 2))
 		sm_dprintf("getmxrr(%s, droplocalhost=%d)\n",
@@ -482,15 +482,24 @@ getmxrr(host, mxhosts, mxprefs, flags, r
 
 	if (!UseNameServer)
 		goto punt;
-	if (HasWildcardMX && ConfigLevel >= 6)
-		resfunc = res_query;
-	else
-		resfunc = res_search;
 
 	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
 	if (n < 0)
 	{
 		if (tTd(8, 1))
@@ -578,7 +587,7 @@ getmxrr(host, mxhosts, mxprefs, flags, r
 		GETSHORT(n, cp);	/* rdlength */
 		if (type != T_MX)
 		{
-			if ((tTd(8, 8) || _res.options & RES_DEBUG)
+			if ((tTd(8, 8) || sm_res.options & RES_DEBUG)
 # if _FFR_TLSA_DANE
 			    && type != T_RRSIG
 # endif
@@ -890,7 +899,7 @@ bestmx_map_lookup(map, name, av, statp)
 	int *statp;
 {
 	int nmx;
-	int saveopts = _res.options;
+	int saveopts = sm_res.options;
 	int i;
 	ssize_t len = 0;
 	char *result;
@@ -902,9 +911,9 @@ bestmx_map_lookup(map, name, av, statp)
 	char buf[PSBUFSIZE / 2];
 #endif /* _FFR_BESTMX_BETTER_TRUNCATION */
 
-	_res.options &= ~(RES_DNSRCH|RES_DEFNAMES);
+	sm_res.options &= ~(RES_DNSRCH|RES_DEFNAMES);
 	nmx = getmxrr(name, mxhosts, NULL, 0, statp, NULL);
-	_res.options = saveopts;
+	sm_res.options = saveopts;
 	if (nmx <= 0)
 		return NULL;
 	if (bitset(MF_MATCHONLY, map->map_mflags))
@@ -1050,8 +1059,13 @@ dns_getcanonname(host, hbsize, trymx, st
 	if (tTd(8, 2))
 		sm_dprintf("dns_getcanonname(%s, trymx=%d)\n", host, trymx);
 
-	if ((_res.options & RES_INIT) == 0 && res_init() == -1)
-	{
+	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 HOST_NOTFOUND;
 	}
@@ -1098,7 +1112,7 @@ cnameloop:
 		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;
@@ -1106,7 +1120,7 @@ cnameloop:
 		     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;
@@ -1149,8 +1163,13 @@ cnameloop:
 				"???");
 		errno = 0;
 		hp = (HEADER *) &answer;
+# 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;
