aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEric Andersen <andersen@codepoet.org>2000-12-11 16:31:11 +0000
committerEric Andersen <andersen@codepoet.org>2000-12-11 16:31:11 +0000
commitcf7982e908f98e1ab7e90ffb039ed5968589ae24 (patch)
treeb4ca877f6171f659c20284506093bcd0160531e8
parent70d09ed1cf54ae20d38c5c56c5afb5994cc46f32 (diff)
downloadbusybox-w32-cf7982e908f98e1ab7e90ffb039ed5968589ae24.tar.gz
busybox-w32-cf7982e908f98e1ab7e90ffb039ed5968589ae24.tar.bz2
busybox-w32-cf7982e908f98e1ab7e90ffb039ed5968589ae24.zip
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 fd56aad97..9e174e6e8 100644
--- a/sysklogd/syslogd.c
+++ b/sysklogd/syslogd.c
@@ -403,7 +403,8 @@ static void doKlogd (void)
403{ 403{
404 int priority = LOG_INFO; 404 int priority = LOG_INFO;
405 char log_buffer[4096]; 405 char log_buffer[4096];
406 char *logp; 406 int i, n, lastc;
407 char *start;
407 408
408 /* Set up sig handlers */ 409 /* Set up sig handlers */
409 signal(SIGINT, klogd_signal); 410 signal(SIGINT, klogd_signal);
@@ -420,12 +421,14 @@ static void doKlogd (void)
420 logMessage(0, "klogd started: " 421 logMessage(0, "klogd started: "
421 "BusyBox v" BB_VER " (" BB_BT ")"); 422 "BusyBox v" BB_VER " (" BB_BT ")");
422 423
424 /* "Open the log. Currently a NOP." */
423 klogctl(1, NULL, 0); 425 klogctl(1, NULL, 0);
424 426
425 while (1) { 427 while (1) {
426 /* Use kernel syscalls */ 428 /* Use kernel syscalls */
427 memset(log_buffer, '\0', sizeof(log_buffer)); 429 memset(log_buffer, '\0', sizeof(log_buffer));
428 if (klogctl(2, log_buffer, sizeof(log_buffer)) < 0) { 430 n = klogctl(2, log_buffer, sizeof(log_buffer));
431 if (n < 0) {
429 char message[80]; 432 char message[80];
430 433
431 if (errno == EINTR) 434 if (errno == EINTR)
@@ -435,37 +438,29 @@ static void doKlogd (void)
435 logMessage(LOG_SYSLOG | LOG_ERR, message); 438 logMessage(LOG_SYSLOG | LOG_ERR, message);
436 exit(1); 439 exit(1);
437 } 440 }
438 logp = log_buffer; 441
439 if (*log_buffer == '<') { 442 /* klogctl buffer parsing modelled after code in dmesg.c */
440 switch (*(log_buffer + 1)) { 443 start=&log_buffer[0];
441 case '0': 444 lastc='\0';
442 priority = LOG_EMERG; 445 for (i=0; i<n; i++) {
443 break; 446 if (lastc == '\0' && log_buffer[i] == '<') {
444 case '1': 447 priority = 0;
445 priority = LOG_ALERT; 448 i++;
446 break; 449 while (isdigit(log_buffer[i])) {
447 case '2': 450 priority = priority*10+(log_buffer[i]-'0');
448 priority = LOG_CRIT; 451 i++;
449 break; 452 }
450 case '3': 453 if (log_buffer[i] == '>') i++;
451 priority = LOG_ERR; 454 start = &log_buffer[i];
452 break; 455 }
453 case '4': 456 if (log_buffer[i] == '\n') {
454 priority = LOG_WARNING; 457 log_buffer[i] = '\0'; /* zero terminate this message */
455 break; 458 logMessage(LOG_KERN | priority, start);
456 case '5': 459 start = &log_buffer[i+1];
457 priority = LOG_NOTICE;
458 break;
459 case '6':
460 priority = LOG_INFO; 460 priority = LOG_INFO;
461 break;
462 case '7':
463 default:
464 priority = LOG_DEBUG;
465 } 461 }
466 logp += 3; 462 lastc = log_buffer[i];
467 } 463 }
468 logMessage(LOG_KERN | priority, logp);
469 } 464 }
470 465
471} 466}
diff --git a/syslogd.c b/syslogd.c
index fd56aad97..9e174e6e8 100644
--- a/syslogd.c
+++ b/syslogd.c
@@ -403,7 +403,8 @@ static void doKlogd (void)
403{ 403{
404 int priority = LOG_INFO; 404 int priority = LOG_INFO;
405 char log_buffer[4096]; 405 char log_buffer[4096];
406 char *logp; 406 int i, n, lastc;
407 char *start;
407 408
408 /* Set up sig handlers */ 409 /* Set up sig handlers */
409 signal(SIGINT, klogd_signal); 410 signal(SIGINT, klogd_signal);
@@ -420,12 +421,14 @@ static void doKlogd (void)
420 logMessage(0, "klogd started: " 421 logMessage(0, "klogd started: "
421 "BusyBox v" BB_VER " (" BB_BT ")"); 422 "BusyBox v" BB_VER " (" BB_BT ")");
422 423
424 /* "Open the log. Currently a NOP." */
423 klogctl(1, NULL, 0); 425 klogctl(1, NULL, 0);
424 426
425 while (1) { 427 while (1) {
426 /* Use kernel syscalls */ 428 /* Use kernel syscalls */
427 memset(log_buffer, '\0', sizeof(log_buffer)); 429 memset(log_buffer, '\0', sizeof(log_buffer));
428 if (klogctl(2, log_buffer, sizeof(log_buffer)) < 0) { 430 n = klogctl(2, log_buffer, sizeof(log_buffer));
431 if (n < 0) {
429 char message[80]; 432 char message[80];
430 433
431 if (errno == EINTR) 434 if (errno == EINTR)
@@ -435,37 +438,29 @@ static void doKlogd (void)
435 logMessage(LOG_SYSLOG | LOG_ERR, message); 438 logMessage(LOG_SYSLOG | LOG_ERR, message);
436 exit(1); 439 exit(1);
437 } 440 }
438 logp = log_buffer; 441
439 if (*log_buffer == '<') { 442 /* klogctl buffer parsing modelled after code in dmesg.c */
440 switch (*(log_buffer + 1)) { 443 start=&log_buffer[0];
441 case '0': 444 lastc='\0';
442 priority = LOG_EMERG; 445 for (i=0; i<n; i++) {
443 break; 446 if (lastc == '\0' && log_buffer[i] == '<') {
444 case '1': 447 priority = 0;
445 priority = LOG_ALERT; 448 i++;
446 break; 449 while (isdigit(log_buffer[i])) {
447 case '2': 450 priority = priority*10+(log_buffer[i]-'0');
448 priority = LOG_CRIT; 451 i++;
449 break; 452 }
450 case '3': 453 if (log_buffer[i] == '>') i++;
451 priority = LOG_ERR; 454 start = &log_buffer[i];
452 break; 455 }
453 case '4': 456 if (log_buffer[i] == '\n') {
454 priority = LOG_WARNING; 457 log_buffer[i] = '\0'; /* zero terminate this message */
455 break; 458 logMessage(LOG_KERN | priority, start);
456 case '5': 459 start = &log_buffer[i+1];
457 priority = LOG_NOTICE;
458 break;
459 case '6':
460 priority = LOG_INFO; 460 priority = LOG_INFO;
461 break;
462 case '7':
463 default:
464 priority = LOG_DEBUG;
465 } 461 }
466 logp += 3; 462 lastc = log_buffer[i];
467 } 463 }
468 logMessage(LOG_KERN | priority, logp);
469 } 464 }
470 465
471} 466}