dmesg timestamps are beginning at system start. This is not really helpful when you try to correlate with external sources.
Signed-off-by: walter <[email protected]> --- util-linux/dmesg.c | 80 +++++++++++++++++++++++++++++++++++++++++++++--------- 1 file changed, 67 insertions(+), 13 deletions(-) diff --git a/util-linux/dmesg.c b/util-linux/dmesg.c index b797c7b..deeaaac 100644 --- a/util-linux/dmesg.c +++ b/util-linux/dmesg.c @@ -57,6 +57,49 @@ #include <sys/klog.h> #include "libbb.h" +#ifdef __linux__ +# include <sys/sysinfo.h> +#endif + +#if ENABLE_FEATURE_DMESG_PRETTY +static time_t get_offset(void) +{ + struct sysinfo info; + time_t now; + sysinfo(&info); + time (&now); + return now-info.uptime; +} + +/* + * convert "[ xxx.yyy" + */ +static void print_time(char *buf, time_t off) +{ + long sec,usec; + char out[23]; + sscanf(buf,"[ %ld.%ld",&sec,&usec); + sec=sec+off; + strftime(out,sizeof(out),"[%Y-%m-%d %H:%M:%S]",gmtime(&sec)); + printf("%s",out); +} + +static int scan_time(char *buf, int len, int in,time_t off) +{ + char timebuf[80]; + int tcnt=0; + while ( buf[in] != ']' + && in < len + && tcnt+1<sizeof(timebuf) ) { + timebuf[tcnt++]=buf[in++]; + } + timebuf[tcnt]=0; + tcnt=0; + print_time(timebuf,off); + return in; +} + +#endif int dmesg_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE; int dmesg_main(int argc UNUSED_PARAM, char **argv) @@ -68,10 +111,11 @@ int dmesg_main(int argc UNUSED_PARAM, char **argv) OPT_c = 1 << 0, OPT_s = 1 << 1, OPT_n = 1 << 2, - OPT_r = 1 << 3 + OPT_r = 1 << 3, + OPT_T = 1 << 4 }; - opts = getopt32(argv, "cs:+n:+r", &len, &level); + opts = getopt32(argv, "cs:+n:+rT", &len, &level); if (opts & OPT_n) { if (klogctl(8, NULL, (long) level)) bb_perror_msg_and_die("klogctl"); @@ -94,20 +138,30 @@ int dmesg_main(int argc UNUSED_PARAM, char **argv) if (ENABLE_FEATURE_DMESG_PRETTY && !(opts & OPT_r)) { + int last = '\n'; int in = 0; + time_t off; + + off=get_offset(); + while (1) { + if (last == '\n') { + /* Skip <[0-9]+> at the start of line */ + if (buf[in] == '<') + while (buf[in++] != '>' && in < len) + ; + /* eval [xxx.yyy] at the start of line */ + if ( (opts &OPT_T) && in < len && buf[in] == '[') { + in=scan_time(buf,len,in,off); + last = buf[in++]; // skip ] + } + + } + if (in >= len) + break; - /* Skip <[0-9]+> at the start of lines */ - while (1) { - if (last == '\n' && buf[in] == '<') { - while (buf[in++] != '>' && in < len) - ; - } else { - last = buf[in++]; - putchar(last); - } - if (in >= len) - break; + last = buf[in++]; + putchar(last); } /* Make sure we end with a newline */ if (last != '\n') -- 2.1.4 _______________________________________________ busybox mailing list [email protected] http://lists.busybox.net/mailman/listinfo/busybox
