[Toybox] [PATCH] New Toy - Klogd
Ashwini Sharma
ak.ashwini at gmail.com
Fri Jul 26 00:23:19 PDT 2013
Hi Rob,
The attached KLOGD patch is an improved version of the one you have in hg.
This also has a fix for boundary condition crash.
regards,
Ashwini
On Mon, Jul 15, 2013 at 11:05 PM, Isaac <idunham at lavabit.com> wrote:
> On Mon, Jul 15, 2013 at 03:43:27PM +0530, Ashwini Sharma wrote:
> > Hi Rob,
> >
> > I have implemented klogd, Klogd has both the options as its source,
> > 1. Reading from kernel ring buffer, thru KLOGCTL interface
> > 2. Reading from "/proc/kmsg". This is Configurable option.
> >
> >
> > Attached is the patch for klogd.
> >
> > Let me know for any comments you have.
> >
> >
> > Thanks,
> > Ashwini
>
> From what I've seen, you might want to change a couple things.
>
> --- /dev/null 2013-07-15 12:17:51.251463096 +0900
> +++ toys/other/klogd.c 2013-07-15 19:06:19.188909098 +0900
> @@ -0,0 +1,146 @@
> +/* klogd.c - Klogd, The kernel log Dameon.
> + *
> + * Copyright 2013 Sandeep Sharma <sandeep.jack2756 at gmail.com>
> + *
> + * No standard
> +
> +USE_KLOGD(NEWTOY(klogd, "c#<1>8n", TOYFLAG_SBIN))
> +
> +config KLOGD
> + bool "klogd"
> + default y
> + help
> + usage: klogd [-n] [-c N]
> +
> + -c N Print to console messages more urgent than prio N (1-8)"
> + -n Run in foreground.
> +
> +config KLOGD_SOURCE_RING_BUFFER
> + bool "enable kernel ring buffer as log source."
> + default n
> + depends on KLOGD
> +*/
> +
> +#define FOR_klogd
> +#include "toys.h"
> +#include <signal.h>
> +GLOBALS(
> + long level;
> + int fd;
> +)
> +
> +#if CFG_KLOGD_SOURCE_RING_BUFFER
> Most of these functions look like they should be inlined-they're only
> called
> once.
> The approach used throughout toybox is roughly equivalent to
> if (...RING_BUFFER) {
> //use klogctl
> } else {
> //use /proc/kmesg
> }
>
> +#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)
> +{
> + 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();
> + 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;
> Trivial, but I think perror_exit is for this purpose.
>
> + }
> + if (pid) exit(EXIT_SUCCESS);
> +
> + setsid();
> + dup2(fd, 0);
> + dup2(fd, 1);
> + dup2(fd, 2);
> + if (fd > 2) close(fd);
> + return 0;
> +}
>
> AFAIK, everything except handle_signal should be inlined.
> And a less generic name should be given to that.
> +
> +/*
> + * Read kernel ring buffer in local buff and keep track of
> + * "used" amount to track next read to start.
> + */
> +void klogd_main(void)
> +{
> + int prio, size, used = 0;
> + char *start, *line_start, msg_buffer[16348]; //LOG_LINE_LENGTH - Ring
> buffer size
> +
> + 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();
> + 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 (size < 0) perror_exit("error reading file:");
> + start[size] = '\0'; //Ensure last line to be NUL terminated.
> + if (used) start = msg_buffer;
> + while(1) {
> + if ((line_start = strsep(&start, "\n")) != NULL && start != NULL)
> used = 0;
> + else { //Incomplete line, copy it to
> start of buff.
> + used = strlen(line_start);
> + strcpy(msg_buffer, line_start);
> + if (used < (sizeof(msg_buffer) - 1)) break;
> + used = 0; //we have buffer full, log it as it is.
> + }
> + prio = LOG_INFO; //we dont know priority, mark it INFO
> + if (*line_start == '<') { //we have new line to syslog
> + line_start++;
> + if (line_start) prio = (int)strtoul(line_start, &line_start, 10);
> + if (*line_start == '>') line_start++;
> + }
> + if (*line_start) syslog(prio, "%s", line_start);
> + }
> + }
> +}
>
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.landley.net/pipermail/toybox-landley.net/attachments/20130726/8eac7fb4/attachment-0006.htm>
-------------- next part --------------
A non-text attachment was scrubbed...
Name: klogd.c.patch
Type: application/octet-stream
Size: 4774 bytes
Desc: not available
URL: <http://lists.landley.net/pipermail/toybox-landley.net/attachments/20130726/8eac7fb4/attachment-0007.obj>
More information about the Toybox
mailing list