[Toybox] [PATCH 1/2] dmesg: Add -W (--follow-new) support

Brian Norris briannorris at google.com
Thu Aug 22 09:15:28 PDT 2024


Useful for watching what happens going forward, without being
overwhelmed with potentially-large preexisting logs.

util-linux has had this since 2020.

---

 toys/lsb/dmesg.c | 9 +++++----
 1 file changed, 5 insertions(+), 4 deletions(-)

diff --git a/toys/lsb/dmesg.c b/toys/lsb/dmesg.c
index b7963b8bb01c..a29961c9272a 100644
--- a/toys/lsb/dmesg.c
+++ b/toys/lsb/dmesg.c
@@ -7,13 +7,13 @@
  * Linux 6.0 celebrates the 10th anniversary of this being in "testing":
  * http://kernel.org/doc/Documentation/ABI/testing/dev-kmsg
 
-USE_DMESG(NEWTOY(dmesg, "w(follow)CSTtrs#<1n#c[!Ttr][!Cc][!Sw]", TOYFLAG_BIN))
+USE_DMESG(NEWTOY(dmesg, "w(follow)W(follow-new)CSTtrs#<1n#c[!Ttr][!Cc][!SWw]", TOYFLAG_BIN))
 
 config DMESG
   bool "dmesg"
   default y
   help
-    usage: dmesg [-Cc] [-r|-t|-T] [-n LEVEL] [-s SIZE] [-w]
+    usage: dmesg [-Cc] [-r|-t|-T] [-n LEVEL] [-s SIZE] [-w|-W]
 
     Print or control the kernel ring buffer.
 
@@ -26,6 +26,7 @@ config DMESG
     -T	Human readable timestamps
     -t	Don't print timestamps
     -w	Keep waiting for more output (aka --follow)
+    -W	Wait for output, only printing new messages
 */
 
 #define FOR_dmesg
@@ -136,12 +137,12 @@ void dmesg_main(void)
 
     // Each read returns one message. By default, we block when there are no
     // more messages (--follow); O_NONBLOCK is needed for for usual behavior.
-    fd = open("/dev/kmsg", O_RDONLY|O_NONBLOCK*!FLAG(w));
+    fd = open("/dev/kmsg", O_RDONLY|O_NONBLOCK*!(FLAG(w) || FLAG(W)));
     if (fd == -1) goto klogctl_mode;
 
     // SYSLOG_ACTION_CLEAR(5) doesn't actually remove anything from /dev/kmsg,
     // you need to seek to the last clear point.
-    lseek(fd, 0, SEEK_DATA);
+    lseek(fd, 0, FLAG(W) ? SEEK_END : SEEK_DATA);
 
     for (;;) {
       // why does /dev/kmesg return EPIPE instead of EAGAIN if oldest message
-- 
2.46.0.184.g6999bdac58-goog



More information about the Toybox mailing list