Module Name: src Committed By: kre Date: Sat Apr 14 01:37:34 UTC 2018
Modified Files: src/sbin/dmesg: dmesg.c Log Message: Make timestamp reading code adapt to whatever precision (up to nanoseconds, 9 digits) the kernel happens to send in the timestamps in log messages. Output (numeric) timestamps (when produced) are unchanged and always in microseconds (for now). To generate a diff of this commit: cvs rdiff -u -r1.32 -r1.33 src/sbin/dmesg/dmesg.c Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/sbin/dmesg/dmesg.c diff -u src/sbin/dmesg/dmesg.c:1.32 src/sbin/dmesg/dmesg.c:1.33 --- src/sbin/dmesg/dmesg.c:1.32 Wed Apr 11 06:41:23 2018 +++ src/sbin/dmesg/dmesg.c Sat Apr 14 01:37:34 2018 @@ -1,4 +1,4 @@ -/* $NetBSD: dmesg.c,v 1.32 2018/04/11 06:41:23 wiz Exp $ */ +/* $NetBSD: dmesg.c,v 1.33 2018/04/14 01:37:34 kre Exp $ */ /*- * Copyright (c) 1991, 1993 * The Regents of the University of California. All rights reserved. @@ -38,7 +38,7 @@ __COPYRIGHT("@(#) Copyright (c) 1991, 19 #if 0 static char sccsid[] = "@(#)dmesg.c 8.1 (Berkeley) 6/5/93"; #else -__RCSID("$NetBSD: dmesg.c,v 1.32 2018/04/11 06:41:23 wiz Exp $"); +__RCSID("$NetBSD: dmesg.c,v 1.33 2018/04/14 01:37:34 kre Exp $"); #endif #endif /* not lint */ @@ -84,8 +84,10 @@ main(int argc, char *argv[]) struct timeval boottime; struct timespec lasttime; intmax_t sec; - long nsec; + long nsec, fsec; + int scale; int deltas, quiet, humantime; + bool frac; static const int bmib[] = { CTL_KERN, KERN_BOOTTIME }; size = sizeof(boottime); @@ -183,16 +185,23 @@ main(int argc, char *argv[]) * over cur.msg_bufs times. Unused area is skipped since it * contains nul. */ +#ifndef SMALL + frac = false; + scale = 0; +#endif for (tstamp = 0, newl = 1, log = i = 0, p = bufdata + cur.msg_bufx; i < cur.msg_bufs; i++, p++) { + #ifndef SMALL if (p == bufdata + cur.msg_bufs) p = bufdata; #define ADDC(c) \ - do \ + do { \ if (tstamp < sizeof(tbuf) - 1) \ tbuf[tstamp++] = (c); \ - while (/*CONSTCOND*/0) + if (frac) \ + scale++; \ + } while (/*CONSTCOND*/0) #else #define ADDC(c) #endif @@ -202,8 +211,16 @@ main(int argc, char *argv[]) /* Skip "\n<.*>" syslog sequences. */ /* Gather timestamp sequences */ if (newl) { +#ifndef SMALL + int j; +#endif + switch (ch) { case '[': +#ifndef SMALL + frac = false; + scale = 0; +#endif ADDC(ch); continue; case '<': @@ -213,16 +230,37 @@ main(int argc, char *argv[]) log = 0; continue; case ']': +#ifndef SMALL + frac = false; +#endif ADDC(ch); ADDC('\0'); tstamp = 0; #ifndef SMALL - sscanf(tbuf, "[%jd.%ld]", &sec, &nsec); + sec = fsec = 0; + switch (sscanf(tbuf, "[%jd.%ld]", &sec, &fsec)){ + case EOF: + case 0: + /*???*/ + continue; + case 1: + fsec = 0; + break; + case 2: + break; + default: + /* Help */ + continue; + } + + for (nsec = fsec, j = 9 - scale; --j >= 0; ) + nsec *= 10; if (!quiet || deltas) printf("["); if (humantime) { time_t t; struct tm tm; + t = boottime.tv_sec + sec; if (localtime_r(&t, &tm) != NULL) { strftime(tbuf, sizeof(tbuf), @@ -231,17 +269,23 @@ main(int argc, char *argv[]) printf("%s", tbuf); } } else if (!quiet) { - printf("% 9jd.%06ld", - sec, nsec / 1000); + if (scale > 6) + printf("% 5jd.%6.6ld", + sec, (nsec + 499) / 1000); + else + printf("% 5jd.%*.*ld%.*s", + sec, scale, scale, fsec, + 6 - scale, "000000"); } if (deltas) { struct timespec nt = { sec, nsec }; struct timespec dt; + timespecsub(&nt, &lasttime, &dt); if (humantime || !quiet) printf(" "); printf("<% 4jd.%06ld>", (intmax_t) - dt.tv_sec, dt.tv_nsec / 1000); + dt.tv_sec, (dt.tv_nsec+499) / 1000); lasttime = nt; } if (!quiet || deltas) @@ -255,6 +299,10 @@ main(int argc, char *argv[]) default: if (tstamp) { ADDC(ch); +#ifndef SMALL + if (ch == '.') + frac = true; +#endif continue; } if (log)