aboutsummaryrefslogtreecommitdiff
path: root/sysklogd
diff options
context:
space:
mode:
Diffstat (limited to 'sysklogd')
-rw-r--r--sysklogd/syslogd.c98
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? */
58static int RemotePort = 514; 58static int RemotePort = 514;
59 59
60/* To remote log or not to remote log, that is the question. */
61static int doRemoteLog = FALSE;
62static int local_logging = FALSE;
63#endif 60#endif
64 61
65/* Make loging output smaller. */ 62/* options */
66static bool small = false; 63static 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
98static int shmid = -1; // ipc shared memory id 98static int shmid = -1; // ipc shared memory id
99static int s_semid = -1; // ipc semaphore id 99static int s_semid = -1; // ipc semaphore id
100static int shm_size = ((CONFIG_FEATURE_IPC_SYSLOG_BUFFER_SIZE)*1024); // default shm size 100static int shm_size = ((CONFIG_FEATURE_IPC_SYSLOG_BUFFER_SIZE)*1024); // default shm size
101static int circular_logging = FALSE;
102
103/*
104 * sem_up - up()'s a semaphore.
105 */
106static 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 */
116static 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
124static void ipcsyslog_cleanup(void) 102static void ipcsyslog_cleanup(void)
125{ 103{
@@ -169,8 +147,11 @@ static void ipcsyslog_init(void)
169static void circ_message(const char *msg) 147static 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: 391retry:
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 */