summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorPhilip Hazel <ph10@hermes.cam.ac.uk>2004-11-24 15:43:36 +0000
committerPhilip Hazel <ph10@hermes.cam.ac.uk>2004-11-24 15:43:36 +0000
commitea3bc19b9e6b236ca38c6bf506229fd41e89d6ad (patch)
tree46b2cfeca7a735ae33b314023675f3aed0d47d9f /src
parent5b1fde4da6b09fa407b547fcd40e474f6f4d25fc (diff)
Added the mxh lookup type for dnsdb lookups.
Diffstat (limited to 'src')
-rw-r--r--src/ACKNOWLEDGMENTS3
-rw-r--r--src/src/dns.c6
-rw-r--r--src/src/exim.h6
-rw-r--r--src/src/lookups/dnsdb.c38
4 files changed, 36 insertions, 17 deletions
diff --git a/src/ACKNOWLEDGMENTS b/src/ACKNOWLEDGMENTS
index 4ca8ffbb7..fe092c448 100644
--- a/src/ACKNOWLEDGMENTS
+++ b/src/ACKNOWLEDGMENTS
@@ -1,4 +1,4 @@
-$Cambridge: exim/src/ACKNOWLEDGMENTS,v 1.6 2004/11/24 14:38:13 ph10 Exp $
+$Cambridge: exim/src/ACKNOWLEDGMENTS,v 1.7 2004/11/24 15:43:36 ph10 Exp $
EXIM ACKNOWLEDGEMENTS
@@ -122,6 +122,7 @@ Tony Finch Expansion extensions
Timezone patch for exiwhat
Patch for more daemon exiwhat information
Patch for -dd
+ Patch for mxh lookup type in dnsdb
Giuliano Gavazzi Patches for OSX compilation
Dominic Germain Patch for exiqgrep MacOS X bug
Oliver Gorwits $load_average patch
diff --git a/src/src/dns.c b/src/src/dns.c
index a5a154741..e80b1c122 100644
--- a/src/src/dns.c
+++ b/src/src/dns.c
@@ -1,4 +1,4 @@
-/* $Cambridge: exim/src/src/dns.c,v 1.2 2004/11/19 09:45:54 ph10 Exp $ */
+/* $Cambridge: exim/src/src/dns.c,v 1.3 2004/11/24 15:43:36 ph10 Exp $ */
/*************************************************
* Exim - an Internet mail transport agent *
@@ -650,6 +650,10 @@ dns_special_lookup(dns_answer *dnsa, uschar *name, int type,
{
if (type >= 0) return dns_lookup(dnsa, name, type, fully_qualified_name);
+/* The "mx hosts only" type doesn't require any special action here */
+
+if (type == T_MXH) return dns_lookup(dnsa, name, T_MX, fully_qualified_name);
+
/* Find nameservers for the domain or the nearest enclosing zone, excluding the
root servers. */
diff --git a/src/src/exim.h b/src/src/exim.h
index 998adc3ea..397a13687 100644
--- a/src/src/exim.h
+++ b/src/src/exim.h
@@ -1,4 +1,4 @@
-/* $Cambridge: exim/src/src/exim.h,v 1.2 2004/11/19 09:45:54 ph10 Exp $ */
+/* $Cambridge: exim/src/src/exim.h,v 1.3 2004/11/24 15:43:36 ph10 Exp $ */
/*************************************************
* Exim - an Internet mail transport agent *
@@ -279,9 +279,11 @@ header files. I don't suppose they have T_SRV either. */
#endif
/* We use the private type T_ZNS for retrieving the nameservers for the
-enclosing zone of a domain. */
+enclosing zone of a domain, and the private type T_MXH for retrieving
+the MX hostnames only (without their priorities). */
#define T_ZNS (-1)
+#define T_MXH (-2)
/* The resolv.h header defines __P(x) on some Solaris 2.5.1 systems (without
checking that it is already defined, in fact). This conflicts with other
diff --git a/src/src/lookups/dnsdb.c b/src/src/lookups/dnsdb.c
index 22a9de4f4..29a36081e 100644
--- a/src/src/lookups/dnsdb.c
+++ b/src/src/lookups/dnsdb.c
@@ -1,4 +1,4 @@
-/* $Cambridge: exim/src/src/lookups/dnsdb.c,v 1.3 2004/11/19 15:18:57 ph10 Exp $ */
+/* $Cambridge: exim/src/src/lookups/dnsdb.c,v 1.4 2004/11/24 15:43:36 ph10 Exp $ */
/*************************************************
* Exim - an Internet mail transport agent *
@@ -32,6 +32,7 @@ static char *type_names[] = {
#endif
"cname",
"mx",
+ "mxh",
"ns",
"ptr",
"srv",
@@ -49,6 +50,7 @@ static int type_values[] = {
#endif
T_CNAME,
T_MX,
+ T_MXH, /* Private type for "MX hostnames" */
T_NS,
T_PTR,
T_SRV,
@@ -184,6 +186,8 @@ while ((domain = string_nextinlist(&keystring, &sep, buffer, sizeof(buffer)))
!= NULL)
{
uschar rbuffer[256];
+ int searchtype = (type == T_ZNS)? T_NS : /* record type we want */
+ (type == T_MXH)? T_MX : type;
/* If the type is PTR, we have to construct the relevant magic lookup
key. This code is now in a separate function. */
@@ -196,24 +200,25 @@ while ((domain = string_nextinlist(&keystring, &sep, buffer, sizeof(buffer)))
DEBUG(D_lookup) debug_printf("dnsdb key: %s\n", domain);
- /* Do the lookup and sort out the result. We use the special
- lookup function that knows about pseudo types like "zns". If the lookup
- fails, continue with the next domain. */
+ /* Do the lookup and sort out the result. There are two special types that
+ are handled specially: T_ZNS and T_MXH. The former is handled in a special
+ lookup function so that the facility could be used from other parts of the
+ Exim code. The latter affects only what happens later on in this function,
+ but for tidiness it is handled in a similar way. If the lookup fails,
+ continue with the next domain. */
rc = dns_special_lookup(&dnsa, domain, type, NULL);
if (rc == DNS_NOMATCH || rc == DNS_NODATA) continue;
if (rc != DNS_SUCCEED) return DEFER;
- /* If the lookup was a pseudo-type, change it to the correct type for
- searching the returned records; then search for them. */
-
- if (type == T_ZNS) type = T_NS;
+ /* Search the returned records */
+
for (rr = dns_next_rr(&dnsa, &dnss, RESET_ANSWERS);
rr != NULL;
rr = dns_next_rr(&dnsa, &dnss, RESET_NEXT))
{
- if (rr->type != type) continue;
+ if (rr->type != searchtype) continue;
/* There may be several addresses from an A6 record. Put the configured
separator between them, just as for between several records. However, A6
@@ -245,26 +250,33 @@ while ((domain = string_nextinlist(&keystring, &sep, buffer, sizeof(buffer)))
yield = string_cat(yield, &size, &ptr, (uschar *)(rr->data+1),
(rr->data)[0]);
}
- else /* T_CNAME, T_MX, T_NS, T_SRV, T_PTR */
+ else /* T_CNAME, T_MX, T_MXH, T_NS, T_SRV, T_PTR */
{
+ int num;
uschar s[264];
uschar *p = (uschar *)(rr->data);
- if (type == T_MX)
+
+ if (type == T_MXH)
+ {
+ /* mxh ignores the priority number and includes only the hostnames */
+ GETSHORT(num, p); /* pointer is advanced */
+ }
+ else if (type == T_MX)
{
- int num;
GETSHORT(num, p); /* pointer is advanced */
sprintf(CS s, "%d ", num);
yield = string_cat(yield, &size, &ptr, s, Ustrlen(s));
}
else if (type == T_SRV)
{
- int num, weight, port;
+ int weight, port;
GETSHORT(num, p); /* pointer is advanced */
GETSHORT(weight, p);
GETSHORT(port, p);
sprintf(CS s, "%d %d %d ", num, weight, port);
yield = string_cat(yield, &size, &ptr, s, Ustrlen(s));
}
+
rc = dn_expand(dnsa.answer, dnsa.answer + dnsa.answerlen, p,
(DN_EXPAND_ARG4_TYPE)(s), sizeof(s));