damnit.
[oweals/busybox.git] / syslogd.c
index e3f45b62a30fc1621e6d54308bab781fa361316d..24c721f8eb4c9915a8f41025184622ecb70396c7 100644 (file)
--- a/syslogd.c
+++ b/syslogd.c
@@ -57,13 +57,16 @@ static char LocalHostName[32];
 
 static const char syslogd_usage[] =
     "syslogd [OPTION]...\n\n"
-    "Linux system logging utility.\n\n"
+    "Linux system and kernel (provides klogd) logging utility.\n"
+    "Note that this version of syslogd/klogd ignores /etc/syslog.conf.\n\n"
     "Options:\n"
     "\t-m\tChange the mark timestamp interval. default=20min. 0=off\n"
     "\t-n\tDo not fork into the background (for when run by init)\n"
+#ifdef BB_KLOGD
+    "\t-K\tDo not start up the klogd process (by default syslogd spawns klogd).\n"
+#endif
     "\t-O\tSpecify an alternate log file.  default=/var/log/messages\n";
 
-static int kmsg;
 
 /* try to open up the specified device */
 static int device_open(char *device, int mode)
@@ -251,20 +254,19 @@ static void doSyslogd(void)
     close(fd);
 }
 
+#ifdef BB_KLOGD
+
 static void klogd_signal(int sig)
 {
-    //ksyslog(7, NULL, 0);
-    //ksyslog(0, 0, 0);
+    ksyslog(7, NULL, 0);
+    ksyslog(0, 0, 0);
     logMessage(LOG_SYSLOG|LOG_INFO, "Kernel log daemon exiting.");
-    close( kmsg);
     exit( TRUE);
 }
 
-
 static void doKlogd(void)
 {
     int priority=LOG_INFO;
-    struct stat sb;
     char log_buffer[4096];
     char *logp;
 
@@ -277,26 +279,10 @@ static void doKlogd(void)
            "BusyBox v" BB_VER " (" BB_BT ")");
 
     ksyslog(1, NULL, 0);
-    if ( ((stat(_PATH_KLOG, &sb) < 0) && (errno == ENOENT)) ||
-           ( (kmsg = open(_PATH_KLOG, O_RDONLY)) < 0 ) ) {
-       char message[80];
-       snprintf(message, 79, "klogd: Cannot open %s, " \
-               "%d - %s.\n", _PATH_KLOG, errno, strerror(errno));
-       logMessage(LOG_SYSLOG|LOG_ERR, message);
-       klogd_signal(0);
-    }
+
     while (1) {
+       /* Use kernel syscalls */
        memset(log_buffer, '\0', sizeof(log_buffer));
-       if ( read(kmsg, log_buffer, sizeof(log_buffer)-1) < 0 ) {
-           char message[80];
-           if ( errno == EINTR )
-               continue;
-           snprintf(message, 79, "klogd: Cannot read proc file system: %d - %s.\n", 
-                   errno, strerror(errno));
-           logMessage(LOG_SYSLOG|LOG_ERR, message);
-           klogd_signal(0);
-       }
-#if 0
        if ( ksyslog(2, log_buffer, sizeof(log_buffer)) < 0 ) {
            char message[80];
            if ( errno == EINTR )
@@ -306,7 +292,6 @@ static void doKlogd(void)
            logMessage(LOG_SYSLOG|LOG_ERR, message);
            exit(1);
        }
-#endif
        logp=log_buffer;
         if ( *log_buffer == '<' )
         {
@@ -344,11 +329,15 @@ static void doKlogd(void)
 
 }
 
+#endif
 
 extern int syslogd_main(int argc, char **argv)
 {
     int        pid, klogd_pid;
     int doFork = TRUE;
+#ifdef BB_KLOGD
+    int startKlogd = TRUE;
+#endif
     char *p;
     char **argv1=argv;
     
@@ -364,6 +353,11 @@ extern int syslogd_main(int argc, char **argv)
            case 'n':
                doFork = FALSE;
                break;
+#ifdef BB_KLOGD
+           case 'K':
+               startKlogd = FALSE;
+               break;
+#endif
            case 'O':
                if (--argc == 0) {
                    usage(syslogd_usage);
@@ -394,12 +388,16 @@ extern int syslogd_main(int argc, char **argv)
        doSyslogd();
     }
 
+#ifdef BB_KLOGD
     /* Start up the klogd process */
-    klogd_pid = fork();
-    if (klogd_pid == 0 ) {
-           strncpy(argv[0], "klogd", strlen(argv[0]));
-           doKlogd();
+    if (startKlogd == TRUE) {
+       klogd_pid = fork();
+       if (klogd_pid == 0 ) {
+               strncpy(argv[0], "klogd", strlen(argv[0]));
+               doKlogd();
+       }
     }
+#endif
 
     exit( TRUE);
 }