]> git.ipfire.org Git - thirdparty/bind9.git/commitdiff
1995. [bug] 'host' was reporting multiple "is an alias" messages.
authorMark Andrews <marka@isc.org>
Thu, 2 Mar 2006 01:50:17 +0000 (01:50 +0000)
committerMark Andrews <marka@isc.org>
Thu, 2 Mar 2006 01:50:17 +0000 (01:50 +0000)
                        [RT #15702]

CHANGES
bin/dig/host.c

diff --git a/CHANGES b/CHANGES
index 8fd37b41ba10285e2ae88e9a9d5c5de6ac0a681f..ba1216ebfd53b109ceb55bacc39d93002a672750 100644 (file)
--- a/CHANGES
+++ b/CHANGES
@@ -1,3 +1,6 @@
+1995.  [bug]           'host' was reporting multiple "is an alias" messages.
+                       [RT #15702]
+
 1994.  [port]          OpenSSL 0.9.8 support. [RT #15694]
 
 1993.  [bug]           Log messsage, via syslog, were missing the space
index 468d53bf944ed6568eaecd87f0e132c0b7938b0e..a75d511db148da462e6bad3389c9b82de3fed973 100644 (file)
@@ -15,7 +15,7 @@
  * PERFORMANCE OF THIS SOFTWARE.
  */
 
-/* $Id: host.c,v 1.76.2.5.2.13 2005/07/04 03:29:45 marka Exp $ */
+/* $Id: host.c,v 1.76.2.5.2.14 2006/03/02 01:50:17 marka Exp $ */
 
 #include <config.h>
 #include <limits.h>
@@ -37,6 +37,7 @@
 #include <dns/rdataclass.h>
 #include <dns/rdataset.h>
 #include <dns/rdatatype.h>
+#include <dns/rdatastruct.h>
 
 #include <dig/dig.h>
 
@@ -351,6 +352,32 @@ printrdata(dns_message_t *msg, dns_rdataset_t *rdataset, dns_name_t *owner,
        return (ISC_R_SUCCESS);
 }
 
+static void
+chase_cnamechain(dns_message_t *msg, dns_name_t *qname) {
+       isc_result_t result;
+       dns_rdataset_t *rdataset;
+       dns_rdata_cname_t cname;
+       dns_rdata_t rdata = DNS_RDATA_INIT;
+       unsigned int i = msg->counts[DNS_SECTION_ANSWER];
+
+       while (i-- > 0) {
+               rdataset = NULL;
+               result = dns_message_findname(msg, DNS_SECTION_ANSWER, qname,
+                                             dns_rdatatype_cname, 0, NULL,
+                                             &rdataset);
+               if (result != ISC_R_SUCCESS)
+                       return;
+               result = dns_rdataset_first(rdataset);
+               check_result(result, "dns_rdataset_first");
+               dns_rdata_reset(&rdata);
+               dns_rdataset_current(rdataset, &rdata);
+               result = dns_rdata_tostruct(&rdata, &cname, NULL);
+               check_result(result, "dns_rdata_tostruct");
+               dns_name_copy(&cname.cname, qname, NULL);
+               dns_rdata_freestruct(&cname);
+       }
+}
+
 isc_result_t
 printmessage(dig_query_t *query, dns_message_t *msg, isc_boolean_t headers) {
        isc_boolean_t did_flag = ISC_FALSE;
@@ -389,10 +416,15 @@ printmessage(dig_query_t *query, dns_message_t *msg, isc_boolean_t headers) {
        if (default_lookups && query->lookup->rdtype == dns_rdatatype_a) {
                char namestr[DNS_NAME_FORMATSIZE];
                dig_lookup_t *lookup;
+               dns_fixedname_t fixed;
+               dns_name_t *name;
 
                /* Add AAAA and MX lookups. */
-
-               dns_name_format(query->lookup->name, namestr, sizeof(namestr));
+               dns_fixedname_init(&fixed);
+               name = dns_fixedname_name(&fixed);
+               dns_name_copy(query->lookup->name, name, NULL);
+               chase_cnamechain(msg, name);
+               dns_name_format(name, namestr, sizeof(namestr));
                lookup = clone_lookup(query->lookup, ISC_FALSE);
                if (lookup != NULL) {
                        strncpy(lookup->textname, namestr,