[BusyBox-cvs] busybox/sysklogd logread.c,1.12,1.13

Glenn McGrath bug1 at busybox.net
Fri Sep 26 01:03:19 UTC 2003


Update of /var/cvs/busybox/sysklogd
In directory winder:/tmp/cvs-serv32375/sysklogd

Modified Files:
	logread.c 
Log Message:
Patch from Fillod Stephane
Add follow mode to logread, ala "tail -f /var/log/messages"
Note: output to a slow serial terminal can have side effects
on syslog because of the semaphore. In such case, define 
RC_LOGREAD.


Index: logread.c
===================================================================
RCS file: /var/cvs/busybox/sysklogd/logread.c,v
retrieving revision 1.12
retrieving revision 1.13
diff -u -d -r1.12 -r1.13
--- logread.c	22 Jul 2003 08:56:54 -0000	1.12
+++ logread.c	26 Sep 2003 01:03:16 -0000	1.13
@@ -33,6 +33,7 @@
 #include <sys/shm.h>
 #include <signal.h>
 #include <setjmp.h>
+#include <unistd.h>
 #include "busybox.h"
 
 static const long KEY_ID = 0x414e4547; /*"GENA"*/
@@ -77,10 +78,15 @@
 extern int logread_main(int argc, char **argv)
 {
 	int i;
+	int follow=0;
 	
-	/* no options, no getopt */
-	if (argc > 1)
-		bb_show_usage();
+	if (argc == 2 && strcmp(argv[1],"-f")==0) {
+		follow = 1;
+	} else {
+		/* no options, no getopt */
+		if (argc > 1)
+			bb_show_usage();
+	}
 	
 	// handle intrrupt signal
 	if (setjmp(jmp_env)) goto output_end;
@@ -98,22 +104,66 @@
 	if ( (log_semid = semget(KEY_ID, 0, 0)) == -1)
 	    	error_exit("Can't get access to semaphone(s) for circular buffer from syslogd");
 
-	sem_down(log_semid);	
-	// Read Memory 
-	i=buf->head;
+	// Suppose atomic memory move
+	i = follow ? buf->tail : buf->head;
 
-	//printf("head: %i tail: %i size: %i\n",buf->head,buf->tail,buf->size);
-	if (buf->head == buf->tail) {
-		printf("<empty syslog>\n");
-	}
+	do {
+#undef RC_LOGREAD
+#ifdef RC_LOGREAD
+		char *buf_data;
+		int log_len,j;
+#endif
+
+		sem_down(log_semid);	
+
+		//printf("head: %i tail: %i size: %i\n",buf->head,buf->tail,buf->size);
+		if (buf->head == buf->tail || i==buf->tail) {
+			if (follow) {
+				sem_up(log_semid);
+				sleep(1);	/* TODO: replace me with a sleep_on */
+				continue;
+			} else {
+				printf("<empty syslog>\n");
+			}
+		}
 	
-	while ( i != buf->tail) {
-		printf("%s", buf->data+i);
-		i+= strlen(buf->data+i) + 1;
-		if (i >= buf->size )
-			i=0;
-	}
-	sem_up(log_semid);
+		// Read Memory 
+#ifdef RC_LOGREAD
+		log_len = buf->tail - i;
+		if (log_len < 0)
+			log_len += buf->size;
+		buf_data = (char *)malloc(log_len);
+		if (!buf_data)
+			error_exit("malloc failed");
+
+		if (buf->tail < i) {
+			memcpy(buf_data, buf->data+i, buf->size-i);
+			memcpy(buf_data+buf->size-i, buf->data, buf->tail);
+		} else {
+			memcpy(buf_data, buf->data+i, buf->tail-i);
+		}
+		i = buf->tail;
+
+#else
+		while ( i != buf->tail) {
+			printf("%s", buf->data+i);
+			i+= strlen(buf->data+i) + 1;
+			if (i >= buf->size )
+				i=0;
+		}
+#endif
+		// release the lock on the log chain
+		sem_up(log_semid);
+
+#ifdef RC_LOGREAD
+		for (j=0; j < log_len; j+=strlen(buf_data+j)+1) {
+			printf("%s", buf_data+j);
+			if (follow)
+				fflush(stdout);
+		}
+		free(buf_data);
+#endif
+	} while (follow);
 
 output_end:
 	if (log_shmid != -1) 




More information about the busybox-cvs mailing list