From 39c2d06c7d01ff995a925be290f5f1dd051889a4 Mon Sep 17 00:00:00 2001 From: Willem Toorop Date: Mon, 24 Jun 2019 14:40:33 +0200 Subject: [PATCH] Issue #17: Allow -T and -x together with drill --- drill/drill.c | 146 +++++++++++++++++++++----------------------------- drill/drill.h | 1 - 2 files changed, 60 insertions(+), 87 deletions(-) diff --git a/drill/drill.c b/drill/drill.c index d66ee862..74023a73 100644 --- a/drill/drill.c +++ b/drill/drill.c @@ -111,7 +111,7 @@ main(int argc, char *argv[]) ldns_resolver *cmdline_res = NULL; /* only used to resolv @name names */ ldns_rr_list *cmdline_rr_list = NULL; ldns_rdf *cmdline_dname = NULL; - ldns_rdf *qname, *qname_tmp; + ldns_rdf *qname; ldns_pkt *pkt; ldns_pkt *qpkt; char *serv; @@ -156,6 +156,7 @@ main(int argc, char *argv[]) bool qds; bool qusevc; bool qrandom; + bool drill_reverse = false; char *resolv_conf_file = NULL; @@ -165,6 +166,8 @@ main(int argc, char *argv[]) uint8_t s6addr[16]; char ip6_arpa_str[74]; + uint8_t s4addr[4]; + char in_addr_arpa_str[40]; #ifdef USE_WINSOCK int r; @@ -357,7 +360,7 @@ main(int argc, char *argv[]) result = EXIT_SUCCESS; goto exit; case 'x': - PURPOSE = DRILL_REVERSE; + drill_reverse = true; break; case 'y': #ifdef HAVE_SSL @@ -487,12 +490,66 @@ main(int argc, char *argv[]) clas = LDNS_RR_CLASS_IN; } if (int_type == -1) { - if (PURPOSE != DRILL_REVERSE) { + if (!drill_reverse) { type = LDNS_RR_TYPE_A; } else { type = LDNS_RR_TYPE_PTR; } } + if (!drill_reverse) + ; /* pass */ + else if (strchr(name, ':')) { /* ipv4 or ipv6 addr? */ + if (!inet_pton(AF_INET6, name, &s6addr)) { + error("Syntax error: cannot parse IPv6 address\n"); + } + (void) snprintf(ip6_arpa_str, sizeof(ip6_arpa_str), + "%x.%x.%x.%x.%x.%x.%x.%x." + "%x.%x.%x.%x.%x.%x.%x.%x." + "%x.%x.%x.%x.%x.%x.%x.%x." + "%x.%x.%x.%x.%x.%x.%x.%x.ip6.arpa.", + (unsigned int)(s6addr[15] & 0x0F), + (unsigned int)(s6addr[15] >> 4), + (unsigned int)(s6addr[14] & 0x0F), + (unsigned int)(s6addr[14] >> 4), + (unsigned int)(s6addr[13] & 0x0F), + (unsigned int)(s6addr[13] >> 4), + (unsigned int)(s6addr[12] & 0x0F), + (unsigned int)(s6addr[12] >> 4), + (unsigned int)(s6addr[11] & 0x0F), + (unsigned int)(s6addr[11] >> 4), + (unsigned int)(s6addr[10] & 0x0F), + (unsigned int)(s6addr[10] >> 4), + (unsigned int)(s6addr[9] & 0x0F), + (unsigned int)(s6addr[9] >> 4), + (unsigned int)(s6addr[8] & 0x0F), + (unsigned int)(s6addr[8] >> 4), + (unsigned int)(s6addr[7] & 0x0F), + (unsigned int)(s6addr[7] >> 4), + (unsigned int)(s6addr[6] & 0x0F), + (unsigned int)(s6addr[6] >> 4), + (unsigned int)(s6addr[5] & 0x0F), + (unsigned int)(s6addr[5] >> 4), + (unsigned int)(s6addr[4] & 0x0F), + (unsigned int)(s6addr[4] >> 4), + (unsigned int)(s6addr[3] & 0x0F), + (unsigned int)(s6addr[3] >> 4), + (unsigned int)(s6addr[2] & 0x0F), + (unsigned int)(s6addr[2] >> 4), + (unsigned int)(s6addr[1] & 0x0F), + (unsigned int)(s6addr[1] >> 4), + (unsigned int)(s6addr[0] & 0x0F), + (unsigned int)(s6addr[0] >> 4)); + name = ip6_arpa_str; + + } else if (!inet_pton(AF_INET, name, &s4addr)) { + error("Syntax error: cannot parse IPv4 address\n"); + + } else { + (void) snprintf(in_addr_arpa_str, sizeof(in_addr_arpa_str), + "%d.%d.%d.%d.in-addr.arpa.", (int)s4addr[3], + (int)s4addr[2], (int)s4addr[1], (int)s4addr[0]); + name = in_addr_arpa_str; + } if (src) { src_rdf = ldns_rdf_new_addr_frm_str(src); @@ -740,89 +797,6 @@ main(int argc, char *argv[]) break; case DRILL_NSEC: break; - case DRILL_REVERSE: - /* ipv4 or ipv6 addr? */ - if (strchr(name, ':')) { - if (!inet_pton(AF_INET6, name, &s6addr)) { - error("Syntax error: cannot parse IPv6 address\n"); - } - (void) snprintf(ip6_arpa_str, sizeof(ip6_arpa_str), - "%x.%x.%x.%x.%x.%x.%x.%x." - "%x.%x.%x.%x.%x.%x.%x.%x." - "%x.%x.%x.%x.%x.%x.%x.%x." - "%x.%x.%x.%x.%x.%x.%x.%x.ip6.arpa.", - (unsigned int)(s6addr[15] & 0x0F), - (unsigned int)(s6addr[15] >> 4), - (unsigned int)(s6addr[14] & 0x0F), - (unsigned int)(s6addr[14] >> 4), - (unsigned int)(s6addr[13] & 0x0F), - (unsigned int)(s6addr[13] >> 4), - (unsigned int)(s6addr[12] & 0x0F), - (unsigned int)(s6addr[12] >> 4), - (unsigned int)(s6addr[11] & 0x0F), - (unsigned int)(s6addr[11] >> 4), - (unsigned int)(s6addr[10] & 0x0F), - (unsigned int)(s6addr[10] >> 4), - (unsigned int)(s6addr[9] & 0x0F), - (unsigned int)(s6addr[9] >> 4), - (unsigned int)(s6addr[8] & 0x0F), - (unsigned int)(s6addr[8] >> 4), - (unsigned int)(s6addr[7] & 0x0F), - (unsigned int)(s6addr[7] >> 4), - (unsigned int)(s6addr[6] & 0x0F), - (unsigned int)(s6addr[6] >> 4), - (unsigned int)(s6addr[5] & 0x0F), - (unsigned int)(s6addr[5] >> 4), - (unsigned int)(s6addr[4] & 0x0F), - (unsigned int)(s6addr[4] >> 4), - (unsigned int)(s6addr[3] & 0x0F), - (unsigned int)(s6addr[3] >> 4), - (unsigned int)(s6addr[2] & 0x0F), - (unsigned int)(s6addr[2] >> 4), - (unsigned int)(s6addr[1] & 0x0F), - (unsigned int)(s6addr[1] >> 4), - (unsigned int)(s6addr[0] & 0x0F), - (unsigned int)(s6addr[0] >> 4)); - - qname = ldns_dname_new_frm_str(ip6_arpa_str); - } else { - qname = ldns_dname_new_frm_str(name); - if (qname) { - qname_tmp = ldns_dname_reverse(qname); - ldns_rdf_deep_free(qname); - qname = qname_tmp; - qname_tmp = ldns_dname_new_frm_str("in-addr.arpa."); - status = ldns_dname_cat(qname, qname_tmp); - if (status != LDNS_STATUS_OK) { - error("%s", "could not create reverse address for ip4: %s\n", ldns_get_errorstr_by_id(status)); - } - ldns_rdf_deep_free(qname_tmp); - } - } - if (!qname) { - error("%s", "-x implies an ip address"); - } - - /* create a packet and set the RD flag on it */ - pkt = NULL; - status = ldns_resolver_query_status( - &pkt, res, qname, type, clas, qflags); - if (status != LDNS_STATUS_OK) { - error("error sending query: %s", - ldns_get_errorstr_by_id(status)); - } - if (!pkt) { - if (status == LDNS_STATUS_OK) { - error("%s", "pkt sending"); - } - result = EXIT_FAILURE; - } else { - if (verbosity != -1) { - ldns_pkt_print(stdout, pkt); - } - ldns_pkt_free(pkt); - } - break; case DRILL_QUERY: default: if (query_file) { diff --git a/drill/drill.h b/drill/drill.h index cbccd75e..4397fd06 100644 --- a/drill/drill.h +++ b/drill/drill.h @@ -21,7 +21,6 @@ #define DRILL_AFROMFILE 3 #define DRILL_QTOFILE 4 #define DRILL_NSEC 5 -#define DRILL_REVERSE 6 #define DRILL_SECTRACE 7 #define DRILL_ON(VAR, BIT) \ -- 2.47.3