2016-01-21 23:40:00 +01:00

150 lines
4.2 KiB
Plaintext

$NetBSD: patch-at,v 1.1 2014/06/15 20:48:50 jnemeth Exp $
--- sendmail/domain.c.orig 2014-03-06 17:31:31.000000000 +0000
+++ sendmail/domain.c
@@ -39,7 +39,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
@@ -58,6 +58,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 **));
@@ -205,11 +207,9 @@ getmxrr(host, mxhosts, mxprefs, droploca
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;
- extern int res_query(), res_search();
if (tTd(8, 2))
sm_dprintf("getmxrr(%s, droplocalhost=%d)\n",
@@ -246,14 +246,24 @@ getmxrr(host, mxhosts, mxprefs, droploca
if (!UseNameServer)
goto punt;
- if (HasWildcardMX && ConfigLevel >= 6)
- resfunc = res_query;
- else
- resfunc = res_search;
errno = 0;
- 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))
@@ -337,7 +347,7 @@ getmxrr(host, mxhosts, mxprefs, droploca
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)
sm_dprintf("unexpected answer type %d, size %d\n",
type, n);
cp += n;
@@ -635,7 +645,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;
@@ -647,9 +657,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, false, statp, false, NULL);
- _res.options = saveopts;
+ sm_res.options = saveopts;
if (nmx <= 0)
return NULL;
if (bitset(MF_MATCHONLY, map->map_mflags))
@@ -793,10 +803,15 @@ 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)
- {
- *statp = EX_UNAVAILABLE;
- return false;
+ 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;
}
*statp = EX_OK;
@@ -834,7 +849,7 @@ cnameloop:
dp = searchlist;
if (n > 0)
*dp++ = "";
- 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;
@@ -842,9 +857,9 @@ cnameloop:
ret++)
*dp++ = *domain++;
}
- else if (n == 0 && bitset(RES_DEFNAMES, _res.options))
+ else if (n == 0 && bitset(RES_DEFNAMES, sm_res.options))
{
- *dp++ = _res.defdname;
+ *dp++ = sm_res.defdname;
}
else if (*cp == '.')
{
@@ -879,8 +894,13 @@ cnameloop:
qtype == T_MX ? "MX" :
"???");
errno = 0;
+# 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;