+3829. [func] "dig +ttlunits" causes dig to print TTL values
+ with time-unit suffixes: w, d, h, m, s for
+ weeks, days, hours, minutes, and seconds. (Thanks
+ to Tony Finch.) [RT #35823]
+
3828. [placeholder]
3827. [func] "dnssec-signzone -N date" updates serial number
in single-line-per-record format.
- "dig" now supports sending arbitary EDNS options by specifying
them on the command line.
+ - "dig +ttlunits" causes dig to print TTL values with time-unit
+ suffixes: w, d, h, m, s for weeks, days, hours, minutes, and
+ seconds.
- "serial-update-format" can now be set to "date". On update,
the serial number will be set to the current date in YYYYMMDDNN
format.
ip6_int = ISC_FALSE, plusquest = ISC_FALSE, pluscomm = ISC_FALSE,
multiline = ISC_FALSE, nottl = ISC_FALSE, noclass = ISC_FALSE,
onesoa = ISC_FALSE, rrcomments = ISC_FALSE, use_usec = ISC_FALSE,
- nocrypto = ISC_FALSE;
+ nocrypto = ISC_FALSE, ttlunits = ISC_FALSE;
static isc_uint32_t splitwidth = 0xffffffff;
/*% opcode text */
" +[no]short (Disable everything except short\n"
" form of answer)\n"
" +[no]ttlid (Control display of ttls in records)\n"
+" +[no]ttlunits (Display TTLs in human-readable units)\n"
" +[no]all (Set or clear all display flags)\n"
" +[no]qr (Print question before sending)\n"
" +[no]nssearch (Search all authoritative nameservers)\n"
return(ISC_FALSE);
styleflags |= DNS_STYLEFLAG_REL_OWNER;
+ if (ttlunits)
+ styleflags |= DNS_STYLEFLAG_TTL_UNITS;
if (nottl)
styleflags |= DNS_STYLEFLAG_NO_TTL;
if (noclass)
styleflags |= DNS_STYLEFLAG_COMMENT;
if (rrcomments)
styleflags |= DNS_STYLEFLAG_RRCOMMENT;
+ if (ttlunits)
+ styleflags |= DNS_STYLEFLAG_TTL_UNITS;
if (nottl)
styleflags |= DNS_STYLEFLAG_NO_TTL;
if (noclass)
goto invalid_option;
}
break;
- case 't': /* ttlid */
- FULLCHECK("ttlid");
- nottl = ISC_TF(!state);
+ case 't':
+ switch (cmd[3]) {
+ case 'i': /* ttlid */
+ FULLCHECK("ttlid");
+ nottl = ISC_TF(!state);
+ break;
+ case 'u': /* ttlunits */
+ FULLCHECK("ttlunits");
+ nottl = ISC_FALSE;
+ ttlunits = ISC_TF(state);
+ break;
+ }
break;
default:
goto invalid_option;
</listitem>
</varlistentry>
+ <varlistentry>
+ <term><option>+[no]ttlunits</option></term>
+ <listitem>
+ <para>
+ Display [do not display] the TTL in friendly human-readable
+ time units of "s", "m", "h", "d", and "w", representing
+ seconds, minutes, hours, days and weeks. Implies +ttlid.
+ </para>
+ </listitem>
+ </varlistentry>
+
<varlistentry>
<term><option>+[no]recurse</option></term>
<listitem>
/*% Comment out data by prepending with ";" */
#define DNS_STYLEFLAG_COMMENTDATA 0x10000000U
+/*% Print TTL with human-readable units. */
+#define DNS_STYLEFLAG_TTL_UNITS 0x20000000U
ISC_LANG_BEGINDECLS
isc_result_t
dns_ttl_totext(isc_uint32_t src, isc_boolean_t verbose,
isc_buffer_t *target);
+isc_result_t
+dns_ttl_totext2(isc_uint32_t src, isc_boolean_t verbose,
+ isc_boolean_t upcase, isc_buffer_t *target);
/*%<
* Output a TTL or other time interval in a human-readable form.
* The time interval is given as a count of seconds in 'src'.
* If 'verbose' is ISC_TRUE, use a verbose style like the SOA comments
* in "dig", like "1 week 2 days 3 hours 4 minutes 5 seconds".
*
+ * If 'upcase' is ISC_TRUE, we conform to the BIND 8 style in which
+ * the unit letter is capitalized if there is only a single unit
+ * letter to print (for example, "1m30s", but "2M")
+ *
+ * If 'upcase' is ISC_FALSE, unit letters are always in lower case.
+ *
* Returns:
* \li ISC_R_SUCCESS
* \li ISC_R_NOSPACE
unsigned int length;
INDENT_TO(ttl_column);
- length = snprintf(ttlbuf, sizeof(ttlbuf), "%u",
- rdataset->ttl);
- INSIST(length <= sizeof(ttlbuf));
- isc_buffer_availableregion(target, &r);
- if (r.length < length)
- return (ISC_R_NOSPACE);
- memmove(r.base, ttlbuf, length);
- isc_buffer_add(target, length);
- column += length;
+ if ((ctx->style.flags & DNS_STYLEFLAG_TTL_UNITS) != 0) {
+ length = target->used;
+ result = dns_ttl_totext2(rdataset->ttl,
+ ISC_FALSE, ISC_FALSE,
+ target);
+ if (result != ISC_R_SUCCESS)
+ return (result);
+ column += target->used - length;
+ } else {
+ length = snprintf(ttlbuf, sizeof(ttlbuf), "%u",
+ rdataset->ttl);
+ INSIST(length <= sizeof(ttlbuf));
+ isc_buffer_availableregion(target, &r);
+ if (r.length < length)
+ return (ISC_R_NOSPACE);
+ memmove(r.base, ttlbuf, length);
+ isc_buffer_add(target, length);
+ column += length;
+ }
/*
* If the $TTL directive is not in use, the TTL we
*/
isc_result_t
dns_ttl_totext(isc_uint32_t src, isc_boolean_t verbose, isc_buffer_t *target) {
+ return (dns_ttl_totext2(src, verbose, ISC_TRUE, target));
+}
+
+isc_result_t
+dns_ttl_totext2(isc_uint32_t src, isc_boolean_t verbose,
+ isc_boolean_t upcase, isc_buffer_t *target)
+{
unsigned secs, mins, hours, days, weeks, x;
secs = src % 60; src /= 60;
* in upper case. (Why? Because BIND 8 does that.
* Presumably it has a reason.)
*/
- if (x == 1 && !verbose) {
+ if (x == 1 && upcase && !verbose) {
isc_region_t region;
/*
* The unit letter is the last character in the