Mercurial > hg > toybox
annotate 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 |
rev | line source |
---|---|
950
a4a6bcf32657
klogd, submitted by Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
1 /* klogd.c - Klogd, The kernel log Dameon. |
a4a6bcf32657
klogd, submitted by Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
2 * |
974
5a50be9d00a7
The attached KLOGD patch is an improved version of the one you have in hg.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
955
diff
changeset
|
3 * Copyright 2013 Sandeep Sharma <sandeep.jack2756@gmail.com> |
950
a4a6bcf32657
klogd, submitted by Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
4 * |
a4a6bcf32657
klogd, submitted by Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
5 * No standard |
a4a6bcf32657
klogd, submitted by Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
6 |
a4a6bcf32657
klogd, submitted by Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
7 USE_KLOGD(NEWTOY(klogd, "c#<1>8n", TOYFLAG_SBIN)) |
a4a6bcf32657
klogd, submitted by Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
8 |
a4a6bcf32657
klogd, submitted by Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
9 config KLOGD |
a4a6bcf32657
klogd, submitted by Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
10 bool "klogd" |
974
5a50be9d00a7
The attached KLOGD patch is an improved version of the one you have in hg.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
955
diff
changeset
|
11 default n |
950
a4a6bcf32657
klogd, submitted by Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
12 help |
a4a6bcf32657
klogd, submitted by Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
13 usage: klogd [-n] [-c N] |
a4a6bcf32657
klogd, submitted by Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
14 |
a4a6bcf32657
klogd, submitted by Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
15 -c N Print to console messages more urgent than prio N (1-8)" |
a4a6bcf32657
klogd, submitted by Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
16 -n Run in foreground. |
a4a6bcf32657
klogd, submitted by Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
17 |
a4a6bcf32657
klogd, submitted by Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
18 config KLOGD_SOURCE_RING_BUFFER |
a4a6bcf32657
klogd, submitted by Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
19 bool "enable kernel ring buffer as log source." |
a4a6bcf32657
klogd, submitted by Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
20 default n |
a4a6bcf32657
klogd, submitted by Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
21 depends on KLOGD |
a4a6bcf32657
klogd, submitted by Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
22 */ |
a4a6bcf32657
klogd, submitted by Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
23 |
a4a6bcf32657
klogd, submitted by Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
24 #define FOR_klogd |
a4a6bcf32657
klogd, submitted by Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
25 #include "toys.h" |
974
5a50be9d00a7
The attached KLOGD patch is an improved version of the one you have in hg.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
955
diff
changeset
|
26 #include <signal.h> |
994 | 27 #include <sys/klog.h> |
950
a4a6bcf32657
klogd, submitted by Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
28 GLOBALS( |
a4a6bcf32657
klogd, submitted by Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
29 long level; |
994 | 30 |
950
a4a6bcf32657
klogd, submitted by Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
31 int fd; |
a4a6bcf32657
klogd, submitted by Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
32 ) |
a4a6bcf32657
klogd, submitted by Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
33 |
a4a6bcf32657
klogd, submitted by Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
34 static void set_log_level(int level) |
a4a6bcf32657
klogd, submitted by Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
35 { |
994 | 36 if (CFG_KLOGD_SOURCE_RING_BUFFER) |
37 klogctl(8, NULL, level); | |
38 else { | |
950
a4a6bcf32657
klogd, submitted by Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
39 FILE *fptr = xfopen("/proc/sys/kernel/printk", "w"); |
a4a6bcf32657
klogd, submitted by Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
40 fprintf(fptr, "%u\n", level); |
a4a6bcf32657
klogd, submitted by Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
41 fclose(fptr); |
a4a6bcf32657
klogd, submitted by Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
42 fptr = NULL; |
994 | 43 } |
950
a4a6bcf32657
klogd, submitted by Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
44 } |
974
5a50be9d00a7
The attached KLOGD patch is an improved version of the one you have in hg.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
955
diff
changeset
|
45 |
950
a4a6bcf32657
klogd, submitted by Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
46 static void handle_signal(int sig) |
a4a6bcf32657
klogd, submitted by Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
47 { |
994 | 48 if (CFG_KLOGD_SOURCE_RING_BUFFER) { |
49 klogctl(7, NULL, 0); | |
50 klogctl(0, NULL, 0); | |
51 } else { | |
52 set_log_level(7); | |
53 xclose(TT.fd); | |
54 } | |
950
a4a6bcf32657
klogd, submitted by Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
55 syslog(LOG_NOTICE,"KLOGD: Daemon exiting......"); |
a4a6bcf32657
klogd, submitted by Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
56 exit(1); |
a4a6bcf32657
klogd, submitted by Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
57 } |
a4a6bcf32657
klogd, submitted by Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
58 |
a4a6bcf32657
klogd, submitted by Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
59 /* |
a4a6bcf32657
klogd, submitted by Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
60 * Read kernel ring buffer in local buff and keep track of |
a4a6bcf32657
klogd, submitted by Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
61 * "used" amount to track next read to start. |
a4a6bcf32657
klogd, submitted by Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
62 */ |
a4a6bcf32657
klogd, submitted by Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
63 void klogd_main(void) |
a4a6bcf32657
klogd, submitted by Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
64 { |
974
5a50be9d00a7
The attached KLOGD patch is an improved version of the one you have in hg.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
955
diff
changeset
|
65 int prio, size, used = 0; |
5a50be9d00a7
The attached KLOGD patch is an improved version of the one you have in hg.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
955
diff
changeset
|
66 char *start, *line_start, msg_buffer[16348]; //LOG_LINE_LENGTH - Ring buffer size |
950
a4a6bcf32657
klogd, submitted by Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
67 |
a4a6bcf32657
klogd, submitted by Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
68 sigatexit(handle_signal); |
974
5a50be9d00a7
The attached KLOGD patch is an improved version of the one you have in hg.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
955
diff
changeset
|
69 if (toys.optflags & FLAG_c) set_log_level(TT.level); //set log level |
994 | 70 if (!(toys.optflags & FLAG_n)) { //Make it daemon |
71 pid_t pid; | |
72 int fd = open("/dev/null", O_RDWR); | |
73 if (fd < 0) fd = open("/", O_RDONLY, 0666); | |
74 if((pid = fork()) < 0) perror_exit("DAEMON: fail to fork"); | |
75 if (pid) exit(EXIT_SUCCESS); | |
76 | |
77 setsid(); | |
78 dup2(fd, 0); | |
79 dup2(fd, 1); | |
80 dup2(fd, 2); | |
81 if (fd > 2) close(fd); | |
82 } | |
83 | |
84 if (CFG_KLOGD_SOURCE_RING_BUFFER) { | |
85 syslog(LOG_NOTICE, "KLOGD: started with Kernel ring buffer as log source\n"); | |
86 klogctl(1, NULL, 0); | |
87 } else { | |
88 TT.fd = xopen("/proc/kmsg", O_RDONLY); //_PATH_KLOG in paths.h | |
89 syslog(LOG_NOTICE, "KLOGD: started with /proc/kmsg as log source\n"); | |
90 } | |
950
a4a6bcf32657
klogd, submitted by Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
91 openlog("Kernel", 0, LOG_KERN); //open connection to system logger.. |
a4a6bcf32657
klogd, submitted by Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
92 |
a4a6bcf32657
klogd, submitted by Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
93 while(1) { |
a4a6bcf32657
klogd, submitted by Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
94 start = msg_buffer + used; //start updated for re-read. |
994 | 95 if (CFG_KLOGD_SOURCE_RING_BUFFER) { |
96 size = klogctl(2, start, sizeof(msg_buffer) - used - 1); | |
97 } else { | |
98 size = xread(TT.fd, start, sizeof(msg_buffer) - used - 1); | |
99 } | |
950
a4a6bcf32657
klogd, submitted by Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
100 if (size < 0) perror_exit("error reading file:"); |
a4a6bcf32657
klogd, submitted by Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
101 start[size] = '\0'; //Ensure last line to be NUL terminated. |
974
5a50be9d00a7
The attached KLOGD patch is an improved version of the one you have in hg.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
955
diff
changeset
|
102 if (used) start = msg_buffer; |
5a50be9d00a7
The attached KLOGD patch is an improved version of the one you have in hg.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
955
diff
changeset
|
103 while(start) { |
5a50be9d00a7
The attached KLOGD patch is an improved version of the one you have in hg.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
955
diff
changeset
|
104 if ((line_start = strsep(&start, "\n")) != NULL && start != NULL) used = 0; |
950
a4a6bcf32657
klogd, submitted by Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
105 else { //Incomplete line, copy it to start of buff. |
a4a6bcf32657
klogd, submitted by Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
106 used = strlen(line_start); |
a4a6bcf32657
klogd, submitted by Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
107 strcpy(msg_buffer, line_start); |
974
5a50be9d00a7
The attached KLOGD patch is an improved version of the one you have in hg.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
955
diff
changeset
|
108 if (used < (sizeof(msg_buffer) - 1)) break; |
950
a4a6bcf32657
klogd, submitted by Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
109 used = 0; //we have buffer full, log it as it is. |
a4a6bcf32657
klogd, submitted by Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
110 } |
a4a6bcf32657
klogd, submitted by Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
111 prio = LOG_INFO; //we dont know priority, mark it INFO |
974
5a50be9d00a7
The attached KLOGD patch is an improved version of the one you have in hg.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
955
diff
changeset
|
112 if (*line_start == '<') { //we have new line to syslog |
950
a4a6bcf32657
klogd, submitted by Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
113 line_start++; |
974
5a50be9d00a7
The attached KLOGD patch is an improved version of the one you have in hg.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
955
diff
changeset
|
114 if (line_start) prio = (int)strtoul(line_start, &line_start, 10); |
5a50be9d00a7
The attached KLOGD patch is an improved version of the one you have in hg.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
955
diff
changeset
|
115 if (*line_start == '>') line_start++; |
950
a4a6bcf32657
klogd, submitted by Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
116 } |
974
5a50be9d00a7
The attached KLOGD patch is an improved version of the one you have in hg.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
955
diff
changeset
|
117 if (*line_start) syslog(prio, "%s", line_start); |
950
a4a6bcf32657
klogd, submitted by Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
118 } |
a4a6bcf32657
klogd, submitted by Ashwini Sharma.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
119 } |
974
5a50be9d00a7
The attached KLOGD patch is an improved version of the one you have in hg.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
955
diff
changeset
|
120 } |