diff options
author | Eric Andersen <andersen@codepoet.org> | 2000-12-11 16:31:11 +0000 |
---|---|---|
committer | Eric Andersen <andersen@codepoet.org> | 2000-12-11 16:31:11 +0000 |
commit | cf7982e908f98e1ab7e90ffb039ed5968589ae24 (patch) | |
tree | b4ca877f6171f659c20284506093bcd0160531e8 /sysklogd/syslogd.c | |
parent | 70d09ed1cf54ae20d38c5c56c5afb5994cc46f32 (diff) | |
download | busybox-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.
Diffstat (limited to 'sysklogd/syslogd.c')
-rw-r--r-- | sysklogd/syslogd.c | 55 |
1 files changed, 25 insertions, 30 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 | } |