diff options
Diffstat (limited to 'syslogd.c')
-rw-r--r-- | syslogd.c | 552 |
1 files changed, 279 insertions, 273 deletions
@@ -1,3 +1,4 @@ +/* vi: set sw=4 ts=4: */ /* * Mini syslogd implementation for busybox * @@ -49,266 +50,272 @@ extern int ksyslog(int type, char *buf, int len); #define __LOG_FILE "/var/log/messages" -static char* logFilePath = __LOG_FILE; +static char *logFilePath = __LOG_FILE; + /* interval between marks in seconds */ -static int MarkInterval = 20*60; +static int MarkInterval = 20 * 60; + /* localhost's name */ static char LocalHostName[32]; static const char syslogd_usage[] = - "syslogd [OPTION]...\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" + "syslogd [OPTION]...\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" + "\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"; + "\t-O\tSpecify an alternate log file. default=/var/log/messages\n"; /* print a message to the log file */ static void message(char *fmt, ...) { - int fd; - va_list arguments; - - if ((fd = device_open(logFilePath, O_WRONLY|O_CREAT|O_NOCTTY|O_APPEND|O_NONBLOCK)) >= 0) { - va_start(arguments, fmt); - vdprintf(fd, fmt, arguments); - va_end(arguments); - close(fd); - } else { - /* Always send console messages to /dev/console so people will see them. */ - if ((fd = device_open(_PATH_CONSOLE, O_WRONLY|O_NOCTTY|O_NONBLOCK)) >= 0) { - va_start(arguments, fmt); - vdprintf(fd, fmt, arguments); - va_end(arguments); - close(fd); + int fd; + va_list arguments; + + if ( + (fd = + device_open(logFilePath, + O_WRONLY | O_CREAT | O_NOCTTY | O_APPEND | + O_NONBLOCK)) >= 0) { + va_start(arguments, fmt); + vdprintf(fd, fmt, arguments); + va_end(arguments); + close(fd); } else { - fprintf(stderr, "Bummer, can't print: "); - va_start(arguments, fmt); - vfprintf(stderr, fmt, arguments); - fflush(stderr); - va_end(arguments); + /* Always send console messages to /dev/console so people will see them. */ + if ( + (fd = + device_open(_PATH_CONSOLE, + O_WRONLY | O_NOCTTY | O_NONBLOCK)) >= 0) { + va_start(arguments, fmt); + vdprintf(fd, fmt, arguments); + va_end(arguments); + close(fd); + } else { + fprintf(stderr, "Bummer, can't print: "); + va_start(arguments, fmt); + vfprintf(stderr, fmt, arguments); + fflush(stderr); + va_end(arguments); + } } - } } -static void logMessage( int pri, char* msg) +static void logMessage(int pri, char *msg) { - time_t now; - char *timestamp; - static char res[20]; - CODE *c_pri, *c_fac; - - for (c_fac=facilitynames; c_fac->c_name && !(c_fac->c_val==LOG_FAC(pri)<<3); c_fac++); - for (c_pri=prioritynames; c_pri->c_name && !(c_pri->c_val==LOG_PRI(pri)); c_pri++); - if (*c_fac->c_name=='\0' || *c_pri->c_name=='\0') - snprintf (res, sizeof(res), "<%d>", pri); - else - snprintf (res, sizeof(res), "%s.%s", c_fac->c_name, c_pri->c_name); - - if (strlen(msg) < 16 || msg[3] != ' ' || msg[6] != ' ' || - msg[9] != ':' || msg[12] != ':' || msg[15] != ' ') - { - time(&now); - timestamp = ctime(&now) + 4; - timestamp[15] = '\0'; - } else { - timestamp = msg; - timestamp[15] = '\0'; - msg += 16; - } - - /* todo: supress duplicates */ - - /* now spew out the message to wherever it is supposed to go */ - message( "%s %s %s %s\n", timestamp, LocalHostName, res, msg); + time_t now; + char *timestamp; + static char res[20]; + CODE *c_pri, *c_fac; + + for (c_fac = facilitynames; + c_fac->c_name && !(c_fac->c_val == LOG_FAC(pri) << 3); c_fac++); + for (c_pri = prioritynames; + c_pri->c_name && !(c_pri->c_val == LOG_PRI(pri)); c_pri++); + if (*c_fac->c_name == '\0' || *c_pri->c_name == '\0') + snprintf(res, sizeof(res), "<%d>", pri); + else + snprintf(res, sizeof(res), "%s.%s", c_fac->c_name, c_pri->c_name); + + if (strlen(msg) < 16 || msg[3] != ' ' || msg[6] != ' ' || + msg[9] != ':' || msg[12] != ':' || msg[15] != ' ') { + time(&now); + timestamp = ctime(&now) + 4; + timestamp[15] = '\0'; + } else { + timestamp = msg; + timestamp[15] = '\0'; + msg += 16; + } + + /* todo: supress duplicates */ + + /* now spew out the message to wherever it is supposed to go */ + message("%s %s %s %s\n", timestamp, LocalHostName, res, msg); } static void quit_signal(int sig) { - logMessage(LOG_SYSLOG|LOG_INFO, "System log daemon exiting."); - unlink( _PATH_LOG); - exit( TRUE); + logMessage(LOG_SYSLOG | LOG_INFO, "System log daemon exiting."); + unlink(_PATH_LOG); + exit(TRUE); } static void restart_signal(int sig) { - /* pretend to restart */ - logMessage(LOG_SYSLOG|LOG_INFO, "syslogd restarting"); + /* pretend to restart */ + logMessage(LOG_SYSLOG | LOG_INFO, "syslogd restarting"); } static void domark(int sig) { - if (MarkInterval > 0) { - logMessage(LOG_SYSLOG|LOG_INFO, "-- MARK --"); - alarm(MarkInterval); - } + if (MarkInterval > 0) { + logMessage(LOG_SYSLOG | LOG_INFO, "-- MARK --"); + alarm(MarkInterval); + } } static void doSyslogd(void) { - struct sockaddr_un sunx; - int fd, conn; - size_t addrLength; - char buf[1024]; - char *q, *p = buf; - int readSize; - - /* Set up sig handlers */ - signal(SIGINT, quit_signal); - signal(SIGTERM, quit_signal); - signal(SIGQUIT, quit_signal); - signal(SIGHUP, restart_signal); - signal(SIGALRM, domark); - alarm(MarkInterval); - - /* Remove any preexisting socket/file */ - unlink(_PATH_LOG); - - memset(&sunx, 0, sizeof(sunx)); - sunx.sun_family = AF_UNIX; /* Unix domain socket */ - strncpy(sunx.sun_path, _PATH_LOG, sizeof(sunx.sun_path)); - if ((fd = socket(AF_UNIX, SOCK_STREAM, 0)) < 0 ) { - perror("Couldn't obtain descriptor for socket " _PATH_LOG); - exit( FALSE); - } - - addrLength = sizeof(sunx.sun_family) + strlen(sunx.sun_path); - if ( (bind(fd, (struct sockaddr *) &sunx, addrLength)) || - (listen(fd, 5)) ) - { - perror("Could not connect to socket " _PATH_LOG); - exit( FALSE); - } - - umask(0); - if (chmod(_PATH_LOG, 0666) < 0) { - perror("Could not set permission on " _PATH_LOG); - exit (FALSE); - } - - logMessage(LOG_SYSLOG|LOG_INFO, "syslogd started: " - "BusyBox v" BB_VER " (" BB_BT ")"); - - - while ((conn = accept(fd, (struct sockaddr *) &sunx, - &addrLength)) >= 0) - { - while ((readSize=read(conn, buf, sizeof(buf))) > 0) - { - char line[1025]; - unsigned char c; - int pri = (LOG_USER|LOG_NOTICE); - - memset (line, 0, sizeof(line)); - p = buf; - q = line; - while ( p && (c = *p) && q < &line[sizeof(line) - 1]) { - if (c == '<') { - /* Parse the magic priority number */ - pri = 0; - while (isdigit(*(++p))) { - pri = 10 * pri + (*p - '0'); - } - if (pri &~ (LOG_FACMASK|LOG_PRIMASK)) - pri = (LOG_USER|LOG_NOTICE); - } else if (c == '\n') { - *q++ = ' '; - } else if (iscntrl(c)&&(c<0177)) { - *q++ = '^'; - *q++ = c ^ 0100; - } else { - *q++ = c; - } - p++; - } - *q = '\0'; + struct sockaddr_un sunx; + int fd, conn; + size_t addrLength; + char buf[1024]; + char *q, *p = buf; + int readSize; + + /* Set up sig handlers */ + signal(SIGINT, quit_signal); + signal(SIGTERM, quit_signal); + signal(SIGQUIT, quit_signal); + signal(SIGHUP, restart_signal); + signal(SIGALRM, domark); + alarm(MarkInterval); + + /* Remove any preexisting socket/file */ + unlink(_PATH_LOG); + + memset(&sunx, 0, sizeof(sunx)); + sunx.sun_family = AF_UNIX; /* Unix domain socket */ + strncpy(sunx.sun_path, _PATH_LOG, sizeof(sunx.sun_path)); + if ((fd = socket(AF_UNIX, SOCK_STREAM, 0)) < 0) { + perror("Couldn't obtain descriptor for socket " _PATH_LOG); + exit(FALSE); + } - /* Now log it */ - logMessage( pri, line); + addrLength = sizeof(sunx.sun_family) + strlen(sunx.sun_path); + if ((bind(fd, (struct sockaddr *) &sunx, addrLength)) || + (listen(fd, 5))) { + perror("Could not connect to socket " _PATH_LOG); + exit(FALSE); } - close(conn); - } - close(fd); + umask(0); + if (chmod(_PATH_LOG, 0666) < 0) { + perror("Could not set permission on " _PATH_LOG); + exit(FALSE); + } + + logMessage(LOG_SYSLOG | LOG_INFO, "syslogd started: " + "BusyBox v" BB_VER " (" BB_BT ")"); + + + while ((conn = accept(fd, (struct sockaddr *) &sunx, + &addrLength)) >= 0) { + while ((readSize = read(conn, buf, sizeof(buf))) > 0) { + char line[1025]; + unsigned char c; + int pri = (LOG_USER | LOG_NOTICE); + + memset(line, 0, sizeof(line)); + p = buf; + q = line; + while (p && (c = *p) && q < &line[sizeof(line) - 1]) { + if (c == '<') { + /* Parse the magic priority number */ + pri = 0; + while (isdigit(*(++p))) { + pri = 10 * pri + (*p - '0'); + } + if (pri & ~(LOG_FACMASK | LOG_PRIMASK)) + pri = (LOG_USER | LOG_NOTICE); + } else if (c == '\n') { + *q++ = ' '; + } else if (iscntrl(c) && (c < 0177)) { + *q++ = '^'; + *q++ = c ^ 0100; + } else { + *q++ = c; + } + p++; + } + *q = '\0'; + + /* Now log it */ + logMessage(pri, line); + } + close(conn); + } + + close(fd); } #ifdef BB_KLOGD static void klogd_signal(int sig) { - ksyslog(7, NULL, 0); - ksyslog(0, 0, 0); - logMessage(LOG_SYSLOG|LOG_INFO, "Kernel log daemon exiting."); - exit( TRUE); + ksyslog(7, NULL, 0); + ksyslog(0, 0, 0); + logMessage(LOG_SYSLOG | LOG_INFO, "Kernel log daemon exiting."); + exit(TRUE); } static void doKlogd(void) { - int priority=LOG_INFO; - char log_buffer[4096]; - char *logp; - - /* Set up sig handlers */ - signal(SIGINT, klogd_signal); - signal(SIGKILL, klogd_signal); - signal(SIGTERM, klogd_signal); - signal(SIGHUP, klogd_signal); - logMessage(LOG_SYSLOG|LOG_INFO, "klogd started: " - "BusyBox v" BB_VER " (" BB_BT ")"); - - ksyslog(1, NULL, 0); - - while (1) { - /* Use kernel syscalls */ - memset(log_buffer, '\0', sizeof(log_buffer)); - if ( ksyslog(2, log_buffer, sizeof(log_buffer)) < 0 ) { - char message[80]; - 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); + int priority = LOG_INFO; + char log_buffer[4096]; + char *logp; + + /* Set up sig handlers */ + signal(SIGINT, klogd_signal); + signal(SIGKILL, klogd_signal); + signal(SIGTERM, klogd_signal); + signal(SIGHUP, klogd_signal); + logMessage(LOG_SYSLOG | LOG_INFO, "klogd started: " + "BusyBox v" BB_VER " (" BB_BT ")"); + + ksyslog(1, NULL, 0); + + while (1) { + /* Use kernel syscalls */ + memset(log_buffer, '\0', sizeof(log_buffer)); + if (ksyslog(2, log_buffer, sizeof(log_buffer)) < 0) { + char message[80]; + + 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); } - 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); - } } @@ -316,76 +323,75 @@ static void doKlogd(void) extern int syslogd_main(int argc, char **argv) { - int pid, klogd_pid; - int doFork = TRUE; + int pid, klogd_pid; + int doFork = TRUE; + #ifdef BB_KLOGD - int startKlogd = TRUE; + 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; + 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_KLOGD - case 'K': - startKlogd = FALSE; - break; + case 'K': + startKlogd = FALSE; + break; #endif - case 'O': - if (--argc == 0) { - usage(syslogd_usage); + case 'O': + if (--argc == 0) { + usage(syslogd_usage); + } + logFilePath = *(++argv1); + stopDoingThat = TRUE; + break; + default: + usage(syslogd_usage); + } } - logFilePath = *(++argv1); - stopDoingThat = TRUE; - break; - default: - usage(syslogd_usage); - } } - } - - /* Store away localhost's name before the fork */ - gethostname(LocalHostName, sizeof(LocalHostName)); - if ( (p = strchr(LocalHostName, '.')) ) { - *p++ = '\0'; - } - - if (doFork == TRUE) { - pid = fork(); - if ( pid < 0 ) - exit( pid); - else if ( pid == 0 ) { - strncpy(argv[0], "syslogd",strlen(argv[0])); - doSyslogd(); + + /* Store away localhost's name before the fork */ + gethostname(LocalHostName, sizeof(LocalHostName)); + if ((p = strchr(LocalHostName, '.'))) { + *p++ = '\0'; + } + + if (doFork == TRUE) { + pid = fork(); + if (pid < 0) + exit(pid); + else if (pid == 0) { + strncpy(argv[0], "syslogd", strlen(argv[0])); + doSyslogd(); + } + } else { + doSyslogd(); } - } else { - doSyslogd(); - } #ifdef BB_KLOGD - /* Start up the klogd process */ - if (startKlogd == TRUE) { - klogd_pid = fork(); - if (klogd_pid == 0 ) { - strncpy(argv[0], "klogd", strlen(argv[0])); - doKlogd(); + /* Start up the klogd process */ + if (startKlogd == TRUE) { + klogd_pid = fork(); + if (klogd_pid == 0) { + strncpy(argv[0], "klogd", strlen(argv[0])); + doKlogd(); + } } - } #endif - exit( TRUE); + exit(TRUE); } - - |