diff options
Diffstat (limited to 'toys')
-rw-r--r-- | toys/pending/klogd.c | 104 |
1 files changed, 39 insertions, 65 deletions
diff --git a/toys/pending/klogd.c b/toys/pending/klogd.c index c44022a2..0b638294 100644 --- a/toys/pending/klogd.c +++ b/toys/pending/klogd.c @@ -24,87 +24,38 @@ config KLOGD_SOURCE_RING_BUFFER #define FOR_klogd #include "toys.h" #include <signal.h> +#include <sys/klog.h> GLOBALS( long level; + int fd; ) -#if CFG_KLOGD_SOURCE_RING_BUFFER -#include <sys/klog.h> -static void open_klogd(void) -{ - syslog(LOG_NOTICE, "KLOGD: started with Kernel ring buffer as log source\n"); - klogctl(1, NULL, 0); -} - -static int read_klogd(char *bufptr, int len) -{ - return klogctl(2, bufptr, len); -} - static void set_log_level(int level) { - klogctl(8, NULL, level); -} - -static void close_klogd(void) -{ - klogctl(7, NULL, 0); - klogctl(0, NULL, 0); -} -#else -static void open_klogd(void) -{ - TT.fd = xopen("/proc/kmsg", O_RDONLY); //_PATH_KLOG in paths.h - syslog(LOG_NOTICE, "KLOGD: started with /proc/kmsg as log source\n"); -} - -static int read_klogd(char *bufptr, int len) -{ - return xread(TT.fd, bufptr, len); -} - -static void set_log_level(int level) -{ + if (CFG_KLOGD_SOURCE_RING_BUFFER) + klogctl(8, NULL, level); + else { FILE *fptr = xfopen("/proc/sys/kernel/printk", "w"); fprintf(fptr, "%u\n", level); fclose(fptr); fptr = NULL; + } } -static void close_klogd(void) -{ - set_log_level(7); - xclose(TT.fd); -} -#endif - static void handle_signal(int sig) { - close_klogd(); + if (CFG_KLOGD_SOURCE_RING_BUFFER) { + klogctl(7, NULL, 0); + klogctl(0, NULL, 0); + } else { + set_log_level(7); + xclose(TT.fd); + } syslog(LOG_NOTICE,"KLOGD: Daemon exiting......"); exit(1); } -static int daemonize(void) -{ - pid_t pid; - int fd = open("/dev/null", O_RDWR); - if (fd < 0) fd = open("/", O_RDONLY, 0666); - if((pid = fork()) < 0) { - perror_msg("DAEMON: fail to fork"); - return -1; - } - if (pid) exit(EXIT_SUCCESS); - - setsid(); - dup2(fd, 0); - dup2(fd, 1); - dup2(fd, 2); - if (fd > 2) close(fd); - return 0; -} - /* * Read kernel ring buffer in local buff and keep track of * "used" amount to track next read to start. @@ -116,13 +67,36 @@ void klogd_main(void) sigatexit(handle_signal); if (toys.optflags & FLAG_c) set_log_level(TT.level); //set log level - if (!(toys.optflags & FLAG_n)) daemonize(); //Make it daemon - open_klogd(); + if (!(toys.optflags & FLAG_n)) { //Make it daemon + pid_t pid; + int fd = open("/dev/null", O_RDWR); + if (fd < 0) fd = open("/", O_RDONLY, 0666); + if((pid = fork()) < 0) perror_exit("DAEMON: fail to fork"); + if (pid) exit(EXIT_SUCCESS); + + setsid(); + dup2(fd, 0); + dup2(fd, 1); + dup2(fd, 2); + if (fd > 2) close(fd); + } + + if (CFG_KLOGD_SOURCE_RING_BUFFER) { + syslog(LOG_NOTICE, "KLOGD: started with Kernel ring buffer as log source\n"); + klogctl(1, NULL, 0); + } else { + TT.fd = xopen("/proc/kmsg", O_RDONLY); //_PATH_KLOG in paths.h + syslog(LOG_NOTICE, "KLOGD: started with /proc/kmsg as log source\n"); + } openlog("Kernel", 0, LOG_KERN); //open connection to system logger.. while(1) { start = msg_buffer + used; //start updated for re-read. - size = read_klogd(start, sizeof(msg_buffer) - used - 1); + if (CFG_KLOGD_SOURCE_RING_BUFFER) { + size = klogctl(2, start, sizeof(msg_buffer) - used - 1); + } else { + size = xread(TT.fd, start, sizeof(msg_buffer) - used - 1); + } if (size < 0) perror_exit("error reading file:"); start[size] = '\0'; //Ensure last line to be NUL terminated. if (used) start = msg_buffer; |