diff --git a/bin/dig/dig.c b/bin/dig/dig.c index ff3148eacf..04aafc4452 100644 --- a/bin/dig/dig.c +++ b/bin/dig/dig.c @@ -328,6 +328,7 @@ help(void) { " +[no]yaml (Present the results as " "YAML)\n" " +[no]zflag (Set Z flag in query)\n" + " +[no]zoneversion (Request zone version)\n" " global d-opts and servers (before host name) affect " "all " "queries.\n" @@ -2574,9 +2575,22 @@ plus_option(char *option, bool is_batchfile, bool *need_clone, lookup->rrcomments = -1; } break; - case 'z': /* zflag */ - FULLCHECK("zflag"); - lookup->zflag = state; + case 'z': + switch (cmd[1]) { + case 'f': /* zflag */ + FULLCHECK("zflag"); + lookup->zflag = state; + break; + case 'o': /* zoneversion */ + FULLCHECK("zoneversion"); + if (state && lookup->edns == -1) { + lookup->edns = DEFAULT_EDNS_VERSION; + } + lookup->zoneversion = state; + break; + default: + goto invalid_option; + } break; default: invalid_option: diff --git a/bin/dig/dig.rst b/bin/dig/dig.rst index 3b961f8fee..dfb6893a68 100644 --- a/bin/dig/dig.rst +++ b/bin/dig/dig.rst @@ -757,6 +757,10 @@ abbreviation is unambiguous; for example, :option:`+cd` is equivalent to This option sets [or does not set] the last unassigned DNS header flag in a DNS query. This flag is off by default. +.. option:: +zoneversion, +nozoneversion + + When enabled, this option includes an EDNS Zone Version request when sending a query. + Multiple Queries ~~~~~~~~~~~~~~~~ diff --git a/bin/dig/dighost.c b/bin/dig/dighost.c index 5069af6b4f..954fbdd2e7 100644 --- a/bin/dig/dighost.c +++ b/bin/dig/dighost.c @@ -705,6 +705,7 @@ clone_lookup(dig_lookup_t *lookold, bool servers) { looknew->opcode = lookold->opcode; looknew->expire = lookold->expire; looknew->nsid = lookold->nsid; + looknew->zoneversion = lookold->zoneversion; looknew->tcp_keepalive = lookold->tcp_keepalive; looknew->header_only = lookold->header_only; looknew->https_mode = lookold->https_mode; @@ -2591,6 +2592,14 @@ setup_lookup(dig_lookup_t *lookup) { i++; } + if (lookup->zoneversion) { + INSIST(i < MAXOPTS); + opts[i].code = DNS_OPT_ZONEVERSION; + opts[i].length = 0; + opts[i].value = NULL; + i++; + } + if (lookup->ednsoptscnt != 0) { INSIST(i + lookup->ednsoptscnt <= MAXOPTS); memmove(&opts[i], lookup->ednsopts, diff --git a/bin/dig/dighost.h b/bin/dig/dighost.h index db8c842f75..f1670280b4 100644 --- a/bin/dig/dighost.h +++ b/bin/dig/dighost.h @@ -121,7 +121,7 @@ struct dig_lookup { tcp_mode, tcp_mode_set, tls_mode, /*% connect using TLS */ trace, /*% dig +trace */ trace_root, /*% initial query for either +trace or +nssearch */ - ttlunits, use_usec, waiting_connect, zflag; + ttlunits, use_usec, waiting_connect, zflag, zoneversion; char textname[MXNAME]; /*% Name we're going to be looking up */ char cmdline[MXNAME]; dns_rdatatype_t rdtype;