[git commit] logread: implement dumpfollow mode of operation

Denys Vlasenko vda.linux at googlemail.com
Sun Mar 22 16:37:20 UTC 2015


commit: http://git.busybox.net/busybox/commit/?id=92edab1aa6eae45ac8fa0cec8c8df9a47f547300
branch: http://git.busybox.net/busybox/commit/?id=refs/heads/master

This is basically a combination of the default (dump mode) and -f
(follow mode). Specifying -F makes logread first dump the log buffer and
then immediately start following it.

function                                             old     new   delta
packed_usage                                       30412   30443     +31
logread_main                                         491     497      +6

Signed-off-by: Phil Sutter <phil.sutter at viprinet.com>
Signed-off-by: Denys Vlasenko <vda.linux at googlemail.com>
---
 sysklogd/logread.c |   16 +++++++++++-----
 1 files changed, 11 insertions(+), 5 deletions(-)

diff --git a/sysklogd/logread.c b/sysklogd/logread.c
index bea73d9..da4a4d4 100644
--- a/sysklogd/logread.c
+++ b/sysklogd/logread.c
@@ -10,10 +10,11 @@
  */
 
 //usage:#define logread_trivial_usage
-//usage:       "[-f]"
+//usage:       "[-fF]"
 //usage:#define logread_full_usage "\n\n"
 //usage:       "Show messages in syslogd's circular buffer\n"
 //usage:     "\n	-f	Output data as log grows"
+//usage:     "\n	-F	Same as -f, but dump buffer first"
 
 #include "libbb.h"
 #include <sys/ipc.h>
@@ -83,7 +84,7 @@ int logread_main(int argc UNUSED_PARAM, char **argv)
 	unsigned cur;
 	int log_semid; /* ipc semaphore id */
 	int log_shmid; /* ipc shared memory id */
-	smallint follow = getopt32(argv, "f");
+	int follow = getopt32(argv, "fF");
 
 	INIT_G();
 
@@ -106,7 +107,7 @@ int logread_main(int argc UNUSED_PARAM, char **argv)
 	/* Max possible value for tail is shbuf->size - 1 */
 	cur = shbuf->tail;
 
-	/* Loop for logread -f, one pass if there was no -f */
+	/* Loop for -f or -F, one pass otherwise */
 	do {
 		unsigned shbuf_size;
 		unsigned shbuf_tail;
@@ -129,7 +130,12 @@ int logread_main(int argc UNUSED_PARAM, char **argv)
 			printf("cur:%u tail:%u size:%u\n",
 					cur, shbuf_tail, shbuf_size);
 
-		if (!follow) {
+		if (!(follow & 1)) { /* not -f */
+			/* if -F, "convert" it to -f, so that we dont
+			 * dump the entire buffer on each iteration
+			 */
+			follow >>= 1;
+
 			/* advance to oldest complete message */
 			/* find NUL */
 			cur += strlen(shbuf_data + cur);
@@ -142,7 +148,7 @@ int logread_main(int argc UNUSED_PARAM, char **argv)
 			cur++;
 			if (cur >= shbuf_size) /* last byte in buffer? */
 				cur = 0;
-		} else { /* logread -f */
+		} else { /* -f */
 			if (cur == shbuf_tail) {
 				sem_up(log_semid);
 				fflush_all();


More information about the busybox-cvs mailing list