diff options
author | Phil Sutter <phil.sutter@viprinet.com> | 2015-03-22 17:36:20 +0100 |
---|---|---|
committer | Denys Vlasenko <vda.linux@googlemail.com> | 2015-03-22 17:37:20 +0100 |
commit | 92edab1aa6eae45ac8fa0cec8c8df9a47f547300 (patch) | |
tree | 738a5d864011189939847bceb8620af6371d4e62 | |
parent | 6d8ea1d50ec6088c51a61ab3e9f849b7845dce6b (diff) | |
download | busybox-92edab1aa6eae45ac8fa0cec8c8df9a47f547300.tar.gz |
logread: implement dumpfollow mode of operation
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@viprinet.com>
Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
-rw-r--r-- | sysklogd/logread.c | 16 |
1 files changed, 11 insertions, 5 deletions
diff --git a/sysklogd/logread.c b/sysklogd/logread.c index bea73d932..da4a4d4df 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(); |