xref: /aosp_15_r20/external/toybox/toys/pending/klogd.c (revision cf5a6c84e2b8763fc1a7db14496fd4742913b199)
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