aboutsummaryrefslogtreecommitdiff
path: root/sysklogd/syslogd.c
diff options
context:
space:
mode:
Diffstat (limited to 'sysklogd/syslogd.c')
-rw-r--r--sysklogd/syslogd.c82
1 files changed, 72 insertions, 10 deletions
diff --git a/sysklogd/syslogd.c b/sysklogd/syslogd.c
index fc380d9f9..3fe3f5348 100644
--- a/sysklogd/syslogd.c
+++ b/sysklogd/syslogd.c
@@ -43,6 +43,9 @@
43//usage: "\n -f FILE Use FILE as config (default:/etc/syslog.conf)" 43//usage: "\n -f FILE Use FILE as config (default:/etc/syslog.conf)"
44//usage: ) 44//usage: )
45/* //usage: "\n -m MIN Minutes between MARK lines (default:20, 0=off)" */ 45/* //usage: "\n -m MIN Minutes between MARK lines (default:20, 0=off)" */
46//usage: IF_FEATURE_KMSG_SYSLOG(
47//usage: "\n -K Log to kernel printk buffer (use dmesg to read it)"
48//usage: )
46//usage: 49//usage:
47//usage:#define syslogd_example_usage 50//usage:#define syslogd_example_usage
48//usage: "$ syslogd -R masterlog:514\n" 51//usage: "$ syslogd -R masterlog:514\n"
@@ -140,6 +143,10 @@ IF_FEATURE_IPC_SYSLOG( \
140) \ 143) \
141IF_FEATURE_SYSLOGD_CFG( \ 144IF_FEATURE_SYSLOGD_CFG( \
142 logRule_t *log_rules; \ 145 logRule_t *log_rules; \
146) \
147IF_FEATURE_KMSG_SYSLOG( \
148 int kmsgfd; \
149 int primask; \
143) 150)
144 151
145struct init_globals { 152struct init_globals {
@@ -212,6 +219,7 @@ enum {
212 IF_FEATURE_IPC_SYSLOG( OPTBIT_circularlog,) // -C 219 IF_FEATURE_IPC_SYSLOG( OPTBIT_circularlog,) // -C
213 IF_FEATURE_SYSLOGD_DUP( OPTBIT_dup ,) // -D 220 IF_FEATURE_SYSLOGD_DUP( OPTBIT_dup ,) // -D
214 IF_FEATURE_SYSLOGD_CFG( OPTBIT_cfg ,) // -f 221 IF_FEATURE_SYSLOGD_CFG( OPTBIT_cfg ,) // -f
222 IF_FEATURE_KMSG_SYSLOG( OPTBIT_kmsg ,) // -K
215 223
216 OPT_mark = 1 << OPTBIT_mark , 224 OPT_mark = 1 << OPTBIT_mark ,
217 OPT_nofork = 1 << OPTBIT_nofork , 225 OPT_nofork = 1 << OPTBIT_nofork ,
@@ -225,6 +233,8 @@ enum {
225 OPT_circularlog = IF_FEATURE_IPC_SYSLOG( (1 << OPTBIT_circularlog)) + 0, 233 OPT_circularlog = IF_FEATURE_IPC_SYSLOG( (1 << OPTBIT_circularlog)) + 0,
226 OPT_dup = IF_FEATURE_SYSLOGD_DUP( (1 << OPTBIT_dup )) + 0, 234 OPT_dup = IF_FEATURE_SYSLOGD_DUP( (1 << OPTBIT_dup )) + 0,
227 OPT_cfg = IF_FEATURE_SYSLOGD_CFG( (1 << OPTBIT_cfg )) + 0, 235 OPT_cfg = IF_FEATURE_SYSLOGD_CFG( (1 << OPTBIT_cfg )) + 0,
236 OPT_kmsg = IF_FEATURE_KMSG_SYSLOG( (1 << OPTBIT_kmsg )) + 0,
237
228}; 238};
229#define OPTION_STR "m:nO:l:S" \ 239#define OPTION_STR "m:nO:l:S" \
230 IF_FEATURE_ROTATE_LOGFILE("s:" ) \ 240 IF_FEATURE_ROTATE_LOGFILE("s:" ) \
@@ -233,7 +243,8 @@ enum {
233 IF_FEATURE_REMOTE_LOG( "L" ) \ 243 IF_FEATURE_REMOTE_LOG( "L" ) \
234 IF_FEATURE_IPC_SYSLOG( "C::") \ 244 IF_FEATURE_IPC_SYSLOG( "C::") \
235 IF_FEATURE_SYSLOGD_DUP( "D" ) \ 245 IF_FEATURE_SYSLOGD_DUP( "D" ) \
236 IF_FEATURE_SYSLOGD_CFG( "f:" ) 246 IF_FEATURE_SYSLOGD_CFG( "f:" ) \
247 IF_FEATURE_KMSG_SYSLOG( "K" )
237#define OPTION_DECL *opt_m, *opt_l \ 248#define OPTION_DECL *opt_m, *opt_l \
238 IF_FEATURE_ROTATE_LOGFILE(,*opt_s) \ 249 IF_FEATURE_ROTATE_LOGFILE(,*opt_s) \
239 IF_FEATURE_ROTATE_LOGFILE(,*opt_b) \ 250 IF_FEATURE_ROTATE_LOGFILE(,*opt_b) \
@@ -242,7 +253,7 @@ enum {
242#define OPTION_PARAM &opt_m, &(G.logFile.path), &opt_l \ 253#define OPTION_PARAM &opt_m, &(G.logFile.path), &opt_l \
243 IF_FEATURE_ROTATE_LOGFILE(,&opt_s) \ 254 IF_FEATURE_ROTATE_LOGFILE(,&opt_s) \
244 IF_FEATURE_ROTATE_LOGFILE(,&opt_b) \ 255 IF_FEATURE_ROTATE_LOGFILE(,&opt_b) \
245 IF_FEATURE_REMOTE_LOG( ,&remoteAddrList) \ 256 IF_FEATURE_REMOTE_LOG( ,&remoteAddrList) \
246 IF_FEATURE_IPC_SYSLOG( ,&opt_C) \ 257 IF_FEATURE_IPC_SYSLOG( ,&opt_C) \
247 IF_FEATURE_SYSLOGD_CFG( ,&opt_f) 258 IF_FEATURE_SYSLOGD_CFG( ,&opt_f)
248 259
@@ -418,7 +429,9 @@ static void parse_syslogdcfg(const char *file)
418 return; 429 return;
419 430
420 cfgerr: 431 cfgerr:
421 bb_error_msg_and_die("error in '%s' at line %d", file, parser->lineno); 432 bb_error_msg_and_die("error in '%s' at line %d",
433 file ? file : "/etc/syslog.conf",
434 parser->lineno);
422} 435}
423#endif 436#endif
424 437
@@ -518,11 +531,49 @@ static void log_to_shmem(const char *msg)
518 printf("tail:%d\n", G.shbuf->tail); 531 printf("tail:%d\n", G.shbuf->tail);
519} 532}
520#else 533#else
521void ipcsyslog_cleanup(void); 534static void ipcsyslog_cleanup(void) {}
522void ipcsyslog_init(void); 535static void ipcsyslog_init(void) {}
523void log_to_shmem(const char *msg); 536void log_to_shmem(const char *msg);
524#endif /* FEATURE_IPC_SYSLOG */ 537#endif /* FEATURE_IPC_SYSLOG */
525 538
539#if ENABLE_FEATURE_KMSG_SYSLOG
540static void kmsg_init(void)
541{
542 G.kmsgfd = xopen("/dev/kmsg", O_WRONLY);
543
544 /*
545 * kernel < 3.5 expects single char printk KERN_* priority prefix,
546 * from 3.5 onwards the full syslog facility/priority format is supported
547 */
548 if (get_linux_version_code() < KERNEL_VERSION(3,5,0))
549 G.primask = LOG_PRIMASK;
550 else
551 G.primask = -1;
552}
553
554static void kmsg_cleanup(void)
555{
556 if (ENABLE_FEATURE_CLEAN_UP)
557 close(G.kmsgfd);
558}
559
560/* Write message to /dev/kmsg */
561static void log_to_kmsg(int pri, const char *msg)
562{
563 /*
564 * kernel < 3.5 expects single char printk KERN_* priority prefix,
565 * from 3.5 onwards the full syslog facility/priority format is supported
566 */
567 pri &= G.primask;
568
569 write(G.kmsgfd, G.printbuf, sprintf(G.printbuf, "<%d>%s\n", pri, msg));
570}
571#else
572static void kmsg_init(void) {}
573static void kmsg_cleanup(void) {}
574static void log_to_kmsg(int pri UNUSED_PARAM, const char *msg UNUSED_PARAM) {}
575#endif /* FEATURE_KMSG_SYSLOG */
576
526/* Print a message to the log file. */ 577/* Print a message to the log file. */
527static void log_locally(time_t now, char *msg, logFile_t *log_file) 578static void log_locally(time_t now, char *msg, logFile_t *log_file)
528{ 579{
@@ -657,6 +708,11 @@ static void timestamp_and_log(int pri, char *msg, int len)
657 } 708 }
658 timestamp[15] = '\0'; 709 timestamp[15] = '\0';
659 710
711 if (option_mask32 & OPT_kmsg) {
712 log_to_kmsg(pri, msg);
713 return;
714 }
715
660 if (option_mask32 & OPT_small) 716 if (option_mask32 & OPT_small)
661 sprintf(G.printbuf, "%s %s\n", timestamp, msg); 717 sprintf(G.printbuf, "%s %s\n", timestamp, msg);
662 else { 718 else {
@@ -827,9 +883,11 @@ static void do_syslogd(void)
827#endif 883#endif
828 sock_fd = create_socket(); 884 sock_fd = create_socket();
829 885
830 if (ENABLE_FEATURE_IPC_SYSLOG && (option_mask32 & OPT_circularlog)) { 886 if (option_mask32 & OPT_circularlog)
831 ipcsyslog_init(); 887 ipcsyslog_init();
832 } 888
889 if (option_mask32 & OPT_kmsg)
890 kmsg_init();
833 891
834 timestamp_and_log_internal("syslogd started: BusyBox v" BB_VER); 892 timestamp_and_log_internal("syslogd started: BusyBox v" BB_VER);
835 893
@@ -916,8 +974,10 @@ static void do_syslogd(void)
916 974
917 timestamp_and_log_internal("syslogd exiting"); 975 timestamp_and_log_internal("syslogd exiting");
918 puts("syslogd exiting"); 976 puts("syslogd exiting");
919 if (ENABLE_FEATURE_IPC_SYSLOG) 977 remove_pidfile(CONFIG_PID_FILE_PATH "/syslogd.pid");
920 ipcsyslog_cleanup(); 978 ipcsyslog_cleanup();
979 if (option_mask32 & OPT_kmsg)
980 kmsg_cleanup();
921 kill_myself_with_sig(bb_got_signal); 981 kill_myself_with_sig(bb_got_signal);
922#undef recvbuf 982#undef recvbuf
923} 983}
@@ -979,8 +1039,10 @@ int syslogd_main(int argc UNUSED_PARAM, char **argv)
979 if (!(opts & OPT_nofork)) { 1039 if (!(opts & OPT_nofork)) {
980 bb_daemonize_or_rexec(DAEMON_CHDIR_ROOT, argv); 1040 bb_daemonize_or_rexec(DAEMON_CHDIR_ROOT, argv);
981 } 1041 }
1042
982 //umask(0); - why?? 1043 //umask(0); - why??
983 write_pidfile("/var/run/syslogd.pid"); 1044 write_pidfile(CONFIG_PID_FILE_PATH "/syslogd.pid");
1045
984 do_syslogd(); 1046 do_syslogd();
985 /* return EXIT_SUCCESS; */ 1047 /* return EXIT_SUCCESS; */
986} 1048}