From: TCY16 Date: Tue, 12 Apr 2022 12:27:43 +0000 (+0200) Subject: add NSID query functionality to drill, which integrates the new structured EDNS logic X-Git-Tag: 1.8.2-rc.1~3^2~19 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=947f6ec722862d1c3864beedf83a43e857b6fc0f;p=thirdparty%2Fldns.git add NSID query functionality to drill, which integrates the new structured EDNS logic --- diff --git a/drill/drill.c b/drill/drill.c index 13afb84f..9a117592 100644 --- a/drill/drill.c +++ b/drill/drill.c @@ -203,6 +203,7 @@ main(int argc, char *argv[]) qusevc = false; qrandom = true; key_verified = NULL; + ldns_edns_option_list* edns_list = NULL; ldns_init_random(NULL, 0); @@ -210,7 +211,7 @@ main(int argc, char *argv[]) /* global first, query opt next, option with parm's last * and sorted */ /* "46DITSVQf:i:w:q:achuvxzy:so:p:b:k:" */ - while ((c = getopt(argc, argv, "46ab:c:d:Df:hi:I:k:o:p:q:Qr:sStTuvV:w:xy:z")) != -1) { + while ((c = getopt(argc, argv, "46ab:c:d:e:Df:hi:I:k:o:p:q:Qr:sStTuvV:w:xy:z")) != -1) { switch(c) { /* global options */ case '4': @@ -290,6 +291,27 @@ main(int argc, char *argv[]) case 'c': resolv_conf_file = optarg; break; + case 'e': + if (strstr(optarg, "nsid")) { + ldns_edns_option *edns; + edns_list = ldns_edns_option_list_new(); + + /* create NSID EDNS*/ + edns = ldns_edns_new_from_data(LDNS_EDNS_NSID, 0, NULL); + + if (edns_list == NULL || edns == NULL) { + error("EDNS option could not be allocated"); + break; + } + + // @TODO rethink this error + if (!(ldns_edns_option_list_push(edns_list, edns))) { + error("EDNS option could not be attached"); + break; + } + + break; + } case 't': qusevc = true; break; @@ -796,7 +818,7 @@ main(int argc, char *argv[]) } status = ldns_resolver_prepare_query_pkt(&qpkt, res, qname, type, clas, qflags); if(status != LDNS_STATUS_OK) { - error("%s", "making query: %s", + error("%s", "making query: %s", ldns_get_errorstr_by_id(status)); } dump_hex(qpkt, query_file); @@ -867,9 +889,24 @@ main(int argc, char *argv[]) } else { /* create a packet and set the RD flag on it */ pkt = NULL; - status = ldns_resolver_query_status( - &pkt, res, qname, - type, clas, qflags); + + status = ldns_resolver_prepare_query_pkt(&qpkt, + res, qname, type, clas, qflags); + if(status != LDNS_STATUS_OK) { + error("%s", "making query: %s", + ldns_get_errorstr_by_id(status)); + } + + if (edns_list) { + /* attach the structed EDNS options for completeness */ + ldns_pkt_set_edns_option_list(qpkt, edns_list); + + /* write the structured EDNS data to unstructured data */ + ldns_pkt_edns_write_option_list_to_edns_data(qpkt, edns_list); + } + + status = ldns_resolver_send_pkt(&pkt, res, qpkt); + if (status != LDNS_STATUS_OK) { error("error sending query: %s" , ldns_get_errorstr_by_id( @@ -878,7 +915,8 @@ main(int argc, char *argv[]) } } - if (!pkt) { + /* now handling the response message/packet */ + if (!pkt) { mesg("No packet received"); result = EXIT_FAILURE; } else { @@ -991,6 +1029,7 @@ main(int argc, char *argv[]) ldns_rr_list_deep_free(key_list); ldns_rr_list_deep_free(cmdline_rr_list); ldns_rdf_deep_free(trace_start_name); + ldns_edns_option_list_deep_free(edns_list); xfree(progname); xfree(tsig_name); xfree(tsig_data);