]> git.ipfire.org Git - thirdparty/ldns.git/commitdiff
added -r <root.hints file> option for use with the -T[D] trace functionality
authorJelte Jansen <jeltejan@NLnetLabs.nl>
Tue, 28 Nov 2006 14:05:46 +0000 (14:05 +0000)
committerJelte Jansen <jeltejan@NLnetLabs.nl>
Tue, 28 Nov 2006 14:05:46 +0000 (14:05 +0000)
fixed rr_compare to exclude TTLs

drill/chasetrace.c
drill/drill.c
drill/drill.h.in
drill/root.c
drill/securetrace.c
rr.c

index eca22dbb36a4d59de75f52e0ab5ee16ba04bba98..936f653a3e93b872593751f0b475347989f3c630 100644 (file)
@@ -70,12 +70,15 @@ do_trace(ldns_resolver *local_res, ldns_rdf *name, ldns_rr_type t,
        ldns_resolver_set_recursive(res, false);
 
        /* setup the root nameserver in the new resolver */
-       if (ldns_resolver_push_nameserver_rr_list(res, global_dns_root) != LDNS_STATUS_OK) {
+       status = ldns_resolver_push_nameserver_rr_list(res, global_dns_root);
+       if (status != LDNS_STATUS_OK) {
+               fprintf(stderr, "Error adding root servers to resolver: %s\n", ldns_get_errorstr_by_id(status));
+               ldns_rr_list_print(stdout, global_dns_root);
                return NULL;
        }
 
        /* this must be a real query to local_res */
-       status = ldns_resolver_send(&p, local_res, ldns_dname_new_frm_str("."), LDNS_RR_TYPE_NS, c, 0);
+       status = ldns_resolver_send(&p, res, ldns_dname_new_frm_str("."), LDNS_RR_TYPE_NS, c, 0);
        /* p can still be NULL */
 
 
index 9ffdcf0085f82a8095459f4b48e81584a64e1bd6..7824da542b7ad75847e1368438af1414012daf63 100644 (file)
@@ -54,7 +54,7 @@ usage(FILE *stream, const char *progname)
        fprintf(stream, "\t-u\t\tsend the query with udp (the default)\n");
        fprintf(stream, "\t-x\t\tdo a reverse lookup\n");
        fprintf(stream, "\twhen doing a secure trace:\n");
-       fprintf(stream, "\t-r <file>\t\tuse file as root servers hint file (NOT IMPLEMENTED YET)\n");
+       fprintf(stream, "\t-r <file>\t\tuse file as root servers hint file\n");
        fprintf(stream, "\t-d <domain>\t\tuse domain as the start point for the trace\n");
         fprintf(stream, "\t-y <name:key[:algo]>\tspecify named base64 tsig key, and optional an\n\t\t\talgorithm (defaults to hmac-md5.sig-alg.reg.int)\n");
        fprintf(stream, "\t-z\t\tdon't randomize the nameservers before use\n");
@@ -214,6 +214,18 @@ main(int argc, char *argv[])
                        case 'q':
                                query_file = optarg;
                                PURPOSE = DRILL_QTOFILE;
+                               break;
+                       case 'r':
+                               if (global_dns_root) {
+                                       fprintf(stderr, "There was already a series of root servers set\n");
+                                       exit(EXIT_FAILURE);
+                               }
+                               global_dns_root = read_root_hints(optarg);
+                               if (!global_dns_root) {
+                                       fprintf(stderr, "Unable to read root hints file %s, aborting\n", optarg);
+                                       exit(EXIT_FAILURE);
+                               }
+                               break;
                        /* query options */
                        case 'a':
                                qfail = true;
@@ -358,6 +370,7 @@ main(int argc, char *argv[])
                                }
                                break;
                        case 'h':
+                               version(stdout, progname);
                                usage(stdout, progname);
                                result = EXIT_SUCCESS;
                                goto exit;
@@ -528,7 +541,10 @@ main(int argc, char *argv[])
        switch(PURPOSE) {
                case DRILL_TRACE:
                        /* do a trace from the root down */
-                       init_root();
+                       if (!global_dns_root) {
+
+                               init_root();
+                       }
                        qname = ldns_dname_new_frm_str(name);
                        if (!qname) {
                                error("%s", "making qname");
@@ -539,7 +555,9 @@ main(int argc, char *argv[])
                        break;
                case DRILL_SECTRACE:
                        /* do a secure trace from the root down */
-                       init_root();
+                       if (!global_dns_root) {
+                               init_root();
+                       }
                        qname = ldns_dname_new_frm_str(name);
                        if (!qname) {
                                error("%s", "making qname");
index a8801f4433777938c4df387c0d39617771302e94..0f5c28c4254a509e37e95b3d1f20de0dfb6431de 100644 (file)
@@ -58,6 +58,7 @@ ldns_rr       *read_key_file(const char *filename);
 ldns_pkt       *read_hex_pkt(char *filename);
 ldns_buffer    *read_hex_buffer(char *filename);
 void           init_root(void);
+ldns_rr_list   *read_root_hints(const char *filename);
 void           clear_root(void);
 void           dump_hex(const ldns_pkt *pkt, const char *file);
 void           warning(const char *fmt, ...);
index dc3a0ba3388a760ec57be11ebf462a9aad710fcf..97aec3a8db12a9d5b7c5540eff899abfd5a6e69e 100644 (file)
 
 #include "drill.h"
 #include <ldns/ldns.h>
+#include <errno.h>
 
 /* a global list of the root-servers */
-ldns_rr_list *global_dns_root;
+ldns_rr_list *global_dns_root = NULL;
 
 /* put a hardcoded list in the root and
  * init the root rrlist structure */
@@ -51,6 +52,55 @@ init_root(void)
        ldns_rr_list_push_rr(global_dns_root, r);
 }
 
+/*
+ * Read a hints file as root
+ *
+ * The file with the given path should contain a list of NS RRs
+ * for the root zone and A records for those NS RRs.
+ * Read them, check them, and append the a records to the rr list given.
+ */
+ldns_rr_list *
+read_root_hints(const char *filename)
+{
+       FILE *fp = NULL;
+       int line_nr = 0;
+       ldns_zone *z;
+       ldns_status status;
+       ldns_rr_list *addresses = NULL;
+       ldns_rr *rr;
+       size_t i;
+
+       fp = fopen(filename, "r");
+       if (!fp) {
+               fprintf(stderr, "Unable to open %s for reading: %s\n", filename, strerror(errno));
+               return NULL;
+       }
+
+       status = ldns_zone_new_frm_fp_l(&z, fp, NULL, 0, 0, &line_nr);
+       fclose(fp);
+       if (status != LDNS_STATUS_OK) {
+               fprintf(stderr, "Error reading root hints file: %s\n", ldns_get_errorstr_by_id(status));
+               return NULL;
+       } else {
+               addresses = ldns_rr_list_new();
+               for (i = 0; i < ldns_rr_list_rr_count(ldns_zone_rrs(z)); i++) { 
+                       rr = ldns_rr_list_rr(ldns_zone_rrs(z), i);
+                       /*if ((address_family == 0 || address_family == 1) &&
+                       */
+                       if ( ldns_rr_get_type(rr) == LDNS_RR_TYPE_A ) {
+                               ldns_rr_list_push_rr(addresses, ldns_rr_clone(rr));
+                       }
+                       /*if ((address_family == 0 || address_family == 2) &&*/
+                       if ( ldns_rr_get_type(rr) == LDNS_RR_TYPE_AAAA) {
+                               ldns_rr_list_push_rr(addresses, ldns_rr_clone(rr));
+                       }
+               }
+               ldns_zone_deep_free(z);
+               return addresses;
+       }
+}
+
+
 void
 clear_root(void)
 {
index 2016783128d827586de048de1eb090da0f12e4f7..fc3f46fec45c0bfc1d6e9f13a2f58a2f1fb6273e 100644 (file)
@@ -222,6 +222,13 @@ do_secure_trace(ldns_resolver *local_res, ldns_rdf *name, ldns_rr_type t,
        ldns_resolver_set_dnssec_cd(res, false);
        ldns_resolver_set_dnssec(res, true);
 
+       /* setup the root nameserver in the new resolver */
+       status = ldns_resolver_push_nameserver_rr_list(res, global_dns_root);
+       if (status != LDNS_STATUS_OK) {
+               printf("ERRRRR: %s\n", ldns_get_errorstr_by_id(status));
+               ldns_rr_list_print(stdout, global_dns_root);
+               return NULL;
+       }
        labels_count = ldns_dname_label_count(name);
        if (start_name) {
                if (ldns_dname_is_subdomain(name, start_name)) {
diff --git a/rr.c b/rr.c
index 4ba38ab16b5239fa45f16203eb037baf98cac540..9949d4e7f5008d2a6b42596d41e77d7e206fbb18 100644 (file)
--- a/rr.c
+++ b/rr.c
@@ -1315,15 +1315,21 @@ ldns_rr_compare_no_rdata(const ldns_rr *rr1, const ldns_rr *rr2)
 
 int ldns_rr_compare_wire(ldns_buffer *rr1_buf, ldns_buffer *rr2_buf)
 {
-        size_t rr1_len, rr2_len, min_len, i;
+        size_t rr1_len, rr2_len, min_len, i, offset;
         
-
         rr1_len = ldns_buffer_capacity(rr1_buf);
         rr2_len = ldns_buffer_capacity(rr2_buf);
 
+        /* jump past dname (checked in earlier part)
+         * and especially past TTL */
+        offset = 0;
+        while (offset < rr1_len && *ldns_buffer_at(rr1_buf, offset) != 0) {
+          offset += *ldns_buffer_at(rr1_buf, offset);
+        }
+        offset += 9;
        min_len = (rr1_len < rr2_len) ? rr1_len : rr2_len;
         /* Compare RRs RDATA byte for byte. */
-        for(i = 0; i < min_len; i++) {
+        for(i = offset; i < min_len; i++) {
                        if (*ldns_buffer_at(rr1_buf,i) < *ldns_buffer_at(rr2_buf,i)) {
                                return -1;
                        } else if (*ldns_buffer_at(rr1_buf,i) > *ldns_buffer_at(rr2_buf,i)) {
@@ -1375,7 +1381,6 @@ ldns_rr_compare(const ldns_rr *rr1, const ldns_rr *rr2)
                ldns_buffer_free(rr2_buf);
        }
 
-
        return result;
 }