+ if (errno == EINTR)
+ continue;
+ snprintf(message, 79, "klogd: Error return from sys_sycall: " \
+ "%d - %s.\n", errno, strerror(errno));
+ logMessage(LOG_SYSLOG | LOG_ERR, message);
+ exit(1);
+ }
+ logp = log_buffer;
+ if (*log_buffer == '<') {
+ switch (*(log_buffer + 1)) {
+ case '0':
+ priority = LOG_EMERG;
+ break;
+ case '1':
+ priority = LOG_ALERT;
+ break;
+ case '2':
+ priority = LOG_CRIT;
+ break;
+ case '3':
+ priority = LOG_ERR;
+ break;
+ case '4':
+ priority = LOG_WARNING;
+ break;
+ case '5':
+ priority = LOG_NOTICE;
+ break;
+ case '6':
+ priority = LOG_INFO;
+ break;
+ case '7':
+ default:
+ priority = LOG_DEBUG;
+ }
+ logp += 3;
+ }
+ logMessage(LOG_KERN | priority, logp);
+ }
+
+}
+
+#endif
+
+static void daemon_init (char **argv, char *dz, void fn (void))
+{
+ setsid();
+ chdir ("/");
+ strncpy(argv[0], dz, strlen(argv[0]));
+ fn();
+ exit(0);
+}
+
+extern int syslogd_main(int argc, char **argv)
+{
+ int pid, klogd_pid;
+ int doFork = TRUE;
+
+#ifdef BB_FEATURE_KLOGD
+ int startKlogd = TRUE;
+#endif
+ int stopDoingThat = FALSE;
+ char *p;
+ char **argv1 = argv;
+
+ while (--argc > 0 && **(++argv1) == '-') {
+ stopDoingThat = FALSE;
+ while (stopDoingThat == FALSE && *(++(*argv1))) {
+ switch (**argv1) {
+ case 'm':
+ if (--argc == 0) {
+ usage(syslogd_usage);
+ }
+ MarkInterval = atoi(*(++argv1)) * 60;
+ break;
+ case 'n':
+ doFork = FALSE;
+ break;
+#ifdef BB_FEATURE_KLOGD
+ case 'K':
+ startKlogd = FALSE;
+ break;
+#endif
+ case 'O':
+ if (--argc == 0) {
+ usage(syslogd_usage);
+ }
+ logFilePath = *(++argv1);
+ stopDoingThat = TRUE;
+ break;
+ default:
+ usage(syslogd_usage);
+ }
+ }
+ }
+
+ if (argc > 0)
+ usage(syslogd_usage);
+
+ /* Store away localhost's name before the fork */
+ gethostname(LocalHostName, sizeof(LocalHostName));
+ if ((p = strchr(LocalHostName, '.'))) {
+ *p++ = '\0';
+ }
+
+ umask(0);
+
+#ifdef BB_FEATURE_KLOGD
+ /* Start up the klogd process */
+ if (startKlogd == TRUE) {
+ klogd_pid = fork();
+ if (klogd_pid == 0) {
+ daemon_init (argv, "klogd", doKlogd);
+ }
+ }
+#endif
+
+ if (doFork == TRUE) {
+ pid = fork();
+ if (pid < 0)
+ exit(pid);
+ else if (pid == 0) {
+ daemon_init (argv, "syslogd", doSyslogd);
+ }
+ } else {
+ doSyslogd();
+ }
+
+ return(TRUE);
+}