X-Git-Url: https://git.librecmc.org/?a=blobdiff_plain;f=sysklogd%2Fklogd.c;h=e4c8a630e6b45e47110f6121cde46cf3231aebd0;hb=1c943eb88af4782f02001ced33f0b07e892bdb22;hp=241a99175fa8f4e1c4c6f81711e1c3f1207f17f3;hpb=e76c3b08e105147e3cef7e8d38d65da2fac6b2e1;p=oweals%2Fbusybox.git diff --git a/sysklogd/klogd.c b/sysklogd/klogd.c index 241a99175..e4c8a630e 100644 --- a/sysklogd/klogd.c +++ b/sysklogd/klogd.c @@ -2,18 +2,17 @@ /* * Mini klogd implementation for busybox * - * Copyright (C) 2001 by Gennady Feldman . + * Copyright (C) 2001 by Gennady Feldman . * Changes: Made this a standalone busybox module which uses standalone * syslog() client interface. * - * Copyright (C) 1999,2000,2001 by Lineo, inc. - * Written by Erik Andersen , + * Copyright (C) 1999-2004 by Erik Andersen * * Copyright (C) 2000 by Karl M. Hegbloom * - * "circular buffer" Copyright (C) 2000 by Gennady Feldman + * "circular buffer" Copyright (C) 2000 by Gennady Feldman * - * Maintainer: Gennady Feldman as of Mar 12, 2001 + * Maintainer: Gennady Feldman as of Mar 12, 2001 * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -33,20 +32,13 @@ #include #include -#include /* for our signal() handlers */ -#include /* strncpy() */ -#include /* errno and friends */ +#include /* for our signal() handlers */ +#include /* strncpy() */ +#include /* errno and friends */ #include #include #include - -#if __GNU_LIBRARY__ < 5 -# ifdef __alpha__ -# define klogctl syslog -# endif -#else -# include -#endif +#include #include "busybox.h" @@ -54,19 +46,21 @@ static void klogd_signal(int sig) { klogctl(7, NULL, 0); klogctl(0, 0, 0); - //logMessage(0, "Kernel log daemon exiting."); - syslog_msg(LOG_DAEMON, 0, "Kernel log daemon exiting."); - exit(TRUE); + /* logMessage(0, "Kernel log daemon exiting."); */ + syslog(LOG_NOTICE, "Kernel log daemon exiting."); + exit(EXIT_SUCCESS); } -static void doKlogd (void) __attribute__ ((noreturn)); -static void doKlogd (void) +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); @@ -76,41 +70,42 @@ static void doKlogd (void) /* "Open the log. Currently a NOP." */ klogctl(1, NULL, 0); - syslog_msg(LOG_DAEMON, 0, "klogd started: BusyBox v" BB_VER " (" BB_BT ")"); + /* Set level of kernel console messaging.. */ + if (console_log_level != -1) + klogctl(8, NULL, console_log_level); + + 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_DAEMON, 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 */ - start=&log_buffer[0]; - lastc='\0'; - for (i=0; i') i++; + if (log_buffer[i] == '>') + i++; start = &log_buffer[i]; } if (log_buffer[i] == '\n') { - log_buffer[i] = '\0'; /* zero terminate this message */ - syslog_msg(LOG_DAEMON, LOG_KERN | priority, start); - start = &log_buffer[i+1]; + log_buffer[i] = '\0'; /* zero terminate this message */ + syslog(priority, "%s", start); + start = &log_buffer[i + 1]; priority = LOG_INFO; } lastc = log_buffer[i]; @@ -118,29 +113,33 @@ static void doKlogd (void) } } +#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 long opt; + char *c_arg; + int console_log_level = -1; /* do normal option parsing */ - while ((opt = getopt(argc, argv, "n")) > 0) { - switch (opt) { - case 'n': - doFork = FALSE; - break; - default: - 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 == TRUE) { + if (!(opt & OPT_FOREGROUND)) { +#if defined(__uClinux__) + vfork_daemon_rexec(0, 1, argc, argv, "-n"); +#else /* __uClinux__ */ if (daemon(0, 1) < 0) - perror_msg_and_die("daemon"); + bb_perror_msg_and_die("daemon"); +#endif /* __uClinux__ */ } - doKlogd(); - + doKlogd(console_log_level); + return EXIT_SUCCESS; }