X-Git-Url: https://git.librecmc.org/?a=blobdiff_plain;f=sysklogd%2Fklogd.c;h=e4c8a630e6b45e47110f6121cde46cf3231aebd0;hb=1c943eb88af4782f02001ced33f0b07e892bdb22;hp=94da61658fa6a1b0c8df851ddc26f30bfefc95f9;hpb=c7bda1ce659294d6e22c06e087f6f265983c7578;p=oweals%2Fbusybox.git diff --git a/sysklogd/klogd.c b/sysklogd/klogd.c index 94da61658..e4c8a630e 100644 --- a/sysklogd/klogd.c +++ b/sysklogd/klogd.c @@ -47,18 +47,20 @@ static void klogd_signal(int sig) klogctl(7, NULL, 0); klogctl(0, 0, 0); /* logMessage(0, "Kernel log daemon exiting."); */ - syslog_msg(LOG_SYSLOG, LOG_NOTICE, "Kernel log daemon exiting."); - exit(TRUE); + syslog(LOG_NOTICE, "Kernel log daemon exiting."); + exit(EXIT_SUCCESS); } -static void doKlogd(const char console_log_level) __attribute__ ((noreturn)); -static void doKlogd(const char console_log_level) +static void doKlogd(const int console_log_level) __attribute__ ((noreturn)); +static void doKlogd(const int console_log_level) { int priority = LOG_INFO; char log_buffer[4096]; int i, n, lastc; char *start; + openlog("kernel", 0, LOG_KERN); + /* Set up sig handlers */ signal(SIGINT, klogd_signal); signal(SIGKILL, klogd_signal); @@ -69,25 +71,20 @@ static void doKlogd(const char console_log_level) klogctl(1, NULL, 0); /* Set level of kernel console messaging.. */ - if (console_log_level) + if (console_log_level != -1) klogctl(8, NULL, console_log_level); - syslog_msg(LOG_SYSLOG, LOG_NOTICE, "klogd started: " BB_BANNER); + syslog(LOG_NOTICE, "klogd started: " BB_BANNER); while (1) { /* Use kernel syscalls */ memset(log_buffer, '\0', sizeof(log_buffer)); n = klogctl(2, log_buffer, sizeof(log_buffer)); if (n < 0) { - char message[80]; - if (errno == EINTR) continue; - snprintf(message, 79, - "klogd: Error return from sys_sycall: %d - %s.\n", errno, - strerror(errno)); - syslog_msg(LOG_SYSLOG, LOG_ERR, message); - exit(1); + syslog(LOG_ERR, "klogd: Error return from sys_sycall: %d - %m.\n", errno); + exit(EXIT_FAILURE); } /* klogctl buffer parsing modelled after code in dmesg.c */ @@ -107,7 +104,7 @@ static void doKlogd(const char console_log_level) } if (log_buffer[i] == '\n') { log_buffer[i] = '\0'; /* zero terminate this message */ - syslog_msg(LOG_KERN, priority, start); + syslog(priority, "%s", start); start = &log_buffer[i + 1]; priority = LOG_INFO; } @@ -116,37 +113,24 @@ static void doKlogd(const char console_log_level) } } +#define OPT_LEVEL 1 +#define OPT_FOREGROUND 2 + extern int klogd_main(int argc, char **argv) { - /* no options, no getopt */ - int opt; - int doFork = TRUE; - unsigned char console_log_level = 7; + unsigned long opt; + char *c_arg; + int console_log_level = -1; /* do normal option parsing */ - while ((opt = getopt(argc, argv, "c:n")) > 0) { - switch (opt) { - case 'c': - if ((optarg == NULL) || (optarg[1] != '\0')) { - bb_show_usage(); - } - /* Valid levels are between 1 and 8 */ - console_log_level = *optarg - '1'; - if (console_log_level > 7) { - bb_show_usage(); - } - console_log_level++; - - break; - case 'n': - doFork = FALSE; - break; - default: - bb_show_usage(); - } + opt = bb_getopt_ulflags (argc, argv, "c:n", &c_arg); + + if (opt & OPT_LEVEL) { + /* Valid levels are between 1 and 8 */ + console_log_level = bb_xgetlarg(c_arg, 10, 1, 8); } - if (doFork) { + if (!(opt & OPT_FOREGROUND)) { #if defined(__uClinux__) vfork_daemon_rexec(0, 1, argc, argv, "-n"); #else /* __uClinux__ */