svn commit: trunk/busybox: miscutils sysklogd

vda at busybox.net vda at busybox.net
Sat Oct 4 16:40:18 UTC 2008


Author: vda
Date: 2008-10-04 09:40:17 -0700 (Sat, 04 Oct 2008)
New Revision: 23583

Log:
watchdog: WDIOC_SETTIMEOUT accepts seconds, not milliseconds
klogd: handle many lines at once, by Steve Bennett (steveb AT workware.net.au)



Modified:
   trunk/busybox/miscutils/watchdog.c
   trunk/busybox/sysklogd/klogd.c


Changeset:
Modified: trunk/busybox/miscutils/watchdog.c
===================================================================
--- trunk/busybox/miscutils/watchdog.c	2008-10-03 14:24:28 UTC (rev 23582)
+++ trunk/busybox/miscutils/watchdog.c	2008-10-04 16:40:17 UTC (rev 23583)
@@ -55,6 +55,8 @@
 	/* Use known fd # - avoid needing global 'int fd' */
 	xmove_fd(xopen(argv[argc - 1], O_WRONLY), 3);
 
+	/* WDIOC_SETTIMEOUT takes seconds, not milliseconds */
+	htimer_duration = htimer_duration / 1000;
 	ioctl_or_warn(3, WDIOC_SETTIMEOUT, &htimer_duration);
 #if 0
 	ioctl_or_warn(3, WDIOC_GETTIMEOUT, &htimer_duration);

Modified: trunk/busybox/sysklogd/klogd.c
===================================================================
--- trunk/busybox/sysklogd/klogd.c	2008-10-03 14:24:28 UTC (rev 23582)
+++ trunk/busybox/sysklogd/klogd.c	2008-10-04 16:40:17 UTC (rev 23583)
@@ -44,6 +44,7 @@
 	int i = 0;
 	char *start;
 	int opt;
+	int used = 0;
 
 	opt = getopt32(argv, "c:n", &start);
 	if (opt & OPT_LEVEL) {
@@ -72,16 +73,15 @@
 
 	syslog(LOG_NOTICE, "klogd started: %s", bb_banner);
 
-	/* Note: this code does not detect incomplete messages
-	 * (messages not ending with '\n' or just when kernel
-	 * generates too many messages for us to keep up)
-	 * and will split them in two separate lines */
+	/* Initially null terminate the buffer in case of a very long line */
+	log_buffer[KLOGD_LOGBUF_SIZE - 1] = '\0';
+
 	while (1) {
 		int n;
 		int priority;
 
 		/* "2 -- Read from the log." */
-		n = klogctl(2, log_buffer, KLOGD_LOGBUF_SIZE - 1);
+		n = klogctl(2, log_buffer + used, KLOGD_LOGBUF_SIZE-1 - used);
 		if (n < 0) {
 			if (errno == EINTR)
 				continue;
@@ -89,32 +89,47 @@
 					errno);
 			break;
 		}
-		log_buffer[n] = '\n';
-		i = 0;
-		while (i < n) {
+
+		/* klogctl buffer parsing modelled after code in dmesg.c */
+		start = &log_buffer[0];
+
+		/* Process each newline-terminated line in the buffer */
+		while (1) {
+			char *newline = strchr(start, '\n');
+
+			if (!newline) {
+				/* This line is incomplete... */
+				if (start != log_buffer) {
+					/* move it to the front of the buffer */
+					strcpy(log_buffer, start);
+					/* don't log it yet */
+					used = strlen(log_buffer);
+					break;
+				}
+				/* ...but buffer is full, so log it anyway */
+				used = 0;
+			} else {
+				*newline++ = '\0';
+			}
+
+			/* Extract the priority */
 			priority = LOG_INFO;
-			start = &log_buffer[i];
-			if (log_buffer[i] == '<') {
-				i++;
-				// kernel never ganerates multi-digit prios
-				//priority = 0;
-				//while (log_buffer[i] >= '0' && log_buffer[i] <= '9') {
-				//	priority = priority * 10 + (log_buffer[i] - '0');
-				//	i++;
-				//}
-				if (isdigit(log_buffer[i])) {
-					priority = (log_buffer[i] - '0');
-					i++;
+			if (*start == '<') {
+				start++;
+				if (*start) {
+					/* kernel never generates multi-digit prios */
+					priority = (*start - '0');
+					start++;
 				}
-				if (log_buffer[i] == '>')
-					i++;
-				start = &log_buffer[i];
+				if (*start == '>') {
+					start++;
+				}
 			}
-			while (log_buffer[i] != '\n')
-				i++;
-			log_buffer[i] = '\0';
-			syslog(priority, "%s", start);
-			i++;
+			if (*start)
+				syslog(priority, "%s", start);
+			if (!newline)
+				break;
+			start = newline;
 		}
 	}
 




More information about the busybox-cvs mailing list