1*cf5a6c84SAndroid Build Coastguard Worker /* klogd.c - Klogd, The kernel log Dameon.
2*cf5a6c84SAndroid Build Coastguard Worker *
3*cf5a6c84SAndroid Build Coastguard Worker * Copyright 2013 Sandeep Sharma <[email protected]>
4*cf5a6c84SAndroid Build Coastguard Worker * Copyright 2013 Kyungwan Han <[email protected]>
5*cf5a6c84SAndroid Build Coastguard Worker *
6*cf5a6c84SAndroid Build Coastguard Worker * No standard
7*cf5a6c84SAndroid Build Coastguard Worker
8*cf5a6c84SAndroid Build Coastguard Worker USE_KLOGD(NEWTOY(klogd, "c#<1>8ns", TOYFLAG_SBIN))
9*cf5a6c84SAndroid Build Coastguard Worker
10*cf5a6c84SAndroid Build Coastguard Worker config KLOGD
11*cf5a6c84SAndroid Build Coastguard Worker bool "klogd"
12*cf5a6c84SAndroid Build Coastguard Worker default n
13*cf5a6c84SAndroid Build Coastguard Worker help
14*cf5a6c84SAndroid Build Coastguard Worker usage: klogd [-n] [-c PRIORITY]
15*cf5a6c84SAndroid Build Coastguard Worker
16*cf5a6c84SAndroid Build Coastguard Worker -c Print to console messages more urgent than PRIORITY (1-8)"
17*cf5a6c84SAndroid Build Coastguard Worker -n Run in foreground
18*cf5a6c84SAndroid Build Coastguard Worker -s Use syscall instead of /proc
19*cf5a6c84SAndroid Build Coastguard Worker */
20*cf5a6c84SAndroid Build Coastguard Worker
21*cf5a6c84SAndroid Build Coastguard Worker #define FOR_klogd
22*cf5a6c84SAndroid Build Coastguard Worker #include "toys.h"
23*cf5a6c84SAndroid Build Coastguard Worker #include <sys/klog.h>
24*cf5a6c84SAndroid Build Coastguard Worker
GLOBALS(long level;int fd;)25*cf5a6c84SAndroid Build Coastguard Worker GLOBALS(
26*cf5a6c84SAndroid Build Coastguard Worker long level;
27*cf5a6c84SAndroid Build Coastguard Worker
28*cf5a6c84SAndroid Build Coastguard Worker int fd;
29*cf5a6c84SAndroid Build Coastguard Worker )
30*cf5a6c84SAndroid Build Coastguard Worker
31*cf5a6c84SAndroid Build Coastguard Worker static void set_log_level(int level)
32*cf5a6c84SAndroid Build Coastguard Worker {
33*cf5a6c84SAndroid Build Coastguard Worker if (FLAG(s)) klogctl(8, 0, level);
34*cf5a6c84SAndroid Build Coastguard Worker else {
35*cf5a6c84SAndroid Build Coastguard Worker FILE *fptr = xfopen("/proc/sys/kernel/printk", "w");
36*cf5a6c84SAndroid Build Coastguard Worker
37*cf5a6c84SAndroid Build Coastguard Worker fprintf(fptr, "%u\n", level);
38*cf5a6c84SAndroid Build Coastguard Worker fclose(fptr);
39*cf5a6c84SAndroid Build Coastguard Worker }
40*cf5a6c84SAndroid Build Coastguard Worker }
41*cf5a6c84SAndroid Build Coastguard Worker
handle_signal(int sig)42*cf5a6c84SAndroid Build Coastguard Worker static void handle_signal(int sig)
43*cf5a6c84SAndroid Build Coastguard Worker {
44*cf5a6c84SAndroid Build Coastguard Worker if (FLAG(s)) {
45*cf5a6c84SAndroid Build Coastguard Worker klogctl(7, 0, 0);
46*cf5a6c84SAndroid Build Coastguard Worker klogctl(0, 0, 0);
47*cf5a6c84SAndroid Build Coastguard Worker } else {
48*cf5a6c84SAndroid Build Coastguard Worker set_log_level(7); // TODO: hardwired? Old value...?
49*cf5a6c84SAndroid Build Coastguard Worker xclose(TT.fd);
50*cf5a6c84SAndroid Build Coastguard Worker }
51*cf5a6c84SAndroid Build Coastguard Worker syslog(LOG_NOTICE, "KLOGD: Daemon exiting......");
52*cf5a6c84SAndroid Build Coastguard Worker
53*cf5a6c84SAndroid Build Coastguard Worker toys.exitval = 1;
54*cf5a6c84SAndroid Build Coastguard Worker xexit();
55*cf5a6c84SAndroid Build Coastguard Worker }
56*cf5a6c84SAndroid Build Coastguard Worker
57*cf5a6c84SAndroid Build Coastguard Worker // Read kernel ring buffer in local buff and keep track of
58*cf5a6c84SAndroid Build Coastguard Worker // "used" amount to track next read to start.
klogd_main(void)59*cf5a6c84SAndroid Build Coastguard Worker void klogd_main(void)
60*cf5a6c84SAndroid Build Coastguard Worker {
61*cf5a6c84SAndroid Build Coastguard Worker int prio, size, used = 0;
62*cf5a6c84SAndroid Build Coastguard Worker char *start, *line_start;
63*cf5a6c84SAndroid Build Coastguard Worker
64*cf5a6c84SAndroid Build Coastguard Worker if (!FLAG(n) xvdaemon();
65*cf5a6c84SAndroid Build Coastguard Worker sigatexit(handle_signal);
66*cf5a6c84SAndroid Build Coastguard Worker if (FLAG(c)) set_log_level(TT.level); //set log level
67*cf5a6c84SAndroid Build Coastguard Worker
68*cf5a6c84SAndroid Build Coastguard Worker if (FLAG(s)) klogctl(1, 0, 0);
69*cf5a6c84SAndroid Build Coastguard Worker else TT.fd = xopenro("/proc/kmsg"); //_PATH_KLOG in paths.h
70*cf5a6c84SAndroid Build Coastguard Worker syslog(LOG_NOTICE, "KLOGD: started with %s as log source\n",
71*cf5a6c84SAndroid Build Coastguard Worker FLAG(s) ? "Kernel ring buffer" : "/proc/kmsg");
72*cf5a6c84SAndroid Build Coastguard Worker openlog("Kernel", 0, LOG_KERN); //open connection to system logger..
73*cf5a6c84SAndroid Build Coastguard Worker
74*cf5a6c84SAndroid Build Coastguard Worker for (;;) {
75*cf5a6c84SAndroid Build Coastguard Worker start = toybuf + used; //start updated for re-read.
76*cf5a6c84SAndroid Build Coastguard Worker size = sizeof(toybuf)-used-1;
77*cf5a6c84SAndroid Build Coastguard Worker if (FLAG(s)) size = klogctl(2, start, size);
78*cf5a6c84SAndroid Build Coastguard Worker else size = xread(TT.fd, start, size);
79*cf5a6c84SAndroid Build Coastguard Worker if (size < 0) perror_exit("error reading file:");
80*cf5a6c84SAndroid Build Coastguard Worker start[size] = 0;
81*cf5a6c84SAndroid Build Coastguard Worker if (used) start = toybuf;
82*cf5a6c84SAndroid Build Coastguard Worker while (start) {
83*cf5a6c84SAndroid Build Coastguard Worker if ((line_start = strsep(&start, "\n")) && start) used = 0;
84*cf5a6c84SAndroid Build Coastguard Worker else { //Incomplete line, copy it to start of buff.
85*cf5a6c84SAndroid Build Coastguard Worker used = strlen(line_start);
86*cf5a6c84SAndroid Build Coastguard Worker strcpy(toybuf, line_start);
87*cf5a6c84SAndroid Build Coastguard Worker if (used < (sizeof(toybuf) - 1)) break;
88*cf5a6c84SAndroid Build Coastguard Worker used = 0; //we have buffer full, log it as it is.
89*cf5a6c84SAndroid Build Coastguard Worker }
90*cf5a6c84SAndroid Build Coastguard Worker prio = LOG_INFO; //we dont know priority, mark it INFO
91*cf5a6c84SAndroid Build Coastguard Worker if (*line_start == '<') { //we have new line to syslog
92*cf5a6c84SAndroid Build Coastguard Worker line_start++;
93*cf5a6c84SAndroid Build Coastguard Worker if (line_start) prio = strtoul(line_start, &line_start, 10);
94*cf5a6c84SAndroid Build Coastguard Worker if (*line_start == '>') line_start++;
95*cf5a6c84SAndroid Build Coastguard Worker }
96*cf5a6c84SAndroid Build Coastguard Worker if (*line_start) syslog(prio, "%s", line_start);
97*cf5a6c84SAndroid Build Coastguard Worker }
98*cf5a6c84SAndroid Build Coastguard Worker }
99*cf5a6c84SAndroid Build Coastguard Worker }
100