]> git.ipfire.org Git - thirdparty/bind9.git/commitdiff
add "dig +qid" option to set QID to desired value
authorEvan Hunt <each@isc.org>
Fri, 8 May 2020 19:39:16 +0000 (12:39 -0700)
committerEvan Hunt <each@isc.org>
Tue, 26 May 2020 07:47:18 +0000 (00:47 -0700)
bin/dig/dig.c
bin/dig/dig.rst
bin/dig/dighost.c
bin/dig/dighost.h
bin/dig/nslookup.c

index e53ad5e29bb577289fe6dd5e3e7293aea53ca722..d3fc299bf5a99835c72198d7a771c5ea9212ffda 100644 (file)
@@ -1489,6 +1489,24 @@ plus_option(char *option, bool is_batchfile, dig_lookup_t *lookup) {
                break;
        case 'q':
                switch (cmd[1]) {
+               case 'i': /* qid */
+                       FULLCHECK("qid");
+                       if (!state) {
+                               lookup->setqid = false;
+                               lookup->qid = 0;
+                               break;
+                       }
+                       if (value == NULL) {
+                               goto need_value;
+                       }
+                       result = parse_uint(&num, value, MAXQID, "qid");
+                       if (result != ISC_R_SUCCESS) {
+                               warn("Couldn't parse qid");
+                               goto exit_or_usage;
+                       }
+                       lookup->setqid = true;
+                       lookup->qid = num;
+                       break;
                case 'r': /* qr */
                        FULLCHECK("qr");
                        lookup->qr = state;
index 3c899ceebc7b50c8ebc7022a60f4a392e5dc86a7..b14c7e751c417e91e808a29f97129dcabf2bc68e 100644 (file)
@@ -426,6 +426,10 @@ abbreviation is unambiguous; for example, ``+cd`` is equivalent to
    mandatory. Responses to padded queries may also be padded, but only
    if the query uses TCP or DNS COOKIE.
 
+``+qid=value``
+   Specify the query ID to use when sending queries.
+
 ``+[no]qr``
    Toggles the display of the query message as it is sent. By default, the query
    is not printed.
index 0384d7ccada947791118c4935741448171008a12..a12ff400192b7dfa19720df579ade8bc60cbc255 100644 (file)
@@ -677,6 +677,8 @@ make_empty_lookup(void) {
        looknew->tcflag = false;
        looknew->print_unknown_format = false;
        looknew->zflag = false;
+       looknew->setqid = false;
+       looknew->qid = 0;
        looknew->ns_search_only = false;
        looknew->origin = NULL;
        looknew->tsigctx = NULL;
@@ -820,6 +822,8 @@ clone_lookup(dig_lookup_t *lookold, bool servers) {
        looknew->tcflag = lookold->tcflag;
        looknew->print_unknown_format = lookold->print_unknown_format;
        looknew->zflag = lookold->zflag;
+       looknew->setqid = lookold->setqid;
+       looknew->qid = lookold->qid;
        looknew->ns_search_only = lookold->ns_search_only;
        looknew->tcp_mode = lookold->tcp_mode;
        looknew->tcp_mode_set = lookold->tcp_mode_set;
@@ -2298,6 +2302,11 @@ setup_lookup(dig_lookup_t *lookup) {
                lookup->sendmsg->flags |= 0x0040U;
        }
 
+       if (lookup->setqid) {
+               debug("set QID");
+               lookup->sendmsg->id = lookup->qid;
+       }
+
        dns_message_addname(lookup->sendmsg, lookup->name,
                            DNS_SECTION_QUESTION);
 
index 9b482ce3deed6fbfa5e133d7186965f2196f32c6..15585d460a8a7f6c3ddbd52236c3c2fc440485a3 100644 (file)
@@ -60,6 +60,8 @@
 #define MAXPORT 0xffff
 /*% Max serial number */
 #define MAXSERIAL 0xffffffff
+/*% Max query ID */
+#define MAXQID 0xffff
 
 /*% Default TCP Timeout */
 #define TCP_TIMEOUT 10
@@ -108,9 +110,10 @@ struct dig_lookup {
                tcp_keepalive, header_only, ednsneg, mapped,
                print_unknown_format, multiline, nottl, noclass, onesoa,
                use_usec, nocrypto, ttlunits, idnin, idnout, expandaaaa, qr,
-               accept_reply_unexpected_src; /*%  print replies from
+               accept_reply_unexpected_src, /*%  print replies from
                                              * unexpected
                                              *   sources. */
+               setqid;                      /*% use a speciied query ID */
        char textname[MXNAME];               /*% Name we're going to be
                                              * looking up */
        char cmdline[MXNAME];
@@ -157,6 +160,7 @@ struct dig_lookup {
        dns_opcode_t opcode;
        int rrcomments;
        unsigned int eoferr;
+       uint16_t qid;
 };
 
 /*% The dig_query structure */
index 17d8515268a03846bad2fae188558d51c3c5fdc6..08ee5e36d9541bdf953d818937af37e04cb1fb57 100644 (file)
@@ -788,6 +788,8 @@ addlookup(char *opt) {
        lookup->aaonly = aaonly;
        lookup->retries = tries;
        lookup->udpsize = 0;
+       lookup->setqid = false;
+       lookup->qid = 0;
        lookup->comments = comments;
        if (lookup->rdtype == dns_rdatatype_any && !tcpmode_set) {
                lookup->tcp_mode = true;