aboutsummaryrefslogtreecommitdiff
path: root/toys/pending/klogd.c
diff options
context:
space:
mode:
Diffstat (limited to 'toys/pending/klogd.c')
-rw-r--r--toys/pending/klogd.c104
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;