diff toys/pending/klogd.c @ 994:00c7b6f4104a

Cleanup klogd Remove #if and inline most functions
author Felix Janda <felix.janda@posteo.de>
date Sat, 10 Aug 2013 19:35:11 +0200
parents 5a50be9d00a7
children 893c86bbe452
line wrap: on
line diff
--- a/toys/pending/klogd.c	Fri Aug 09 20:46:02 2013 +0200
+++ b/toys/pending/klogd.c	Sat Aug 10 19:35:11 2013 +0200
@@ -24,87 +24,38 @@
 #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 @@
 
   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;