diff options
| author | Erik Andersen <andersen@codepoet.org> | 2000-02-08 19:58:47 +0000 |
|---|---|---|
| committer | Erik Andersen <andersen@codepoet.org> | 2000-02-08 19:58:47 +0000 |
| commit | e49d5ecbbe51718fa925b6890a735e5937cc2aa2 (patch) | |
| tree | c90bda10731ad9333ce3b404f993354c9fc104b8 /sysklogd | |
| parent | c0bf817bbc5c7867fbe8fb76d5c39f8ee802692f (diff) | |
| download | busybox-w32-e49d5ecbbe51718fa925b6890a735e5937cc2aa2.tar.gz busybox-w32-e49d5ecbbe51718fa925b6890a735e5937cc2aa2.tar.bz2 busybox-w32-e49d5ecbbe51718fa925b6890a735e5937cc2aa2.zip | |
Some formatting updates (ran the code through indent)
-Erik
Diffstat (limited to 'sysklogd')
| -rw-r--r-- | sysklogd/logger.c | 191 | ||||
| -rw-r--r-- | sysklogd/syslogd.c | 552 |
2 files changed, 374 insertions, 369 deletions
diff --git a/sysklogd/logger.c b/sysklogd/logger.c index aab95b984..a9e0afcc8 100644 --- a/sysklogd/logger.c +++ b/sysklogd/logger.c | |||
| @@ -1,3 +1,4 @@ | |||
| 1 | /* vi: set sw=4 ts=4: */ | ||
| 1 | /* | 2 | /* |
| 2 | * Mini logger implementation for busybox | 3 | * Mini logger implementation for busybox |
| 3 | * | 4 | * |
| @@ -39,21 +40,22 @@ | |||
| 39 | */ | 40 | */ |
| 40 | #include <sys/syslog.h> | 41 | #include <sys/syslog.h> |
| 41 | typedef struct _code { | 42 | typedef struct _code { |
| 42 | char *c_name; | 43 | char *c_name; |
| 43 | int c_val; | 44 | int c_val; |
| 44 | } CODE; | 45 | } CODE; |
| 45 | extern CODE prioritynames[]; | 46 | extern CODE prioritynames[]; |
| 46 | extern CODE facilitynames[]; | 47 | extern CODE facilitynames[]; |
| 47 | #endif | 48 | #endif |
| 48 | 49 | ||
| 49 | static const char logger_usage[] = | 50 | static const char logger_usage[] = |
| 50 | "logger [OPTION]... [MESSAGE]\n\n" | 51 | "logger [OPTION]... [MESSAGE]\n\n" |
| 51 | "Write MESSAGE to the system log. If MESSAGE is '-', log stdin.\n\n" | 52 | "Write MESSAGE to the system log. If MESSAGE is '-', log stdin.\n\n" |
| 52 | "Options:\n" | 53 | "Options:\n" |
| 53 | "\t-s\tLog to stderr as well as the system log.\n" | 54 | "\t-s\tLog to stderr as well as the system log.\n" |
| 54 | "\t-t\tLog using the specified tag (defaults to user name).\n" | 55 | "\t-t\tLog using the specified tag (defaults to user name).\n" |
| 55 | "\t-p\tEnter the message with the specified priority.\n" | 56 | |
| 56 | "\t\tThis may be numerical or a ``facility.level'' pair.\n"; | 57 | "\t-p\tEnter the message with the specified priority.\n" |
| 58 | "\t\tThis may be numerical or a ``facility.level'' pair.\n"; | ||
| 57 | 59 | ||
| 58 | 60 | ||
| 59 | /* Decode a symbolic name to a numeric value | 61 | /* Decode a symbolic name to a numeric value |
| @@ -61,20 +63,19 @@ static const char logger_usage[] = | |||
| 61 | * Copyright (c) 1983, 1993 | 63 | * Copyright (c) 1983, 1993 |
| 62 | * The Regents of the University of California. All rights reserved. | 64 | * The Regents of the University of California. All rights reserved. |
| 63 | */ | 65 | */ |
| 64 | static int | 66 | static int decode(char *name, CODE * codetab) |
| 65 | decode(char* name, CODE* codetab) | ||
| 66 | { | 67 | { |
| 67 | CODE *c; | 68 | CODE *c; |
| 68 | 69 | ||
| 69 | if (isdigit(*name)) | 70 | if (isdigit(*name)) |
| 70 | return (atoi(name)); | 71 | return (atoi(name)); |
| 71 | for (c = codetab; c->c_name; c++) { | 72 | for (c = codetab; c->c_name; c++) { |
| 72 | if (!strcasecmp(name, c->c_name)) { | 73 | if (!strcasecmp(name, c->c_name)) { |
| 73 | return (c->c_val); | 74 | return (c->c_val); |
| 75 | } | ||
| 74 | } | 76 | } |
| 75 | } | ||
| 76 | 77 | ||
| 77 | return (-1); | 78 | return (-1); |
| 78 | } | 79 | } |
| 79 | 80 | ||
| 80 | /* Decode a symbolic name to a numeric value | 81 | /* Decode a symbolic name to a numeric value |
| @@ -82,96 +83,94 @@ decode(char* name, CODE* codetab) | |||
| 82 | * Copyright (c) 1983, 1993 | 83 | * Copyright (c) 1983, 1993 |
| 83 | * The Regents of the University of California. All rights reserved. | 84 | * The Regents of the University of California. All rights reserved. |
| 84 | */ | 85 | */ |
| 85 | static int | 86 | static int pencode(char *s) |
| 86 | pencode(char* s) | ||
| 87 | { | 87 | { |
| 88 | char *save; | 88 | char *save; |
| 89 | int lev, fac=LOG_USER; | 89 | int lev, fac = LOG_USER; |
| 90 | 90 | ||
| 91 | for (save = s; *s && *s != '.'; ++s); | 91 | for (save = s; *s && *s != '.'; ++s); |
| 92 | if (*s) { | 92 | if (*s) { |
| 93 | *s = '\0'; | 93 | *s = '\0'; |
| 94 | fac = decode(save, facilitynames); | 94 | fac = decode(save, facilitynames); |
| 95 | if (fac < 0) { | 95 | if (fac < 0) { |
| 96 | fprintf(stderr, "unknown facility name: %s\n", save); | 96 | fprintf(stderr, "unknown facility name: %s\n", save); |
| 97 | exit( FALSE); | 97 | exit(FALSE); |
| 98 | } | ||
| 99 | *s++ = '.'; | ||
| 100 | } else { | ||
| 101 | s = save; | ||
| 102 | } | ||
| 103 | lev = decode(s, prioritynames); | ||
| 104 | if (lev < 0) { | ||
| 105 | fprintf(stderr, "unknown priority name: %s\n", save); | ||
| 106 | exit(FALSE); | ||
| 98 | } | 107 | } |
| 99 | *s++ = '.'; | 108 | return ((lev & LOG_PRIMASK) | (fac & LOG_FACMASK)); |
| 100 | } | ||
| 101 | else { | ||
| 102 | s = save; | ||
| 103 | } | ||
| 104 | lev = decode(s, prioritynames); | ||
| 105 | if (lev < 0) { | ||
| 106 | fprintf(stderr, "unknown priority name: %s\n", save); | ||
| 107 | exit( FALSE); | ||
| 108 | } | ||
| 109 | return ((lev & LOG_PRIMASK) | (fac & LOG_FACMASK)); | ||
| 110 | } | 109 | } |
| 111 | 110 | ||
| 112 | 111 | ||
| 113 | extern int logger_main(int argc, char **argv) | 112 | extern int logger_main(int argc, char **argv) |
| 114 | { | 113 | { |
| 115 | int pri = LOG_USER|LOG_NOTICE; | 114 | int pri = LOG_USER | LOG_NOTICE; |
| 116 | int option = 0; | 115 | int option = 0; |
| 117 | int fromStdinFlag=FALSE; | 116 | int fromStdinFlag = FALSE; |
| 118 | int stopLookingAtMeLikeThat=FALSE; | 117 | int stopLookingAtMeLikeThat = FALSE; |
| 119 | char *message, buf[1024], name[128]; | 118 | char *message, buf[1024], name[128]; |
| 120 | 119 | ||
| 121 | /* Fill out the name string early (may be overwritten later */ | 120 | /* Fill out the name string early (may be overwritten later */ |
| 122 | my_getpwuid(name, geteuid()); | 121 | my_getpwuid(name, geteuid()); |
| 123 | 122 | ||
| 124 | /* Parse any options */ | 123 | /* Parse any options */ |
| 125 | while (--argc > 0 && **(++argv) == '-') { | 124 | while (--argc > 0 && **(++argv) == '-') { |
| 126 | if (*((*argv)+1) == '\0') { | 125 | if (*((*argv) + 1) == '\0') { |
| 127 | fromStdinFlag=TRUE; | 126 | fromStdinFlag = TRUE; |
| 128 | } | ||
| 129 | stopLookingAtMeLikeThat=FALSE; | ||
| 130 | while (*(++(*argv)) && stopLookingAtMeLikeThat==FALSE) { | ||
| 131 | switch (**argv) { | ||
| 132 | case 's': | ||
| 133 | option |= LOG_PERROR; | ||
| 134 | break; | ||
| 135 | case 'p': | ||
| 136 | if (--argc == 0) { | ||
| 137 | usage(logger_usage); | ||
| 138 | } | 127 | } |
| 139 | pri = pencode(*(++argv)); | 128 | stopLookingAtMeLikeThat = FALSE; |
| 140 | stopLookingAtMeLikeThat=TRUE; | 129 | while (*(++(*argv)) && stopLookingAtMeLikeThat == FALSE) { |
| 141 | break; | 130 | switch (**argv) { |
| 142 | case 't': | 131 | case 's': |
| 143 | if (--argc == 0) { | 132 | option |= LOG_PERROR; |
| 144 | usage(logger_usage); | 133 | break; |
| 134 | case 'p': | ||
| 135 | if (--argc == 0) { | ||
| 136 | usage(logger_usage); | ||
| 137 | } | ||
| 138 | pri = pencode(*(++argv)); | ||
| 139 | stopLookingAtMeLikeThat = TRUE; | ||
| 140 | break; | ||
| 141 | case 't': | ||
| 142 | if (--argc == 0) { | ||
| 143 | usage(logger_usage); | ||
| 144 | } | ||
| 145 | strncpy(name, *(++argv), sizeof(name)); | ||
| 146 | stopLookingAtMeLikeThat = TRUE; | ||
| 147 | break; | ||
| 148 | default: | ||
| 149 | usage(logger_usage); | ||
| 150 | } | ||
| 145 | } | 151 | } |
| 146 | strncpy(name, *(++argv), sizeof(name)); | ||
| 147 | stopLookingAtMeLikeThat=TRUE; | ||
| 148 | break; | ||
| 149 | default: | ||
| 150 | usage(logger_usage); | ||
| 151 | } | ||
| 152 | } | 152 | } |
| 153 | } | ||
| 154 | 153 | ||
| 155 | if (fromStdinFlag==TRUE) { | 154 | if (fromStdinFlag == TRUE) { |
| 156 | /* read from stdin */ | 155 | /* read from stdin */ |
| 157 | int c, i=0; | 156 | int c, i = 0; |
| 158 | while ((c = getc(stdin)) != EOF && i<sizeof(buf)) { | 157 | |
| 159 | buf[i++]=c; | 158 | while ((c = getc(stdin)) != EOF && i < sizeof(buf)) { |
| 160 | } | 159 | buf[i++] = c; |
| 161 | message=buf; | 160 | } |
| 162 | } else { | 161 | message = buf; |
| 163 | if (argc>=1) { | ||
| 164 | message = *argv; | ||
| 165 | } else { | 162 | } else { |
| 166 | fprintf(stderr, "No message\n"); | 163 | if (argc >= 1) { |
| 167 | exit( FALSE); | 164 | message = *argv; |
| 165 | } else { | ||
| 166 | fprintf(stderr, "No message\n"); | ||
| 167 | exit(FALSE); | ||
| 168 | } | ||
| 168 | } | 169 | } |
| 169 | } | ||
| 170 | 170 | ||
| 171 | openlog( name, option, (pri | LOG_FACMASK)); | 171 | openlog(name, option, (pri | LOG_FACMASK)); |
| 172 | syslog( pri, message); | 172 | syslog(pri, message); |
| 173 | closelog(); | 173 | closelog(); |
| 174 | 174 | ||
| 175 | exit( TRUE); | 175 | exit(TRUE); |
| 176 | } | 176 | } |
| 177 | |||
diff --git a/sysklogd/syslogd.c b/sysklogd/syslogd.c index c48d5a435..db535044c 100644 --- a/sysklogd/syslogd.c +++ b/sysklogd/syslogd.c | |||
| @@ -1,3 +1,4 @@ | |||
| 1 | /* vi: set sw=4 ts=4: */ | ||
| 1 | /* | 2 | /* |
| 2 | * Mini syslogd implementation for busybox | 3 | * Mini syslogd implementation for busybox |
| 3 | * | 4 | * |
| @@ -49,266 +50,272 @@ extern int ksyslog(int type, char *buf, int len); | |||
| 49 | #define __LOG_FILE "/var/log/messages" | 50 | #define __LOG_FILE "/var/log/messages" |
| 50 | 51 | ||
| 51 | 52 | ||
| 52 | static char* logFilePath = __LOG_FILE; | 53 | static char *logFilePath = __LOG_FILE; |
| 54 | |||
| 53 | /* interval between marks in seconds */ | 55 | /* interval between marks in seconds */ |
| 54 | static int MarkInterval = 20*60; | 56 | static int MarkInterval = 20 * 60; |
| 57 | |||
| 55 | /* localhost's name */ | 58 | /* localhost's name */ |
| 56 | static char LocalHostName[32]; | 59 | static char LocalHostName[32]; |
| 57 | 60 | ||
| 58 | static const char syslogd_usage[] = | 61 | static const char syslogd_usage[] = |
| 59 | "syslogd [OPTION]...\n\n" | 62 | "syslogd [OPTION]...\n\n" |
| 60 | "Linux system and kernel (provides klogd) logging utility.\n" | 63 | "Linux system and kernel (provides klogd) logging utility.\n" |
| 61 | "Note that this version of syslogd/klogd ignores /etc/syslog.conf.\n\n" | 64 | "Note that this version of syslogd/klogd ignores /etc/syslog.conf.\n\n" |
| 62 | "Options:\n" | 65 | "Options:\n" |
| 63 | "\t-m\tChange the mark timestamp interval. default=20min. 0=off\n" | 66 | "\t-m\tChange the mark timestamp interval. default=20min. 0=off\n" |
| 64 | "\t-n\tDo not fork into the background (for when run by init)\n" | 67 | "\t-n\tDo not fork into the background (for when run by init)\n" |
| 65 | #ifdef BB_KLOGD | 68 | #ifdef BB_KLOGD |
| 66 | "\t-K\tDo not start up the klogd process (by default syslogd spawns klogd).\n" | 69 | "\t-K\tDo not start up the klogd process (by default syslogd spawns klogd).\n" |
| 67 | #endif | 70 | #endif |
| 68 | "\t-O\tSpecify an alternate log file. default=/var/log/messages\n"; | 71 | "\t-O\tSpecify an alternate log file. default=/var/log/messages\n"; |
| 69 | 72 | ||
| 70 | 73 | ||
| 71 | /* print a message to the log file */ | 74 | /* print a message to the log file */ |
| 72 | static void message(char *fmt, ...) | 75 | static void message(char *fmt, ...) |
| 73 | { | 76 | { |
| 74 | int fd; | 77 | int fd; |
| 75 | va_list arguments; | 78 | va_list arguments; |
| 76 | 79 | ||
| 77 | if ((fd = device_open(logFilePath, O_WRONLY|O_CREAT|O_NOCTTY|O_APPEND|O_NONBLOCK)) >= 0) { | 80 | if ( |
| 78 | va_start(arguments, fmt); | 81 | (fd = |
| 79 | vdprintf(fd, fmt, arguments); | 82 | device_open(logFilePath, |
| 80 | va_end(arguments); | 83 | O_WRONLY | O_CREAT | O_NOCTTY | O_APPEND | |
| 81 | close(fd); | 84 | O_NONBLOCK)) >= 0) { |
| 82 | } else { | 85 | va_start(arguments, fmt); |
| 83 | /* Always send console messages to /dev/console so people will see them. */ | 86 | vdprintf(fd, fmt, arguments); |
| 84 | if ((fd = device_open(_PATH_CONSOLE, O_WRONLY|O_NOCTTY|O_NONBLOCK)) >= 0) { | 87 | va_end(arguments); |
| 85 | va_start(arguments, fmt); | 88 | close(fd); |
| 86 | vdprintf(fd, fmt, arguments); | ||
| 87 | va_end(arguments); | ||
| 88 | close(fd); | ||
| 89 | } else { | 89 | } else { |
| 90 | fprintf(stderr, "Bummer, can't print: "); | 90 | /* Always send console messages to /dev/console so people will see them. */ |
| 91 | va_start(arguments, fmt); | 91 | if ( |
| 92 | vfprintf(stderr, fmt, arguments); | 92 | (fd = |
| 93 | fflush(stderr); | 93 | device_open(_PATH_CONSOLE, |
| 94 | va_end(arguments); | 94 | O_WRONLY | O_NOCTTY | O_NONBLOCK)) >= 0) { |
| 95 | va_start(arguments, fmt); | ||
| 96 | vdprintf(fd, fmt, arguments); | ||
| 97 | va_end(arguments); | ||
| 98 | close(fd); | ||
| 99 | } else { | ||
| 100 | fprintf(stderr, "Bummer, can't print: "); | ||
| 101 | va_start(arguments, fmt); | ||
| 102 | vfprintf(stderr, fmt, arguments); | ||
| 103 | fflush(stderr); | ||
| 104 | va_end(arguments); | ||
| 105 | } | ||
| 95 | } | 106 | } |
| 96 | } | ||
| 97 | } | 107 | } |
| 98 | 108 | ||
| 99 | static void logMessage( int pri, char* msg) | 109 | static void logMessage(int pri, char *msg) |
| 100 | { | 110 | { |
| 101 | time_t now; | 111 | time_t now; |
| 102 | char *timestamp; | 112 | char *timestamp; |
| 103 | static char res[20]; | 113 | static char res[20]; |
| 104 | CODE *c_pri, *c_fac; | 114 | CODE *c_pri, *c_fac; |
| 105 | 115 | ||
| 106 | for (c_fac=facilitynames; c_fac->c_name && !(c_fac->c_val==LOG_FAC(pri)<<3); c_fac++); | 116 | for (c_fac = facilitynames; |
| 107 | for (c_pri=prioritynames; c_pri->c_name && !(c_pri->c_val==LOG_PRI(pri)); c_pri++); | 117 | c_fac->c_name && !(c_fac->c_val == LOG_FAC(pri) << 3); c_fac++); |
| 108 | if (*c_fac->c_name=='\0' || *c_pri->c_name=='\0') | 118 | for (c_pri = prioritynames; |
| 109 | snprintf (res, sizeof(res), "<%d>", pri); | 119 | c_pri->c_name && !(c_pri->c_val == LOG_PRI(pri)); c_pri++); |
| 110 | else | 120 | if (*c_fac->c_name == '\0' || *c_pri->c_name == '\0') |
| 111 | snprintf (res, sizeof(res), "%s.%s", c_fac->c_name, c_pri->c_name); | 121 | snprintf(res, sizeof(res), "<%d>", pri); |
| 112 | 122 | else | |
| 113 | if (strlen(msg) < 16 || msg[3] != ' ' || msg[6] != ' ' || | 123 | snprintf(res, sizeof(res), "%s.%s", c_fac->c_name, c_pri->c_name); |
| 114 | msg[9] != ':' || msg[12] != ':' || msg[15] != ' ') | 124 | |
| 115 | { | 125 | if (strlen(msg) < 16 || msg[3] != ' ' || msg[6] != ' ' || |
| 116 | time(&now); | 126 | msg[9] != ':' || msg[12] != ':' || msg[15] != ' ') { |
| 117 | timestamp = ctime(&now) + 4; | 127 | time(&now); |
| 118 | timestamp[15] = '\0'; | 128 | timestamp = ctime(&now) + 4; |
| 119 | } else { | 129 | timestamp[15] = '\0'; |
| 120 | timestamp = msg; | 130 | } else { |
| 121 | timestamp[15] = '\0'; | 131 | timestamp = msg; |
| 122 | msg += 16; | 132 | timestamp[15] = '\0'; |
| 123 | } | 133 | msg += 16; |
| 124 | 134 | } | |
| 125 | /* todo: supress duplicates */ | 135 | |
| 126 | 136 | /* todo: supress duplicates */ | |
| 127 | /* now spew out the message to wherever it is supposed to go */ | 137 | |
| 128 | message( "%s %s %s %s\n", timestamp, LocalHostName, res, msg); | 138 | /* now spew out the message to wherever it is supposed to go */ |
| 139 | message("%s %s %s %s\n", timestamp, LocalHostName, res, msg); | ||
| 129 | } | 140 | } |
| 130 | 141 | ||
| 131 | static void quit_signal(int sig) | 142 | static void quit_signal(int sig) |
| 132 | { | 143 | { |
| 133 | logMessage(LOG_SYSLOG|LOG_INFO, "System log daemon exiting."); | 144 | logMessage(LOG_SYSLOG | LOG_INFO, "System log daemon exiting."); |
| 134 | unlink( _PATH_LOG); | 145 | unlink(_PATH_LOG); |
| 135 | exit( TRUE); | 146 | exit(TRUE); |
| 136 | } | 147 | } |
| 137 | 148 | ||
| 138 | static void restart_signal(int sig) | 149 | static void restart_signal(int sig) |
| 139 | { | 150 | { |
| 140 | /* pretend to restart */ | 151 | /* pretend to restart */ |
| 141 | logMessage(LOG_SYSLOG|LOG_INFO, "syslogd restarting"); | 152 | logMessage(LOG_SYSLOG | LOG_INFO, "syslogd restarting"); |
| 142 | } | 153 | } |
| 143 | 154 | ||
| 144 | static void domark(int sig) | 155 | static void domark(int sig) |
| 145 | { | 156 | { |
| 146 | if (MarkInterval > 0) { | 157 | if (MarkInterval > 0) { |
| 147 | logMessage(LOG_SYSLOG|LOG_INFO, "-- MARK --"); | 158 | logMessage(LOG_SYSLOG | LOG_INFO, "-- MARK --"); |
| 148 | alarm(MarkInterval); | 159 | alarm(MarkInterval); |
| 149 | } | 160 | } |
| 150 | } | 161 | } |
| 151 | 162 | ||
| 152 | static void doSyslogd(void) | 163 | static void doSyslogd(void) |
| 153 | { | 164 | { |
| 154 | struct sockaddr_un sunx; | 165 | struct sockaddr_un sunx; |
| 155 | int fd, conn; | 166 | int fd, conn; |
| 156 | size_t addrLength; | 167 | size_t addrLength; |
| 157 | char buf[1024]; | 168 | char buf[1024]; |
| 158 | char *q, *p = buf; | 169 | char *q, *p = buf; |
| 159 | int readSize; | 170 | int readSize; |
| 160 | 171 | ||
| 161 | /* Set up sig handlers */ | 172 | /* Set up sig handlers */ |
| 162 | signal(SIGINT, quit_signal); | 173 | signal(SIGINT, quit_signal); |
| 163 | signal(SIGTERM, quit_signal); | 174 | signal(SIGTERM, quit_signal); |
| 164 | signal(SIGQUIT, quit_signal); | 175 | signal(SIGQUIT, quit_signal); |
| 165 | signal(SIGHUP, restart_signal); | 176 | signal(SIGHUP, restart_signal); |
| 166 | signal(SIGALRM, domark); | 177 | signal(SIGALRM, domark); |
| 167 | alarm(MarkInterval); | 178 | alarm(MarkInterval); |
| 168 | 179 | ||
| 169 | /* Remove any preexisting socket/file */ | 180 | /* Remove any preexisting socket/file */ |
| 170 | unlink(_PATH_LOG); | 181 | unlink(_PATH_LOG); |
| 171 | 182 | ||
| 172 | memset(&sunx, 0, sizeof(sunx)); | 183 | memset(&sunx, 0, sizeof(sunx)); |
| 173 | sunx.sun_family = AF_UNIX; /* Unix domain socket */ | 184 | sunx.sun_family = AF_UNIX; /* Unix domain socket */ |
| 174 | strncpy(sunx.sun_path, _PATH_LOG, sizeof(sunx.sun_path)); | 185 | strncpy(sunx.sun_path, _PATH_LOG, sizeof(sunx.sun_path)); |
| 175 | if ((fd = socket(AF_UNIX, SOCK_STREAM, 0)) < 0 ) { | 186 | if ((fd = socket(AF_UNIX, SOCK_STREAM, 0)) < 0) { |
| 176 | perror("Couldn't obtain descriptor for socket " _PATH_LOG); | 187 | perror("Couldn't obtain descriptor for socket " _PATH_LOG); |
| 177 | exit( FALSE); | 188 | exit(FALSE); |
| 178 | } | 189 | } |
| 179 | |||
| 180 | addrLength = sizeof(sunx.sun_family) + strlen(sunx.sun_path); | ||
| 181 | if ( (bind(fd, (struct sockaddr *) &sunx, addrLength)) || | ||
| 182 | (listen(fd, 5)) ) | ||
| 183 | { | ||
| 184 | perror("Could not connect to socket " _PATH_LOG); | ||
| 185 | exit( FALSE); | ||
| 186 | } | ||
| 187 | |||
| 188 | umask(0); | ||
| 189 | if (chmod(_PATH_LOG, 0666) < 0) { | ||
| 190 | perror("Could not set permission on " _PATH_LOG); | ||
| 191 | exit (FALSE); | ||
| 192 | } | ||
| 193 | |||
| 194 | logMessage(LOG_SYSLOG|LOG_INFO, "syslogd started: " | ||
| 195 | "BusyBox v" BB_VER " (" BB_BT ")"); | ||
| 196 | |||
| 197 | |||
| 198 | while ((conn = accept(fd, (struct sockaddr *) &sunx, | ||
| 199 | &addrLength)) >= 0) | ||
| 200 | { | ||
| 201 | while ((readSize=read(conn, buf, sizeof(buf))) > 0) | ||
| 202 | { | ||
| 203 | char line[1025]; | ||
| 204 | unsigned char c; | ||
| 205 | int pri = (LOG_USER|LOG_NOTICE); | ||
| 206 | |||
| 207 | memset (line, 0, sizeof(line)); | ||
| 208 | p = buf; | ||
| 209 | q = line; | ||
| 210 | while ( p && (c = *p) && q < &line[sizeof(line) - 1]) { | ||
| 211 | if (c == '<') { | ||
| 212 | /* Parse the magic priority number */ | ||
| 213 | pri = 0; | ||
| 214 | while (isdigit(*(++p))) { | ||
| 215 | pri = 10 * pri + (*p - '0'); | ||
| 216 | } | ||
| 217 | if (pri &~ (LOG_FACMASK|LOG_PRIMASK)) | ||
| 218 | pri = (LOG_USER|LOG_NOTICE); | ||
| 219 | } else if (c == '\n') { | ||
| 220 | *q++ = ' '; | ||
| 221 | } else if (iscntrl(c)&&(c<0177)) { | ||
| 222 | *q++ = '^'; | ||
| 223 | *q++ = c ^ 0100; | ||
| 224 | } else { | ||
| 225 | *q++ = c; | ||
| 226 | } | ||
| 227 | p++; | ||
| 228 | } | ||
| 229 | *q = '\0'; | ||
| 230 | 190 | ||
| 231 | /* Now log it */ | 191 | addrLength = sizeof(sunx.sun_family) + strlen(sunx.sun_path); |
| 232 | logMessage( pri, line); | 192 | if ((bind(fd, (struct sockaddr *) &sunx, addrLength)) || |
| 193 | (listen(fd, 5))) { | ||
| 194 | perror("Could not connect to socket " _PATH_LOG); | ||
| 195 | exit(FALSE); | ||
| 233 | } | 196 | } |
| 234 | close(conn); | ||
| 235 | } | ||
| 236 | 197 | ||
| 237 | close(fd); | 198 | umask(0); |
| 199 | if (chmod(_PATH_LOG, 0666) < 0) { | ||
| 200 | perror("Could not set permission on " _PATH_LOG); | ||
| 201 | exit(FALSE); | ||
| 202 | } | ||
| 203 | |||
| 204 | logMessage(LOG_SYSLOG | LOG_INFO, "syslogd started: " | ||
| 205 | "BusyBox v" BB_VER " (" BB_BT ")"); | ||
| 206 | |||
| 207 | |||
| 208 | while ((conn = accept(fd, (struct sockaddr *) &sunx, | ||
| 209 | &addrLength)) >= 0) { | ||
| 210 | while ((readSize = read(conn, buf, sizeof(buf))) > 0) { | ||
| 211 | char line[1025]; | ||
| 212 | unsigned char c; | ||
| 213 | int pri = (LOG_USER | LOG_NOTICE); | ||
| 214 | |||
| 215 | memset(line, 0, sizeof(line)); | ||
| 216 | p = buf; | ||
| 217 | q = line; | ||
| 218 | while (p && (c = *p) && q < &line[sizeof(line) - 1]) { | ||
| 219 | if (c == '<') { | ||
| 220 | /* Parse the magic priority number */ | ||
| 221 | pri = 0; | ||
| 222 | while (isdigit(*(++p))) { | ||
| 223 | pri = 10 * pri + (*p - '0'); | ||
| 224 | } | ||
| 225 | if (pri & ~(LOG_FACMASK | LOG_PRIMASK)) | ||
| 226 | pri = (LOG_USER | LOG_NOTICE); | ||
| 227 | } else if (c == '\n') { | ||
| 228 | *q++ = ' '; | ||
| 229 | } else if (iscntrl(c) && (c < 0177)) { | ||
| 230 | *q++ = '^'; | ||
| 231 | *q++ = c ^ 0100; | ||
| 232 | } else { | ||
| 233 | *q++ = c; | ||
| 234 | } | ||
| 235 | p++; | ||
| 236 | } | ||
| 237 | *q = '\0'; | ||
| 238 | |||
| 239 | /* Now log it */ | ||
| 240 | logMessage(pri, line); | ||
| 241 | } | ||
| 242 | close(conn); | ||
| 243 | } | ||
| 244 | |||
| 245 | close(fd); | ||
| 238 | } | 246 | } |
| 239 | 247 | ||
| 240 | #ifdef BB_KLOGD | 248 | #ifdef BB_KLOGD |
| 241 | 249 | ||
| 242 | static void klogd_signal(int sig) | 250 | static void klogd_signal(int sig) |
| 243 | { | 251 | { |
| 244 | ksyslog(7, NULL, 0); | 252 | ksyslog(7, NULL, 0); |
| 245 | ksyslog(0, 0, 0); | 253 | ksyslog(0, 0, 0); |
| 246 | logMessage(LOG_SYSLOG|LOG_INFO, "Kernel log daemon exiting."); | 254 | logMessage(LOG_SYSLOG | LOG_INFO, "Kernel log daemon exiting."); |
| 247 | exit( TRUE); | 255 | exit(TRUE); |
| 248 | } | 256 | } |
| 249 | 257 | ||
| 250 | static void doKlogd(void) | 258 | static void doKlogd(void) |
| 251 | { | 259 | { |
| 252 | int priority=LOG_INFO; | 260 | int priority = LOG_INFO; |
| 253 | char log_buffer[4096]; | 261 | char log_buffer[4096]; |
| 254 | char *logp; | 262 | char *logp; |
| 255 | 263 | ||
| 256 | /* Set up sig handlers */ | 264 | /* Set up sig handlers */ |
| 257 | signal(SIGINT, klogd_signal); | 265 | signal(SIGINT, klogd_signal); |
| 258 | signal(SIGKILL, klogd_signal); | 266 | signal(SIGKILL, klogd_signal); |
| 259 | signal(SIGTERM, klogd_signal); | 267 | signal(SIGTERM, klogd_signal); |
| 260 | signal(SIGHUP, klogd_signal); | 268 | signal(SIGHUP, klogd_signal); |
| 261 | logMessage(LOG_SYSLOG|LOG_INFO, "klogd started: " | 269 | logMessage(LOG_SYSLOG | LOG_INFO, "klogd started: " |
| 262 | "BusyBox v" BB_VER " (" BB_BT ")"); | 270 | "BusyBox v" BB_VER " (" BB_BT ")"); |
| 263 | 271 | ||
| 264 | ksyslog(1, NULL, 0); | 272 | ksyslog(1, NULL, 0); |
| 265 | 273 | ||
| 266 | while (1) { | 274 | while (1) { |
| 267 | /* Use kernel syscalls */ | 275 | /* Use kernel syscalls */ |
| 268 | memset(log_buffer, '\0', sizeof(log_buffer)); | 276 | memset(log_buffer, '\0', sizeof(log_buffer)); |
| 269 | if ( ksyslog(2, log_buffer, sizeof(log_buffer)) < 0 ) { | 277 | if (ksyslog(2, log_buffer, sizeof(log_buffer)) < 0) { |
| 270 | char message[80]; | 278 | char message[80]; |
| 271 | if ( errno == EINTR ) | 279 | |
| 272 | continue; | 280 | if (errno == EINTR) |
| 273 | snprintf(message, 79, "klogd: Error return from sys_sycall: " \ | 281 | continue; |
| 274 | "%d - %s.\n", errno, strerror(errno)); | 282 | snprintf(message, 79, "klogd: Error return from sys_sycall: " \ |
| 275 | logMessage(LOG_SYSLOG|LOG_ERR, message); | 283 | "%d - %s.\n", errno, strerror(errno)); |
| 276 | exit(1); | 284 | logMessage(LOG_SYSLOG | LOG_ERR, message); |
| 285 | exit(1); | ||
| 286 | } | ||
| 287 | logp = log_buffer; | ||
| 288 | if (*log_buffer == '<') { | ||
| 289 | switch (*(log_buffer + 1)) { | ||
| 290 | case '0': | ||
| 291 | priority = LOG_EMERG; | ||
| 292 | break; | ||
| 293 | case '1': | ||
| 294 | priority = LOG_ALERT; | ||
| 295 | break; | ||
| 296 | case '2': | ||
| 297 | priority = LOG_CRIT; | ||
| 298 | break; | ||
| 299 | case '3': | ||
| 300 | priority = LOG_ERR; | ||
| 301 | break; | ||
| 302 | case '4': | ||
| 303 | priority = LOG_WARNING; | ||
| 304 | break; | ||
| 305 | case '5': | ||
| 306 | priority = LOG_NOTICE; | ||
| 307 | break; | ||
| 308 | case '6': | ||
| 309 | priority = LOG_INFO; | ||
| 310 | break; | ||
| 311 | case '7': | ||
| 312 | default: | ||
| 313 | priority = LOG_DEBUG; | ||
| 314 | } | ||
| 315 | logp += 3; | ||
| 316 | } | ||
| 317 | logMessage(LOG_KERN | priority, logp); | ||
| 277 | } | 318 | } |
| 278 | logp=log_buffer; | ||
| 279 | if ( *log_buffer == '<' ) | ||
| 280 | { | ||
| 281 | switch ( *(log_buffer+1) ) | ||
| 282 | { | ||
| 283 | case '0': | ||
| 284 | priority = LOG_EMERG; | ||
| 285 | break; | ||
| 286 | case '1': | ||
| 287 | priority = LOG_ALERT; | ||
| 288 | break; | ||
| 289 | case '2': | ||
| 290 | priority = LOG_CRIT; | ||
| 291 | break; | ||
| 292 | case '3': | ||
| 293 | priority = LOG_ERR; | ||
| 294 | break; | ||
| 295 | case '4': | ||
| 296 | priority = LOG_WARNING; | ||
| 297 | break; | ||
| 298 | case '5': | ||
| 299 | priority = LOG_NOTICE; | ||
| 300 | break; | ||
| 301 | case '6': | ||
| 302 | priority = LOG_INFO; | ||
| 303 | break; | ||
| 304 | case '7': | ||
| 305 | default: | ||
| 306 | priority = LOG_DEBUG; | ||
| 307 | } | ||
| 308 | logp+=3; | ||
| 309 | } | ||
| 310 | logMessage(LOG_KERN|priority, logp); | ||
| 311 | } | ||
| 312 | 319 | ||
| 313 | } | 320 | } |
| 314 | 321 | ||
| @@ -316,76 +323,75 @@ static void doKlogd(void) | |||
| 316 | 323 | ||
| 317 | extern int syslogd_main(int argc, char **argv) | 324 | extern int syslogd_main(int argc, char **argv) |
| 318 | { | 325 | { |
| 319 | int pid, klogd_pid; | 326 | int pid, klogd_pid; |
| 320 | int doFork = TRUE; | 327 | int doFork = TRUE; |
| 328 | |||
| 321 | #ifdef BB_KLOGD | 329 | #ifdef BB_KLOGD |
| 322 | int startKlogd = TRUE; | 330 | int startKlogd = TRUE; |
| 323 | #endif | 331 | #endif |
| 324 | int stopDoingThat = FALSE; | 332 | int stopDoingThat = FALSE; |
| 325 | char *p; | 333 | char *p; |
| 326 | char **argv1=argv; | 334 | char **argv1 = argv; |
| 327 | 335 | ||
| 328 | while (--argc > 0 && **(++argv1) == '-') { | 336 | while (--argc > 0 && **(++argv1) == '-') { |
| 329 | stopDoingThat = FALSE; | 337 | stopDoingThat = FALSE; |
| 330 | while (stopDoingThat == FALSE && *(++(*argv1))) { | 338 | while (stopDoingThat == FALSE && *(++(*argv1))) { |
| 331 | switch (**argv1) { | 339 | switch (**argv1) { |
| 332 | case 'm': | 340 | case 'm': |
| 333 | if (--argc == 0) { | 341 | if (--argc == 0) { |
| 334 | usage(syslogd_usage); | 342 | usage(syslogd_usage); |
| 335 | } | 343 | } |
| 336 | MarkInterval = atoi(*(++argv1))*60; | 344 | MarkInterval = atoi(*(++argv1)) * 60; |
| 337 | break; | 345 | break; |
| 338 | case 'n': | 346 | case 'n': |
| 339 | doFork = FALSE; | 347 | doFork = FALSE; |
| 340 | break; | 348 | break; |
| 341 | #ifdef BB_KLOGD | 349 | #ifdef BB_KLOGD |
| 342 | case 'K': | 350 | case 'K': |
| 343 | startKlogd = FALSE; | 351 | startKlogd = FALSE; |
| 344 | break; | 352 | break; |
| 345 | #endif | 353 | #endif |
| 346 | case 'O': | 354 | case 'O': |
| 347 | if (--argc == 0) { | 355 | if (--argc == 0) { |
| 348 | usage(syslogd_usage); | 356 | usage(syslogd_usage); |
| 357 | } | ||
| 358 | logFilePath = *(++argv1); | ||
| 359 | stopDoingThat = TRUE; | ||
| 360 | break; | ||
| 361 | default: | ||
| 362 | usage(syslogd_usage); | ||
| 363 | } | ||
| 349 | } | 364 | } |
| 350 | logFilePath = *(++argv1); | ||
| 351 | stopDoingThat = TRUE; | ||
| 352 | break; | ||
| 353 | default: | ||
| 354 | usage(syslogd_usage); | ||
| 355 | } | ||
| 356 | } | 365 | } |
| 357 | } | 366 | |
| 358 | 367 | /* Store away localhost's name before the fork */ | |
| 359 | /* Store away localhost's name before the fork */ | 368 | gethostname(LocalHostName, sizeof(LocalHostName)); |
| 360 | gethostname(LocalHostName, sizeof(LocalHostName)); | 369 | if ((p = strchr(LocalHostName, '.'))) { |
| 361 | if ( (p = strchr(LocalHostName, '.')) ) { | 370 | *p++ = '\0'; |
| 362 | *p++ = '\0'; | 371 | } |
| 363 | } | 372 | |
| 364 | 373 | if (doFork == TRUE) { | |
| 365 | if (doFork == TRUE) { | 374 | pid = fork(); |
| 366 | pid = fork(); | 375 | if (pid < 0) |
| 367 | if ( pid < 0 ) | 376 | exit(pid); |
| 368 | exit( pid); | 377 | else if (pid == 0) { |
| 369 | else if ( pid == 0 ) { | 378 | strncpy(argv[0], "syslogd", strlen(argv[0])); |
| 370 | strncpy(argv[0], "syslogd",strlen(argv[0])); | 379 | doSyslogd(); |
| 371 | doSyslogd(); | 380 | } |
| 381 | } else { | ||
| 382 | doSyslogd(); | ||
| 372 | } | 383 | } |
| 373 | } else { | ||
| 374 | doSyslogd(); | ||
| 375 | } | ||
| 376 | 384 | ||
| 377 | #ifdef BB_KLOGD | 385 | #ifdef BB_KLOGD |
| 378 | /* Start up the klogd process */ | 386 | /* Start up the klogd process */ |
| 379 | if (startKlogd == TRUE) { | 387 | if (startKlogd == TRUE) { |
| 380 | klogd_pid = fork(); | 388 | klogd_pid = fork(); |
| 381 | if (klogd_pid == 0 ) { | 389 | if (klogd_pid == 0) { |
| 382 | strncpy(argv[0], "klogd", strlen(argv[0])); | 390 | strncpy(argv[0], "klogd", strlen(argv[0])); |
| 383 | doKlogd(); | 391 | doKlogd(); |
| 392 | } | ||
| 384 | } | 393 | } |
| 385 | } | ||
| 386 | #endif | 394 | #endif |
| 387 | 395 | ||
| 388 | exit( TRUE); | 396 | exit(TRUE); |
| 389 | } | 397 | } |
| 390 | |||
| 391 | |||
