diff --git a/bin/named/include/named/globals.h b/bin/named/include/named/globals.h index 6b978d1eb8..9ada34a768 100644 --- a/bin/named/include/named/globals.h +++ b/bin/named/include/named/globals.h @@ -111,6 +111,7 @@ EXTERN const char *named_g_chrootdir INIT(NULL); EXTERN bool named_g_foreground INIT(false); EXTERN bool named_g_logstderr INIT(false); EXTERN bool named_g_nosyslog INIT(false); +EXTERN unsigned int named_g_logflags INIT(0); EXTERN const char *named_g_logfile INIT(NULL); EXTERN const char *named_g_defaultsessionkeyfile INIT(NAMED_LOCALSTATEDIR diff --git a/bin/named/log.c b/bin/named/log.c index e477bd43ff..ffa916b569 100644 --- a/bin/named/log.c +++ b/bin/named/log.c @@ -79,6 +79,16 @@ named_log_setdefaultchannels(isc_logconfig_t *lcfg) { isc_log_createchannel(lcfg, "default_debug", ISC_LOG_TOFILE, ISC_LOG_DYNAMIC, &destination, ISC_LOG_PRINTTIME | ISC_LOG_DEBUGONLY); + } else if (named_g_logstderr && (named_g_logflags != 0)) { + /* + * If the option -g is given, but we also requested iso + * timestamps, we'll still need to override the "default_debug" + * logger with a new one. + */ + isc_log_createchannel(lcfg, "default_debug", ISC_LOG_TOFILEDESC, + ISC_LOG_DYNAMIC, + ISC_LOGDESTINATION_STDERR, + ISC_LOG_PRINTTIME | named_g_logflags); } if (named_g_logfile != NULL) { @@ -118,6 +128,16 @@ named_log_setsafechannels(isc_logconfig_t *lcfg) { * discarded a bit faster. */ isc_log_setdebuglevel(0); + } else if (named_g_logstderr && (named_g_logflags != 0)) { + /* + * If the option -g is given, but we also requested iso + * timestamps, we'll still need to override the "default_debug" + * logger with a new one. + */ + isc_log_createchannel(lcfg, "default_debug", ISC_LOG_TOFILEDESC, + ISC_LOG_DYNAMIC, + ISC_LOGDESTINATION_STDERR, + ISC_LOG_PRINTTIME | named_g_logflags); } else { isc_log_setdebuglevel(named_g_debuglevel); } diff --git a/bin/named/logconf.c b/bin/named/logconf.c index c27e672b8a..f923722bf3 100644 --- a/bin/named/logconf.c +++ b/bin/named/logconf.c @@ -239,6 +239,8 @@ channel_fromconf(const cfg_obj_t *channel, isc_logconfig_t *logconfig) { flags |= ISC_LOG_ISO8601; } else if (strcasecmp(s, "iso8601-utc") == 0) { flags |= ISC_LOG_ISO8601 | ISC_LOG_UTC; + } else if (strcasecmp(s, "iso8601-tzinfo") == 0) { + flags |= ISC_LOG_ISO8601 | ISC_LOG_TZINFO; } } } diff --git a/bin/named/main.c b/bin/named/main.c index 98418bfbe3..91b46592b0 100644 --- a/bin/named/main.c +++ b/bin/named/main.c @@ -889,6 +889,8 @@ parse_command_line(int argc, char *argv[]) { case 'g': named_g_foreground = true; named_g_logstderr = true; + named_g_logflags = ISC_LOG_PRINTTIME | ISC_LOG_ISO8601 | + ISC_LOG_TZINFO; break; case 'L': named_g_logfile = isc_commandline_argument; diff --git a/bin/tests/system/cacheclean/tests.sh b/bin/tests/system/cacheclean/tests.sh index 9b27ec2cf0..5359107508 100755 --- a/bin/tests/system/cacheclean/tests.sh +++ b/bin/tests/system/cacheclean/tests.sh @@ -101,7 +101,7 @@ digcomp --lc dig.out.ns2 knowngood.dig.out || status=1 n=$((n + 1)) echo_i "only one tcp socket was used ($n)" -tcpclients=$(awk '$3 == "client" && $5 ~ /10.53.0.7#[0-9]*:/ {print $5}' ns2/named.run | sort | uniq -c | wc -l) +tcpclients=$(awk '$2 == "client" && $4 ~ /10.53.0.7#[0-9]*:/ {print $4}' ns2/named.run | sort | uniq -c | wc -l) test $tcpclients -eq 1 || { status=1 diff --git a/bin/tests/system/checkconf/good-printtime.conf b/bin/tests/system/checkconf/good-printtime.conf index 06bb7beece..3ec3e3b2f5 100644 --- a/bin/tests/system/checkconf/good-printtime.conf +++ b/bin/tests/system/checkconf/good-printtime.conf @@ -32,4 +32,8 @@ logging { file "five.out"; print-time iso8601-utc; }; + channel six { + file "six.out"; + print-time iso8601-tzinfo; + }; }; diff --git a/bin/tests/system/kasp/tests.sh b/bin/tests/system/kasp/tests.sh index f2479e6368..724785c5fb 100644 --- a/bin/tests/system/kasp/tests.sh +++ b/bin/tests/system/kasp/tests.sh @@ -2412,10 +2412,10 @@ _check_next_key_event() { # Get the latest next key event. if [ "${DYNAMIC}" = "yes" ]; then - _time=$(awk '{print $9}' <"keyevent.out.$ZONE.test$n" | tail -1) + _time=$(awk '{print $8}' <"keyevent.out.$ZONE.test$n" | tail -1) else # inline-signing zone adds "(signed)" - _time=$(awk '{print $10}' <"keyevent.out.$ZONE.test$n" | tail -1) + _time=$(awk '{print $9}' <"keyevent.out.$ZONE.test$n" | tail -1) fi # The next key event time must within threshold of the diff --git a/bin/tests/system/mkeys/tests.sh b/bin/tests/system/mkeys/tests.sh index b460121b04..952667df75 100644 --- a/bin/tests/system/mkeys/tests.sh +++ b/bin/tests/system/mkeys/tests.sh @@ -733,7 +733,7 @@ echo_i "check that trust-anchor-telemetry queries contain the correct key ($n)" ret=0 # convert the hexadecimal key from the TAT query into decimal and # compare against the known key. -tathex=$(grep "query '_ta-[0-9a-f][0-9a-f]*/NULL/IN' approved" ns1/named.run | awk '{print $6; exit 0}' | sed -e 's/(_ta-\([0-9a-f][0-9a-f]*\)):/\1/') || true +tathex=$(grep "query '_ta-[0-9a-f][0-9a-f]*/NULL/IN' approved" ns1/named.run | awk '{print $5; exit 0}' | sed -e 's/(_ta-\([0-9a-f][0-9a-f]*\)):/\1/') || true tatkey=$($PERL -e 'printf("%d\n", hex(@ARGV[0]));' "$tathex") realkey=$(rndccmd 10.53.0.2 secroots - | sed -n "s#.*${DEFAULT_ALGORITHM}/\([0-9][0-9]*\) ; .*managed.*#\1#p") [ "$tatkey" -eq "$realkey" ] || ret=1 diff --git a/bin/tests/system/notify/tests.sh b/bin/tests/system/notify/tests.sh index 08ee243562..a827e6da5c 100644 --- a/bin/tests/system/notify/tests.sh +++ b/bin/tests/system/notify/tests.sh @@ -65,7 +65,8 @@ test_end test_start "checking startup notify rate limit" awk '/x[0-9].*sending notify to/ { - split($2, a, ":"); + split($1, ts, "T"); + split(ts[2], a, ":"); this = a[1] * 3600 + a[2] * 60 + a[3]; if (lasta1 && lasta1 > a[1]) { fix = 3600 * 24; diff --git a/bin/tests/system/start.pl b/bin/tests/system/start.pl index 67c33b86f2..f8faac91a7 100755 --- a/bin/tests/system/start.pl +++ b/bin/tests/system/start.pl @@ -373,9 +373,9 @@ sub count_running_lines { # the shell *ought* to have created the file immediately, but this # logic allows the creation to be delayed without issues if (open(my $fh, "<", $runfile)) { - # the two non-whitespace blobs should be the date and time + # the whitespace blob should be an ISO timestamp # but we don't care about them really, only that they are there - return scalar(grep /^\S+ \S+ running\R/, <$fh>); + return scalar(grep /^\S+[ T]\S+ running\R/, <$fh>); } else { return 0; } diff --git a/bin/tests/system/xfer/tests.sh b/bin/tests/system/xfer/tests.sh index f75e1d9caf..5818870b60 100755 --- a/bin/tests/system/xfer/tests.sh +++ b/bin/tests/system/xfer/tests.sh @@ -528,7 +528,7 @@ $RNDCCMD 10.53.0.7 refresh edns-expire 2>&1 | sed 's/^/ns7 /' | cat_i sleep 10 # there may be multiple log entries so get the last one. -expire=$(awk '/edns-expire\/IN: got EDNS EXPIRE of/ { x=$9 } END { print x }' ns7/named.run) +expire=$(awk '/edns-expire\/IN: got EDNS EXPIRE of/ { x=$8 } END { print x }' ns7/named.run) test ${expire:-0} -gt 0 -a ${expire:-0} -lt 1814400 || { echo_i "failed (expire=${expire:-0})" status=$((status + 1)) diff --git a/doc/arm/reference.rst b/doc/arm/reference.rst index 1c363f6662..119c8686fa 100644 --- a/doc/arm/reference.rst +++ b/doc/arm/reference.rst @@ -812,13 +812,16 @@ what messages to print. :short: Specifies the time format for log messages. :any:`print-time` can be set to ``yes``, ``no``, or a time format - specifier, which may be one of ``local``, ``iso8601``, or - ``iso8601-utc``. If set to ``no``, the date and time are not - logged. If set to ``yes`` or ``local``, the date and time are logged in - a human-readable format, using the local time zone. If set to - ``iso8601``, the local time is logged in ISO 8601 format. If set to + specifier, which may be one of ``local``, ``iso8601``, ``iso8601-utc`` + or ``iso8601-tzinfo``. If set to ``no``, the date and time are + not logged. If set to ``yes`` or ``local``, the date and time are + logged in a human-readable format, using the local time zone. If + set to ``iso8601``, the local time is logged in ISO 8601 format, + but no timezone information is included in the timestamp. If set to ``iso8601-utc``, the date and time are logged in ISO 8601 format, - with time zone set to UTC. The default is ``no``. + with time zone set to UTC. If set to ``iso8601-tzinfo``, the local + time is logged in ISO 8601 format, with timezone information included + at the end of the timestamp. The default is ``no``. :any:`print-time` may be specified for a :any:`syslog` channel, but it is usually pointless since :any:`syslog` also logs the date and time. diff --git a/doc/misc/options b/doc/misc/options index b3714e4d38..4e54305b58 100644 --- a/doc/misc/options +++ b/doc/misc/options @@ -57,7 +57,7 @@ logging { null; print-category ; print-severity ; - print-time ( iso8601 | iso8601-utc | local | ); + print-time ( iso8601 | iso8601-utc | iso8601-tzinfo | local | ); severity ; stderr; syslog [ ]; diff --git a/lib/isc/include/isc/log.h b/lib/isc/include/isc/log.h index c7d02cce96..f7b357c8fb 100644 --- a/lib/isc/include/isc/log.h +++ b/lib/isc/include/isc/log.h @@ -72,6 +72,7 @@ typedef struct isc_logconfig isc_logconfig_t; /*%< Log Configuration */ #define ISC_LOG_OPENERR 0x08000 /* internal */ #define ISC_LOG_ISO8601 0x10000 /* if PRINTTIME, use ISO8601 */ #define ISC_LOG_UTC 0x20000 /* if PRINTTIME, use UTC */ +#define ISC_LOG_TZINFO 0x40000 /* if PRINTTIME, output TZ info */ /*@}*/ /*@{*/ diff --git a/lib/isc/include/isc/time.h b/lib/isc/include/isc/time.h index ad74be9270..f08cd2e112 100644 --- a/lib/isc/include/isc/time.h +++ b/lib/isc/include/isc/time.h @@ -395,20 +395,6 @@ isc_time_parsehttptimestamp(char *input, isc_time_t *t); *\li 'buf' and 't' are not NULL. */ -void -isc_time_formatISO8601L(const isc_time_t *t, char *buf, unsigned int len); -/*%< - * Format the time 't' into the buffer 'buf' of length 'len', - * using the ISO8601 format: "yyyy-mm-ddThh:mm:ss" - * If the text does not fit in the buffer, the result is indeterminate, - * but is always guaranteed to be null terminated. - * - * Requires: - *\li 'len' > 0 - *\li 'buf' points to an array of at least len chars - * - */ - void isc_time_formatISO8601Lms(const isc_time_t *t, char *buf, unsigned int len); /*%< @@ -424,10 +410,10 @@ isc_time_formatISO8601Lms(const isc_time_t *t, char *buf, unsigned int len); */ void -isc_time_formatISO8601Lus(const isc_time_t *t, char *buf, unsigned int len); +isc_time_formatISO8601TZms(const isc_time_t *t, char *buf, unsigned int len); /*%< * Format the time 't' into the buffer 'buf' of length 'len', - * using the ISO8601 format: "yyyy-mm-ddThh:mm:ss.ssssss" + * using the ISO8601 format: "yyyy-mm-ddThh:mm:ss.sss+hhmm" * If the text does not fit in the buffer, the result is indeterminate, * but is always guaranteed to be null terminated. * diff --git a/lib/isc/log.c b/lib/isc/log.c index 53dcb47921..7b65a6094c 100644 --- a/lib/isc/log.c +++ b/lib/isc/log.c @@ -477,7 +477,7 @@ isc_log_createchannel(isc_logconfig_t *lcfg, const char *name, isc_mem_t *mctx; unsigned int permitted = ISC_LOG_PRINTALL | ISC_LOG_DEBUGONLY | ISC_LOG_BUFFERED | ISC_LOG_ISO8601 | - ISC_LOG_UTC; + ISC_LOG_UTC | ISC_LOG_TZINFO; REQUIRE(VALID_CONFIG(lcfg)); REQUIRE(name != NULL); @@ -486,6 +486,7 @@ isc_log_createchannel(isc_logconfig_t *lcfg, const char *name, REQUIRE(destination != NULL || type == ISC_LOG_TONULL); REQUIRE(level >= ISC_LOG_CRITICAL); REQUIRE((flags & ~permitted) == 0); + REQUIRE(!(flags & ISC_LOG_UTC) || !(flags & ISC_LOG_TZINFO)); /* FIXME: find duplicate names? */ @@ -1256,13 +1257,14 @@ isc_log_doit(isc_logcategory_t category, isc_logmodule_t module, int level, const char *format, va_list args) { int syslog_level; const char *time_string; - char local_time[64]; - char iso8601z_string[64]; - char iso8601l_string[64]; + char local_time[64] = { 0 }; + char iso8601z_string[64] = { 0 }; + char iso8601l_string[64] = { 0 }; + char iso8601tz_string[64] = { 0 }; char level_string[24] = { 0 }; struct stat statbuf; bool matched = false; - bool printtime, iso8601, utc, printtag, printcolon; + bool printtime, iso8601, utc, tzinfo, printtag, printcolon; bool printcategory, printmodule, printlevel, buffered; isc_logchannel_t *channel; isc_logchannellist_t *category_channels; @@ -1280,10 +1282,6 @@ isc_log_doit(isc_logcategory_t category, isc_logmodule_t module, int level, return; } - local_time[0] = '\0'; - iso8601l_string[0] = '\0'; - iso8601z_string[0] = '\0'; - rcu_read_lock(); LOCK(&isc__lctx->lock); @@ -1368,6 +1366,8 @@ isc_log_doit(isc_logcategory_t category, isc_logmodule_t module, int level, sizeof(iso8601z_string)); isc_time_formatISO8601Lms(&isctime, iso8601l_string, sizeof(iso8601l_string)); + isc_time_formatISO8601TZms(&isctime, iso8601tz_string, + sizeof(iso8601tz_string)); } if ((channel->flags & ISC_LOG_PRINTLEVEL) != 0 && @@ -1396,6 +1396,7 @@ isc_log_doit(isc_logcategory_t category, isc_logmodule_t module, int level, } utc = ((channel->flags & ISC_LOG_UTC) != 0); + tzinfo = ((channel->flags & ISC_LOG_TZINFO) != 0); iso8601 = ((channel->flags & ISC_LOG_ISO8601) != 0); printtime = ((channel->flags & ISC_LOG_PRINTTIME) != 0); printtag = ((channel->flags & @@ -1412,6 +1413,8 @@ isc_log_doit(isc_logcategory_t category, isc_logmodule_t module, int level, if (iso8601) { if (utc) { time_string = iso8601z_string; + } else if (tzinfo) { + time_string = iso8601tz_string; } else { time_string = iso8601l_string; } diff --git a/lib/isc/time.c b/lib/isc/time.c index cff1764554..1a4eae228d 100644 --- a/lib/isc/time.c +++ b/lib/isc/time.c @@ -382,22 +382,6 @@ isc_time_parsehttptimestamp(char *buf, isc_time_t *t) { return (ISC_R_SUCCESS); } -void -isc_time_formatISO8601L(const isc_time_t *t, char *buf, unsigned int len) { - time_t now; - unsigned int flen; - struct tm tm; - - REQUIRE(t != NULL); - INSIST(t->nanoseconds < NS_PER_SEC); - REQUIRE(buf != NULL); - REQUIRE(len > 0); - - now = (time_t)t->seconds; - flen = strftime(buf, len, "%Y-%m-%dT%H:%M:%S", localtime_r(&now, &tm)); - INSIST(flen < len); -} - void isc_time_formatISO8601Lms(const isc_time_t *t, char *buf, unsigned int len) { time_t now; @@ -419,7 +403,9 @@ isc_time_formatISO8601Lms(const isc_time_t *t, char *buf, unsigned int len) { } void -isc_time_formatISO8601Lus(const isc_time_t *t, char *buf, unsigned int len) { +isc_time_formatISO8601TZms(const isc_time_t *t, char *buf, unsigned int len) { + char strftime_buf[64] = { 0 }; + char ms_buf[8] = { 0 }; time_t now; unsigned int flen; struct tm tm; @@ -430,14 +416,20 @@ isc_time_formatISO8601Lus(const isc_time_t *t, char *buf, unsigned int len) { REQUIRE(len > 0); now = (time_t)t->seconds; - flen = strftime(buf, len, "%Y-%m-%dT%H:%M:%S", localtime_r(&now, &tm)); - INSIST(flen < len); - if (flen > 0U && len - flen >= 6) { - snprintf(buf + flen, len - flen, ".%06u", - t->nanoseconds / NS_PER_US); - } -} + flen = strftime(strftime_buf, len, "%Y-%m-%dT%H:%M:%S.xxx%z", + localtime_r(&now, &tm)); + snprintf(ms_buf, sizeof(ms_buf), ".%03u", t->nanoseconds / NS_PER_MS); + INSIST(flen < len); + size_t local_date_len = sizeof("yyyy-mm-ddThh:mm:ss") - 1ul; + size_t ms_date_len = local_date_len + 4; + + memmove(buf, strftime_buf, local_date_len); + memmove(buf + local_date_len, ms_buf, 4); + memmove(buf + ms_date_len, strftime_buf + ms_date_len, 3); + buf[ms_date_len + 3] = ':'; + memmove(buf + ms_date_len + 4, strftime_buf + ms_date_len + 3, 3); +} void isc_time_formatISO8601(const isc_time_t *t, char *buf, unsigned int len) { time_t now; diff --git a/lib/isccfg/namedconf.c b/lib/isccfg/namedconf.c index dbb787e518..e6aace10db 100644 --- a/lib/isccfg/namedconf.c +++ b/lib/isccfg/namedconf.c @@ -2631,8 +2631,8 @@ static cfg_type_t cfg_type_server = { "server", cfg_parse_netprefix_map, * - There must exactly one of file/syslog/null/stderr */ -static const char *printtime_enums[] = { "iso8601", "iso8601-utc", "local", - NULL }; +static const char *printtime_enums[] = { "iso8601", "iso8601-utc", + "iso8601-tzinfo", "local", NULL }; static isc_result_t parse_printtime(cfg_parser_t *pctx, const cfg_type_t *type, cfg_obj_t **ret) { return (cfg_parse_enum_or_other(pctx, type, &cfg_type_boolean, ret)); diff --git a/tests/isc/time_test.c b/tests/isc/time_test.c index 18b42e5098..d3a7c016f4 100644 --- a/tests/isc/time_test.c +++ b/tests/isc/time_test.c @@ -256,9 +256,9 @@ ISC_RUN_TEST_IMPL(isc_time_formatISO8601us_test) { assert_string_equal(buf, "2015-12-13T09:46:40.123456Z"); } -/* print local time in ISO8601 */ +/* print local time in ISO8601 with milliseconds and timezone */ -ISC_RUN_TEST_IMPL(isc_time_formatISO8601L_test) { +ISC_RUN_TEST_IMPL(isc_time_formatISO8601TZms_test) { isc_time_t t; char buf[64]; @@ -267,28 +267,34 @@ ISC_RUN_TEST_IMPL(isc_time_formatISO8601L_test) { setenv("TZ", "America/Los_Angeles", 1); t = isc_time_now(); - /* check formatting: yyyy-mm-ddThh:mm:ss */ + /* check formatting: yyyy-mm-ddThh:mm:ss.sss */ memset(buf, 'X', sizeof(buf)); - isc_time_formatISO8601L(&t, buf, sizeof(buf)); - assert_int_equal(strlen(buf), 19); + buf[63] = '\0'; + isc_time_formatISO8601TZms(&t, buf, sizeof(buf)); + assert_int_equal(strlen(buf), strlen("yyyy-mm-ddThh:mm:ss.sss+hh:mm")); + assert_int_equal(buf[4], '-'); assert_int_equal(buf[7], '-'); assert_int_equal(buf[10], 'T'); assert_int_equal(buf[13], ':'); assert_int_equal(buf[16], ':'); + assert_int_equal(buf[19], '.'); + + size_t plus_minus[2] = { '+', '-' }; + assert_in_set(buf[23], plus_minus, sizeof(plus_minus)); + assert_int_equal(buf[26], ':'); /* check time conversion correctness */ memset(buf, 'X', sizeof(buf)); isc_time_settoepoch(&t); - isc_time_formatISO8601L(&t, buf, sizeof(buf)); - assert_string_equal(buf, "1969-12-31T16:00:00"); + isc_time_formatISO8601Lms(&t, buf, sizeof(buf)); + assert_string_equal(buf, "1969-12-31T16:00:00.000"); memset(buf, 'X', sizeof(buf)); isc_time_set(&t, 1450000000, 123000000); - isc_time_formatISO8601L(&t, buf, sizeof(buf)); - assert_string_equal(buf, "2015-12-13T01:46:40"); + isc_time_formatISO8601Lms(&t, buf, sizeof(buf)); + assert_string_equal(buf, "2015-12-13T01:46:40.123"); } - /* print local time in ISO8601 with milliseconds */ ISC_RUN_TEST_IMPL(isc_time_formatISO8601Lms_test) { @@ -323,40 +329,6 @@ ISC_RUN_TEST_IMPL(isc_time_formatISO8601Lms_test) { assert_string_equal(buf, "2015-12-13T01:46:40.123"); } -/* print local time in ISO8601 with microseconds */ - -ISC_RUN_TEST_IMPL(isc_time_formatISO8601Lus_test) { - isc_time_t t; - char buf[64]; - - UNUSED(state); - - setenv("TZ", "America/Los_Angeles", 1); - t = isc_time_now_hires(); - - /* check formatting: yyyy-mm-ddThh:mm:ss.ssssss */ - memset(buf, 'X', sizeof(buf)); - isc_time_formatISO8601Lus(&t, buf, sizeof(buf)); - assert_int_equal(strlen(buf), 26); - assert_int_equal(buf[4], '-'); - assert_int_equal(buf[7], '-'); - assert_int_equal(buf[10], 'T'); - assert_int_equal(buf[13], ':'); - assert_int_equal(buf[16], ':'); - assert_int_equal(buf[19], '.'); - - /* check time conversion correctness */ - memset(buf, 'X', sizeof(buf)); - isc_time_settoepoch(&t); - isc_time_formatISO8601Lus(&t, buf, sizeof(buf)); - assert_string_equal(buf, "1969-12-31T16:00:00.000000"); - - memset(buf, 'X', sizeof(buf)); - isc_time_set(&t, 1450000000, 123456000); - isc_time_formatISO8601Lus(&t, buf, sizeof(buf)); - assert_string_equal(buf, "2015-12-13T01:46:40.123456"); -} - /* print UTC time as yyyymmddhhmmsssss */ ISC_RUN_TEST_IMPL(isc_time_formatshorttimestamp_test) { @@ -393,9 +365,8 @@ ISC_TEST_ENTRY(isc_time_parsehttptimestamp_test) ISC_TEST_ENTRY(isc_time_formatISO8601_test) ISC_TEST_ENTRY(isc_time_formatISO8601ms_test) ISC_TEST_ENTRY(isc_time_formatISO8601us_test) -ISC_TEST_ENTRY(isc_time_formatISO8601L_test) ISC_TEST_ENTRY(isc_time_formatISO8601Lms_test) -ISC_TEST_ENTRY(isc_time_formatISO8601Lus_test) +ISC_TEST_ENTRY(isc_time_formatISO8601TZms_test) ISC_TEST_ENTRY(isc_time_formatshorttimestamp_test) ISC_TEST_LIST_END