summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEric Andersen2000-12-11 16:31:11 +0000
committerEric Andersen2000-12-11 16:31:11 +0000
commitcf7982e908f98e1ab7e90ffb039ed5968589ae24 (patch)
treeb4ca877f6171f659c20284506093bcd0160531e8
parent70d09ed1cf54ae20d38c5c56c5afb5994cc46f32 (diff)
downloadbusybox-cf7982e908f98e1ab7e90ffb039ed5968589ae24.zip
busybox-cf7982e908f98e1ab7e90ffb039ed5968589ae24.tar.gz
Patch from Larry Doolittle, fix up logging across multilple lines, hopefully
fixing bug #1061.
-rw-r--r--sysklogd/syslogd.c55
-rw-r--r--syslogd.c55
2 files changed, 50 insertions, 60 deletions
diff --git a/sysklogd/syslogd.c b/sysklogd/syslogd.c
index fd56aad..9e174e6 100644
--- a/sysklogd/syslogd.c
+++ b/sysklogd/syslogd.c
@@ -403,7 +403,8 @@ static void doKlogd (void)
{
int priority = LOG_INFO;
char log_buffer[4096];
- char *logp;
+ int i, n, lastc;
+ char *start;
/* Set up sig handlers */
signal(SIGINT, klogd_signal);
@@ -420,12 +421,14 @@ static void doKlogd (void)
logMessage(0, "klogd started: "
"BusyBox v" BB_VER " (" BB_BT ")");
+ /* "Open the log. Currently a NOP." */
klogctl(1, NULL, 0);
while (1) {
/* Use kernel syscalls */
memset(log_buffer, '\0', sizeof(log_buffer));
- if (klogctl(2, log_buffer, sizeof(log_buffer)) < 0) {
+ n = klogctl(2, log_buffer, sizeof(log_buffer));
+ if (n < 0) {
char message[80];
if (errno == EINTR)
@@ -435,37 +438,29 @@ static void doKlogd (void)
logMessage(LOG_SYSLOG | LOG_ERR, message);
exit(1);
}
- logp = log_buffer;
- if (*log_buffer == '<') {
- switch (*(log_buffer + 1)) {
- case '0':
- priority = LOG_EMERG;
- break;
- case '1':
- priority = LOG_ALERT;
- break;
- case '2':
- priority = LOG_CRIT;
- break;
- case '3':
- priority = LOG_ERR;
- break;
- case '4':
- priority = LOG_WARNING;
- break;
- case '5':
- priority = LOG_NOTICE;
- break;
- case '6':
+
+ /* klogctl buffer parsing modelled after code in dmesg.c */
+ start=&log_buffer[0];
+ lastc='\0';
+ for (i=0; i<n; i++) {
+ if (lastc == '\0' && log_buffer[i] == '<') {
+ priority = 0;
+ i++;
+ while (isdigit(log_buffer[i])) {
+ priority = priority*10+(log_buffer[i]-'0');
+ i++;
+ }
+ if (log_buffer[i] == '>') i++;
+ start = &log_buffer[i];
+ }
+ if (log_buffer[i] == '\n') {
+ log_buffer[i] = '\0'; /* zero terminate this message */
+ logMessage(LOG_KERN | priority, start);
+ start = &log_buffer[i+1];
priority = LOG_INFO;
- break;
- case '7':
- default:
- priority = LOG_DEBUG;
}
- logp += 3;
+ lastc = log_buffer[i];
}
- logMessage(LOG_KERN | priority, logp);
}
}
diff --git a/syslogd.c b/syslogd.c
index fd56aad..9e174e6 100644
--- a/syslogd.c
+++ b/syslogd.c
@@ -403,7 +403,8 @@ static void doKlogd (void)
{
int priority = LOG_INFO;
char log_buffer[4096];
- char *logp;
+ int i, n, lastc;
+ char *start;
/* Set up sig handlers */
signal(SIGINT, klogd_signal);
@@ -420,12 +421,14 @@ static void doKlogd (void)
logMessage(0, "klogd started: "
"BusyBox v" BB_VER " (" BB_BT ")");
+ /* "Open the log. Currently a NOP." */
klogctl(1, NULL, 0);
while (1) {
/* Use kernel syscalls */
memset(log_buffer, '\0', sizeof(log_buffer));
- if (klogctl(2, log_buffer, sizeof(log_buffer)) < 0) {
+ n = klogctl(2, log_buffer, sizeof(log_buffer));
+ if (n < 0) {
char message[80];
if (errno == EINTR)
@@ -435,37 +438,29 @@ static void doKlogd (void)
logMessage(LOG_SYSLOG | LOG_ERR, message);
exit(1);
}
- logp = log_buffer;
- if (*log_buffer == '<') {
- switch (*(log_buffer + 1)) {
- case '0':
- priority = LOG_EMERG;
- break;
- case '1':
- priority = LOG_ALERT;
- break;
- case '2':
- priority = LOG_CRIT;
- break;
- case '3':
- priority = LOG_ERR;
- break;
- case '4':
- priority = LOG_WARNING;
- break;
- case '5':
- priority = LOG_NOTICE;
- break;
- case '6':
+
+ /* klogctl buffer parsing modelled after code in dmesg.c */
+ start=&log_buffer[0];
+ lastc='\0';
+ for (i=0; i<n; i++) {
+ if (lastc == '\0' && log_buffer[i] == '<') {
+ priority = 0;
+ i++;
+ while (isdigit(log_buffer[i])) {
+ priority = priority*10+(log_buffer[i]-'0');
+ i++;
+ }
+ if (log_buffer[i] == '>') i++;
+ start = &log_buffer[i];
+ }
+ if (log_buffer[i] == '\n') {
+ log_buffer[i] = '\0'; /* zero terminate this message */
+ logMessage(LOG_KERN | priority, start);
+ start = &log_buffer[i+1];
priority = LOG_INFO;
- break;
- case '7':
- default:
- priority = LOG_DEBUG;
}
- logp += 3;
+ lastc = log_buffer[i];
}
- logMessage(LOG_KERN | priority, logp);
}
}