Module Name:    src
Committed By:   rin
Date:           Sat Aug  6 09:39:32 UTC 2022

Modified Files:
        src/sbin/dmesg: dmesg.c

Log Message:
Do not discard \[.*\] which is not identified as a timestamp.


To generate a diff of this commit:
cvs rdiff -u -r1.46 -r1.47 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.46 src/sbin/dmesg/dmesg.c:1.47
--- src/sbin/dmesg/dmesg.c:1.46	Sat Aug  6 09:33:56 2022
+++ src/sbin/dmesg/dmesg.c	Sat Aug  6 09:39:32 2022
@@ -1,4 +1,4 @@
-/*	$NetBSD: dmesg.c,v 1.46 2022/08/06 09:33:56 rin Exp $	*/
+/*	$NetBSD: dmesg.c,v 1.47 2022/08/06 09:39:32 rin 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.46 2022/08/06 09:33:56 rin Exp $");
+__RCSID("$NetBSD: dmesg.c,v 1.47 2022/08/06 09:39:32 rin Exp $");
 #endif
 #endif /* not lint */
 
@@ -149,7 +149,8 @@ main(int argc, char *argv[])
 	char *p, *bufdata;
 	char buf[5];
 #ifndef SMALL
-	char tbuf[64];
+	size_t tbuflen;
+	char *tbuf;
 	char *memf, *nlistf;
 	struct timespec boottime;
 	struct timespec lasttime;
@@ -264,6 +265,11 @@ main(int argc, char *argv[])
 	frac = false;
 	postts = false;
 	scale = 0;
+
+	tbuflen = 64;
+	tbuf = malloc(tbuflen);
+	if (tbuf == NULL)
+		err(1, "malloc");
 #endif
 	for (tstamp = 0, newl = 1, log = i = 0, p = bufdata + cur.msg_bufx;
 	    i < cur.msg_bufs; i++, p++) {
@@ -273,11 +279,22 @@ main(int argc, char *argv[])
 			p = bufdata;
 #define ADDC(c)								\
     do {								\
-	if (tstamp < sizeof(tbuf) - 1)					\
+	if (tstamp >= tbuflen - 1 &&					\
+	    reallocarr(&tbuf, tstamp * 2, 1) == 0)			\
+		tbuflen *= 2;						\
+	if (tstamp < tbuflen - 1)					\
 		tbuf[tstamp++] = (c);					\
 	if (frac)							\
 		scale++;						\
     } while (0)
+#define	PRTBUF()							\
+    for (char *_p = tbuf; *_p != '\0'; _p++) {				\
+	(void)vis(buf, *_p, VIS_NOSLASH, 0);				\
+	if (buf[1] == 0)						\
+		(void)putchar(buf[0]);					\
+	else								\
+		(void)printf("%s", buf);				\
+    }
 #endif
 		ch = *p;
 		if (ch == '\0')
@@ -312,15 +329,16 @@ main(int argc, char *argv[])
 				postts = true;
 				sec = fsec = 0;
 				switch (sscanf(tbuf, "[%jd.%ld]", &sec, &fsec)){
-				case EOF:
 				case 0:
-					/*???*/
+					/* not a timestamp */
+					PRTBUF();
 					continue;
 				case 1:
-					fsec = 0;
+					fsec = 0; /* XXX PRTBUF()? */
 					break;
 				case 2:
 					break;
+				case EOF:
 				default:
 					/* Help */
 					continue;
@@ -343,14 +361,14 @@ main(int argc, char *argv[])
 							t++;
 
 					if (localtime_r(&t, &tm) != NULL) {
-						strftime(tbuf, sizeof(tbuf),
+						strftime(tbuf, tbuflen,
 						    "%a %b %e %H:%M:%S %Z %Y",
 						    &tm);
 						printf("%s", tbuf);
 					}
 				} else if (humantime > 1) {
 					const char *fp = fmtydhmsf(tbuf,
-					    sizeof(tbuf), sec, fsec, humantime);
+					    tbuflen, sec, fsec, humantime);
 					if (fp) {
 						printf("%s", fp);
 					}
@@ -407,6 +425,13 @@ main(int argc, char *argv[])
 #endif
 			(void)printf("%s", buf);
 	}
+#ifndef SMALL
+	/* non-terminated [.*] */
+	if (tstamp) {
+		ADDC('\0');
+		PRTBUF();
+	}
+#endif
 	if (!newl)
 		(void)putchar('\n');
 	return EXIT_SUCCESS;

Reply via email to