diff options
Diffstat (limited to 'sysklogd')
-rw-r--r-- | sysklogd/syslogd.c | 98 |
1 files changed, 36 insertions, 62 deletions
diff --git a/sysklogd/syslogd.c b/sysklogd/syslogd.c index 87313af43..fc3845606 100644 --- a/sysklogd/syslogd.c +++ b/sysklogd/syslogd.c | |||
@@ -57,14 +57,14 @@ static char *RemoteHost; | |||
57 | /* what port to log to? */ | 57 | /* what port to log to? */ |
58 | static int RemotePort = 514; | 58 | static int RemotePort = 514; |
59 | 59 | ||
60 | /* To remote log or not to remote log, that is the question. */ | ||
61 | static int doRemoteLog = FALSE; | ||
62 | static int local_logging = FALSE; | ||
63 | #endif | 60 | #endif |
64 | 61 | ||
65 | /* Make loging output smaller. */ | 62 | /* options */ |
66 | static bool small = false; | 63 | static unsigned opts; |
67 | 64 | #define SYSLOG_OPT_small (1) | |
65 | #define SYSLOG_OPT_remotelog (2) | ||
66 | #define SYSLOG_OPT_locallog (4) | ||
67 | #define SYSLOG_OPT_circularlog (8) | ||
68 | 68 | ||
69 | #define MAXLINE 1024 /* maximum line length */ | 69 | #define MAXLINE 1024 /* maximum line length */ |
70 | 70 | ||
@@ -98,28 +98,6 @@ static struct sembuf SMwdn[3] = { {0, 0}, {1, 0}, {1, +1} }; // set SMwdn | |||
98 | static int shmid = -1; // ipc shared memory id | 98 | static int shmid = -1; // ipc shared memory id |
99 | static int s_semid = -1; // ipc semaphore id | 99 | static int s_semid = -1; // ipc semaphore id |
100 | static int shm_size = ((CONFIG_FEATURE_IPC_SYSLOG_BUFFER_SIZE)*1024); // default shm size | 100 | static int shm_size = ((CONFIG_FEATURE_IPC_SYSLOG_BUFFER_SIZE)*1024); // default shm size |
101 | static int circular_logging = FALSE; | ||
102 | |||
103 | /* | ||
104 | * sem_up - up()'s a semaphore. | ||
105 | */ | ||
106 | static inline void sem_up(int semid) | ||
107 | { | ||
108 | if (semop(semid, SMwup, 1) == -1) { | ||
109 | bb_perror_msg_and_die("semop[SMwup]"); | ||
110 | } | ||
111 | } | ||
112 | |||
113 | /* | ||
114 | * sem_down - down()'s a semaphore | ||
115 | */ | ||
116 | static inline void sem_down(int semid) | ||
117 | { | ||
118 | if (semop(semid, SMwdn, 3) == -1) { | ||
119 | bb_perror_msg_and_die("semop[SMwdn]"); | ||
120 | } | ||
121 | } | ||
122 | |||
123 | 101 | ||
124 | static void ipcsyslog_cleanup(void) | 102 | static void ipcsyslog_cleanup(void) |
125 | { | 103 | { |
@@ -169,8 +147,11 @@ static void ipcsyslog_init(void) | |||
169 | static void circ_message(const char *msg) | 147 | static void circ_message(const char *msg) |
170 | { | 148 | { |
171 | int l = strlen(msg) + 1; /* count the whole message w/ '\0' included */ | 149 | int l = strlen(msg) + 1; /* count the whole message w/ '\0' included */ |
150 | const char * const fail_msg = "Can't find the terminator token%s?\n"; | ||
172 | 151 | ||
173 | sem_down(s_semid); | 152 | if (semop(s_semid, SMwdn, 3) == -1) { |
153 | bb_perror_msg_and_die("SMwdn"); | ||
154 | } | ||
174 | 155 | ||
175 | /* | 156 | /* |
176 | * Circular Buffer Algorithm: | 157 | * Circular Buffer Algorithm: |
@@ -220,7 +201,7 @@ static void circ_message(const char *msg) | |||
220 | /* Note: HEAD is only used to "retrieve" messages, it's not used | 201 | /* Note: HEAD is only used to "retrieve" messages, it's not used |
221 | when writing messages into our buffer */ | 202 | when writing messages into our buffer */ |
222 | } else { /* show an error message to know we messed up? */ | 203 | } else { /* show an error message to know we messed up? */ |
223 | printf("Weird! Can't find the terminator token?\n"); | 204 | printf(fail_msg,""); |
224 | buf->head = 0; | 205 | buf->head = 0; |
225 | } | 206 | } |
226 | } | 207 | } |
@@ -256,13 +237,15 @@ static void circ_message(const char *msg) | |||
256 | /* we need to place the TAIL at the end of the message */ | 237 | /* we need to place the TAIL at the end of the message */ |
257 | buf->tail = k + 1; | 238 | buf->tail = k + 1; |
258 | } else { | 239 | } else { |
259 | printf | 240 | printf(fail_msg, " from the beginning"); |
260 | ("Weird! Can't find the terminator token from the beginning?\n"); | ||
261 | buf->head = buf->tail = 0; /* reset buffer, since it's probably corrupted */ | 241 | buf->head = buf->tail = 0; /* reset buffer, since it's probably corrupted */ |
262 | } | 242 | } |
263 | 243 | ||
264 | } | 244 | } |
265 | sem_up(s_semid); | 245 | if (semop(s_semid, SMwup, 1) == -1) { |
246 | bb_perror_msg_and_die("SMwup"); | ||
247 | } | ||
248 | |||
266 | } | 249 | } |
267 | #endif /* CONFIG_FEATURE_IPC_SYSLOG */ | 250 | #endif /* CONFIG_FEATURE_IPC_SYSLOG */ |
268 | 251 | ||
@@ -280,7 +263,7 @@ static void message(char *fmt, ...) | |||
280 | fl.l_len = 1; | 263 | fl.l_len = 1; |
281 | 264 | ||
282 | #ifdef CONFIG_FEATURE_IPC_SYSLOG | 265 | #ifdef CONFIG_FEATURE_IPC_SYSLOG |
283 | if ((circular_logging == TRUE) && (buf != NULL)) { | 266 | if ((opts & SYSLOG_OPT_circularlog) && (buf != NULL)) { |
284 | char b[1024]; | 267 | char b[1024]; |
285 | 268 | ||
286 | va_start(arguments, fmt); | 269 | va_start(arguments, fmt); |
@@ -295,8 +278,8 @@ static void message(char *fmt, ...) | |||
295 | O_NONBLOCK)) >= 0) { | 278 | O_NONBLOCK)) >= 0) { |
296 | fl.l_type = F_WRLCK; | 279 | fl.l_type = F_WRLCK; |
297 | fcntl(fd, F_SETLKW, &fl); | 280 | fcntl(fd, F_SETLKW, &fl); |
298 | #ifdef CONFIG_FEATURE_ROTATE_LOGFILE | 281 | |
299 | if ( logFileSize > 0 ) { | 282 | if (ENABLE_FEATURE_ROTATE_LOGFILE && logFileSize > 0 ) { |
300 | struct stat statf; | 283 | struct stat statf; |
301 | int r = fstat(fd, &statf); | 284 | int r = fstat(fd, &statf); |
302 | if( !r && (statf.st_mode & S_IFREG) | 285 | if( !r && (statf.st_mode & S_IFREG) |
@@ -324,7 +307,7 @@ static void message(char *fmt, ...) | |||
324 | } | 307 | } |
325 | } | 308 | } |
326 | } | 309 | } |
327 | #endif | 310 | |
328 | va_start(arguments, fmt); | 311 | va_start(arguments, fmt); |
329 | vdprintf(fd, fmt, arguments); | 312 | vdprintf(fd, fmt, arguments); |
330 | va_end(arguments); | 313 | va_end(arguments); |
@@ -364,10 +347,7 @@ static void logMessage(int pri, char *msg) | |||
364 | { | 347 | { |
365 | time_t now; | 348 | time_t now; |
366 | char *timestamp; | 349 | char *timestamp; |
367 | static char res[20]; | 350 | char res[20]; |
368 | #ifdef CONFIG_FEATURE_REMOTE_LOG | ||
369 | static char line[MAXLINE + 1]; | ||
370 | #endif | ||
371 | CODE *c_pri, *c_fac; | 351 | CODE *c_pri, *c_fac; |
372 | 352 | ||
373 | if (pri != 0) { | 353 | if (pri != 0) { |
@@ -396,7 +376,8 @@ static void logMessage(int pri, char *msg) | |||
396 | /* todo: supress duplicates */ | 376 | /* todo: supress duplicates */ |
397 | 377 | ||
398 | #ifdef CONFIG_FEATURE_REMOTE_LOG | 378 | #ifdef CONFIG_FEATURE_REMOTE_LOG |
399 | if (doRemoteLog == TRUE) { | 379 | if (opts & SYSLOG_OPT_remotelog) { |
380 | char line[MAXLINE + 1]; | ||
400 | /* trying connect the socket */ | 381 | /* trying connect the socket */ |
401 | if (-1 == remotefd) { | 382 | if (-1 == remotefd) { |
402 | init_RemoteLog(); | 383 | init_RemoteLog(); |
@@ -407,7 +388,7 @@ static void logMessage(int pri, char *msg) | |||
407 | now = 1; | 388 | now = 1; |
408 | snprintf(line, sizeof(line), "<%d>%s", pri, msg); | 389 | snprintf(line, sizeof(line), "<%d>%s", pri, msg); |
409 | 390 | ||
410 | retry: | 391 | retry: |
411 | /* send message to remote logger */ | 392 | /* send message to remote logger */ |
412 | if(( -1 == sendto(remotefd, line, strlen(line), 0, | 393 | if(( -1 == sendto(remotefd, line, strlen(line), 0, |
413 | (struct sockaddr *) &remoteaddr, | 394 | (struct sockaddr *) &remoteaddr, |
@@ -420,11 +401,11 @@ static void logMessage(int pri, char *msg) | |||
420 | } | 401 | } |
421 | } | 402 | } |
422 | 403 | ||
423 | if (local_logging == TRUE) | 404 | if (opts & SYSLOG_OPT_locallog) |
424 | #endif | 405 | #endif |
425 | { | 406 | { |
426 | /* now spew out the message to wherever it is supposed to go */ | 407 | /* now spew out the message to wherever it is supposed to go */ |
427 | if (small) | 408 | if (opts & SYSLOG_OPT_small) |
428 | message("%s %s\n", timestamp, msg); | 409 | message("%s %s\n", timestamp, msg); |
429 | else | 410 | else |
430 | message("%s %s %s %s\n", timestamp, LocalHostName, res, msg); | 411 | message("%s %s %s %s\n", timestamp, LocalHostName, res, msg); |
@@ -435,9 +416,8 @@ static void quit_signal(int sig) | |||
435 | { | 416 | { |
436 | logMessage(LOG_SYSLOG | LOG_INFO, "System log daemon exiting."); | 417 | logMessage(LOG_SYSLOG | LOG_INFO, "System log daemon exiting."); |
437 | unlink(lfile); | 418 | unlink(lfile); |
438 | #ifdef CONFIG_FEATURE_IPC_SYSLOG | 419 | if (ENABLE_FEATURE_IPC_SYSLOG) |
439 | ipcsyslog_cleanup(); | 420 | ipcsyslog_cleanup(); |
440 | #endif | ||
441 | 421 | ||
442 | exit(TRUE); | 422 | exit(TRUE); |
443 | } | 423 | } |
@@ -531,17 +511,13 @@ static void doSyslogd(void) | |||
531 | if (chmod(lfile, 0666) < 0) { | 511 | if (chmod(lfile, 0666) < 0) { |
532 | bb_perror_msg_and_die("Could not set permission on " _PATH_LOG); | 512 | bb_perror_msg_and_die("Could not set permission on " _PATH_LOG); |
533 | } | 513 | } |
534 | #ifdef CONFIG_FEATURE_IPC_SYSLOG | 514 | if (ENABLE_FEATURE_IPC_SYSLOG && opts & SYSLOG_OPT_circularlog) { |
535 | if (circular_logging == TRUE) { | ||
536 | ipcsyslog_init(); | 515 | ipcsyslog_init(); |
537 | } | 516 | } |
538 | #endif | ||
539 | 517 | ||
540 | #ifdef CONFIG_FEATURE_REMOTE_LOG | 518 | if (ENABLE_FEATURE_REMOTE_LOG && opts & SYSLOG_OPT_remotelog) { |
541 | if (doRemoteLog == TRUE) { | ||
542 | init_RemoteLog(); | 519 | init_RemoteLog(); |
543 | } | 520 | } |
544 | #endif | ||
545 | 521 | ||
546 | logMessage(LOG_SYSLOG | LOG_INFO, "syslogd started: " "BusyBox v" BB_VER ); | 522 | logMessage(LOG_SYSLOG | LOG_INFO, "syslogd started: " "BusyBox v" BB_VER ); |
547 | 523 | ||
@@ -613,10 +589,10 @@ int syslogd_main(int argc, char **argv) | |||
613 | RemotePort = atoi(p + 1); | 589 | RemotePort = atoi(p + 1); |
614 | *p = '\0'; | 590 | *p = '\0'; |
615 | } | 591 | } |
616 | doRemoteLog = TRUE; | 592 | opts |= SYSLOG_OPT_remotelog; |
617 | break; | 593 | break; |
618 | case 'L': | 594 | case 'L': |
619 | local_logging = TRUE; | 595 | opts |= SYSLOG_OPT_locallog; |
620 | break; | 596 | break; |
621 | #endif | 597 | #endif |
622 | #ifdef CONFIG_FEATURE_IPC_SYSLOG | 598 | #ifdef CONFIG_FEATURE_IPC_SYSLOG |
@@ -627,22 +603,20 @@ int syslogd_main(int argc, char **argv) | |||
627 | shm_size = buf_size * 1024; | 603 | shm_size = buf_size * 1024; |
628 | } | 604 | } |
629 | } | 605 | } |
630 | circular_logging = TRUE; | 606 | opts |= SYSLOG_OPT_circularlog; |
631 | break; | 607 | break; |
632 | #endif | 608 | #endif |
633 | case 'S': | 609 | case 'S': |
634 | small = true; | 610 | opts |= SYSLOG_OPT_small; |
635 | break; | 611 | break; |
636 | default: | 612 | default: |
637 | bb_show_usage(); | 613 | bb_show_usage(); |
638 | } | 614 | } |
639 | } | 615 | } |
640 | 616 | ||
641 | #ifdef CONFIG_FEATURE_REMOTE_LOG | ||
642 | /* If they have not specified remote logging, then log locally */ | 617 | /* If they have not specified remote logging, then log locally */ |
643 | if (doRemoteLog == FALSE) | 618 | if (ENABLE_FEATURE_REMOTE_LOG && !(opts & SYSLOG_OPT_remotelog)) |
644 | local_logging = TRUE; | 619 | opts |= SYSLOG_OPT_locallog; |
645 | #endif | ||
646 | 620 | ||
647 | 621 | ||
648 | /* Store away localhost's name before the fork */ | 622 | /* Store away localhost's name before the fork */ |