*
* Licensed under GPLv2 or later, see file LICENSE in this source tree.
*/
+//config:config KLOGD
+//config: bool "klogd"
+//config: default y
+//config: help
+//config: klogd is a utility which intercepts and logs all
+//config: messages from the Linux kernel and sends the messages
+//config: out to the 'syslogd' utility so they can be logged. If
+//config: you wish to record the messages produced by the kernel,
+//config: you should enable this option.
+//config:
+//config:comment "klogd should not be used together with syslog to kernel printk buffer"
+//config: depends on KLOGD && FEATURE_KMSG_SYSLOG
+//config:
+//config:config FEATURE_KLOGD_KLOGCTL
+//config: bool "Use the klogctl() interface"
+//config: default y
+//config: depends on KLOGD
+//config: select PLATFORM_LINUX
+//config: help
+//config: The klogd applet supports two interfaces for reading
+//config: kernel messages. Linux provides the klogctl() interface
+//config: which allows reading messages from the kernel ring buffer
+//config: independently from the file system.
+//config:
+//config: If you answer 'N' here, klogd will use the more portable
+//config: approach of reading them from /proc or a device node.
+//config: However, this method requires the file to be available.
+//config:
+//config: If in doubt, say 'Y'.
+
+//applet:IF_KLOGD(APPLET(klogd, BB_DIR_SBIN, BB_SUID_DROP))
+
+//kbuild:lib-$(CONFIG_KLOGD) += klogd.o
//usage:#define klogd_trivial_usage
//usage: "[-c N] [-n]"
//usage:#define klogd_full_usage "\n\n"
//usage: "Kernel logger\n"
-//usage: "\nOptions:"
-//usage: "\n -c N Only messages with level < N are printed to console"
+//usage: "\n -c N Print to console messages more urgent than prio N (1-8)"
//usage: "\n -n Run in foreground"
#include "libbb.h"
+#include "common_bufsiz.h"
#include <syslog.h>
#else
-# include <paths.h>
# ifndef _PATH_KLOG
# ifdef __GNU__
# define _PATH_KLOG "/dev/klog"
#define log_buffer bb_common_bufsiz1
enum {
- KLOGD_LOGBUF_SIZE = sizeof(log_buffer),
+ KLOGD_LOGBUF_SIZE = COMMON_BUFSIZE,
OPT_LEVEL = (1 << 0),
OPT_FOREGROUND = (1 << 1),
};
int opt;
int used;
+ setup_common_bufsiz();
+
opt = getopt32(argv, "c:n", &opt_c);
if (opt & OPT_LEVEL) {
/* Valid levels are between 1 and 8 */
syslog(LOG_NOTICE, "klogd started: %s", bb_banner);
+ write_pidfile(CONFIG_PID_FILE_PATH "/klogd.pid");
+
used = 0;
while (!bb_got_signal) {
int n;
priority = LOG_INFO;
if (*start == '<') {
start++;
- if (*start) {
- /* kernel never generates multi-digit prios */
- priority = (*start - '0');
- start++;
- }
+ if (*start)
+ priority = strtoul(start, &start, 10);
if (*start == '>')
start++;
}
klogd_close();
syslog(LOG_NOTICE, "klogd: exiting");
+ remove_pidfile(CONFIG_PID_FILE_PATH "/klogd.pid");
if (bb_got_signal)
kill_myself_with_sig(bb_got_signal);
return EXIT_FAILURE;