]> git.ipfire.org Git - thirdparty/bind9.git/commitdiff
dig: add the ability to set RA and TC in queries
authorMark Andrews <marka@isc.org>
Tue, 17 Apr 2018 23:18:41 +0000 (09:18 +1000)
committerEvan Hunt <each@isc.org>
Fri, 20 Apr 2018 21:17:58 +0000 (14:17 -0700)
CHANGES
bin/dig/dig.c
bin/dig/dig.docbook
bin/dig/dighost.c
bin/dig/include/dig/dig.h
bin/tests/system/digdelv/tests.sh

diff --git a/CHANGES b/CHANGES
index 615a84f0b02fa97134f45225031d837f4e41b69a..053657cf3a5f4b911ce8ae6c2e5b257da257e1fd 100644 (file)
--- a/CHANGES
+++ b/CHANGES
@@ -1,3 +1,6 @@
+4929.  [func]          Add the ability to set RA and TC in queries made by
+                       dig (+[no]raflag, +[no]tcflag). [GL #213]
+
 4928.  [func]          The "dnskey-sig-validity" option allows
                        "sig-validity-interval" to be overriden for signatures
                        covering DNSKEY RRsets. [GL #145]
index 5c41a8e11423c7193db1ebc69e69734b28b3955c..6a0ed33cddb934d6c0046011f375b57c2ed63dcd 100644 (file)
@@ -205,6 +205,7 @@ help(void) {
 "                 +padding=###        (Set padding block size [0])\n"
 "                 +[no]qr             (Print question before sending)\n"
 "                 +[no]question       (Control display of question section)\n"
+"                 +[no]raflag         (Set RA flag in query (+[no]raflag))\n"
 "                 +[no]rdflag         (Recursive mode (+[no]recurse))\n"
 "                 +[no]recurse        (Recursive mode (+[no]rdflag))\n"
 "                 +retry=###          (Set number of UDP retries) [2]\n"
@@ -217,6 +218,7 @@ help(void) {
 "                 +[no]split=##       (Split hex/base64 fields into chunks)\n"
 "                 +[no]stats          (Control display of statistics)\n"
 "                 +subnet=addr        (Set edns-client-subnet option)\n"
+"                 +[no]tcflag         (Set TC flag in query (+[no]tcflag))\n"
 "                 +[no]tcp            (TCP mode (+[no]vc))\n"
 "                 +timeout=###        (Set query timeout) [5]\n"
 "                 +[no]trace          (Trace delegation down from root [+dnssec])\n"
@@ -1240,6 +1242,10 @@ plus_option(char *option, isc_boolean_t is_batchfile,
                break;
        case 'r':
                switch (cmd[1]) {
+               case 'a': /* raflag */
+                       FULLCHECK("raflag");
+                       lookup->raflag = state;
+                       break;
                case 'd': /* rdflag */
                        FULLCHECK("rdflag");
                        lookup->recurse = state;
@@ -1383,10 +1389,20 @@ plus_option(char *option, isc_boolean_t is_batchfile,
        case 't':
                switch (cmd[1]) {
                case 'c': /* tcp */
-                       FULLCHECK("tcp");
-                       if (!is_batchfile) {
-                               lookup->tcp_mode = state;
-                               lookup->tcp_mode_set = ISC_TRUE;
+                       switch (cmd[2]) {
+                       case 'f':
+                               FULLCHECK("tcflag");
+                               lookup->tcflag = state;
+                               break;
+                       case 'p':
+                               FULLCHECK("tcp");
+                               if (!is_batchfile) {
+                                       lookup->tcp_mode = state;
+                                       lookup->tcp_mode_set = ISC_TRUE;
+                               }
+                               break;
+                       default:
+                               goto invalid_option;
                        }
                        break;
                case 'i': /* timeout */
index 453f4221b318c4a5dcb31adc91f1fd6750ee8763..03c9fb66a3dad02521e29d67d5bac8255ceda5df 100644 (file)
          </listitem>
        </varlistentry>
 
+       <varlistentry>
+         <term><option>+[no]raflag</option></term>
+         <listitem>
+           <para>
+             Set [do not set] the RA (Recursion Available) bit in
+             the query. The default is +noraflag. This bit should
+             be ignored by the server for QUERY.
+           </para>
+         </listitem>
+       </varlistentry>
+
        <varlistentry>
          <term><option>+[no]rdflag</option></term>
          <listitem>
          </listitem>
        </varlistentry>
 
+       <varlistentry>
+         <term><option>+[no]tcflag</option></term>
+         <listitem>
+           <para>
+             Set [do not set] the TC (TrunCation) bit in the query.
+             The default is +notcflag.  This bit should be ignored
+             by the server for QUERY.
+           </para>
+         </listitem>
+       </varlistentry>
+
        <varlistentry>
          <term><option>+[no]tcp</option></term>
          <listitem>
index 172b94bf1383d06c8c9840e79472ec735e60daa2..37b27dde112444de3466ebb1ab8c03dbcd1fe7d9 100644 (file)
@@ -655,6 +655,8 @@ make_empty_lookup(void) {
        looknew->aaonly = ISC_FALSE;
        looknew->adflag = ISC_FALSE;
        looknew->cdflag = ISC_FALSE;
+       looknew->raflag = ISC_FALSE;
+       looknew->tcflag = ISC_FALSE;
        looknew->print_unknown_format = ISC_FALSE;
        looknew->zflag = ISC_FALSE;
        looknew->ns_search_only = ISC_FALSE;
@@ -797,6 +799,8 @@ clone_lookup(dig_lookup_t *lookold, isc_boolean_t servers) {
        looknew->aaonly = lookold->aaonly;
        looknew->adflag = lookold->adflag;
        looknew->cdflag = lookold->cdflag;
+       looknew->raflag = lookold->raflag;
+       looknew->tcflag = lookold->tcflag;
        looknew->print_unknown_format = lookold->print_unknown_format;
        looknew->zflag = lookold->zflag;
        looknew->ns_search_only = lookold->ns_search_only;
@@ -2235,6 +2239,16 @@ setup_lookup(dig_lookup_t *lookup) {
                lookup->sendmsg->flags |= DNS_MESSAGEFLAG_CD;
        }
 
+       if (lookup->raflag) {
+               debug("RA query");
+               lookup->sendmsg->flags |= DNS_MESSAGEFLAG_RA;
+       }
+
+       if (lookup->tcflag) {
+               debug("TC query");
+               lookup->sendmsg->flags |= DNS_MESSAGEFLAG_TC;
+       }
+
        if (lookup->zflag) {
                debug("Z query");
                lookup->sendmsg->flags |= 0x0040U;
index 0b6fc460d0794f8468a2c1715ba3df14b16880bc..ed97b075773a46ae452e1176fbc089981700f4f4 100644 (file)
@@ -94,6 +94,8 @@ struct dig_lookup {
                aaonly,
                adflag,
                cdflag,
+               raflag,
+               tcflag,
                zflag,
                trace, /*% dig +trace */
                trace_root, /*% initial query for either +trace or +nssearch */
index 0a7bc3166e49aefa7c807ebe0102cc0ec5a37300..080d38e037e1540c96bb2ca04b1eeae148e6279b 100644 (file)
@@ -140,6 +140,7 @@ if [ -x ${DIG} ] ; then
   if [ $ret != 0 ]; then echo_i "failed"; fi
   status=`expr $status + $ret`
 
+  n=`expr $n + 1`
   echo_i "checking dig +header-only works ($n)"
   ret=0
   $DIG $DIGOPTS +tcp @10.53.0.3 +header-only example > dig.out.test$n || ret=1
@@ -148,6 +149,24 @@ if [ -x ${DIG} ] ; then
   if [ $ret != 0 ]; then echo_i "failed"; fi
   status=`expr $status + $ret`
 
+  n=`expr $n + 1`
+  echo_i "checking dig +raflag works ($n)"
+  ret=0
+  $DIG $DIGOPTS +tcp @10.53.0.3 +raflag +qr example > dig.out.test$n || ret=1
+  grep "^;; flags: rd ra ad; QUERY: 1, ANSWER: 0," < dig.out.test$n > /dev/null || ret=1
+  grep "^;; flags: qr rd ra; QUERY: 1, ANSWER: 0," < dig.out.test$n > /dev/null || ret=1
+  if [ $ret != 0 ]; then echo_i "failed"; fi
+  status=`expr $status + $ret`
+
+  n=`expr $n + 1`
+  echo_i "checking dig +tcflag works ($n)"
+  ret=0
+  $DIG $DIGOPTS +tcp @10.53.0.3 +tcflag +qr example > dig.out.test$n || ret=1
+  grep "^;; flags: tc rd ad; QUERY: 1, ANSWER: 0" < dig.out.test$n > /dev/null || ret=1
+  grep "^;; flags: qr rd ra; QUERY: 1, ANSWER: 0," < dig.out.test$n > /dev/null || ret=1
+  if [ $ret != 0 ]; then echo_i "failed"; fi
+  status=`expr $status + $ret`
+
   n=`expr $n + 1`
   echo_i "checking dig +header-only works (with class and type set) ($n)"
   ret=0