Move init to libbase logging.
Change-Id: Ibfbefeff587a69e948978a037c555fd12a5ade6a
diff --git a/init/log.cpp b/init/log.cpp
index ace9fd7..ee75ffc 100644
--- a/init/log.cpp
+++ b/init/log.cpp
@@ -22,48 +22,53 @@
#include <selinux/selinux.h>
-#include <android-base/stringprintf.h>
+static const int kLogSeverityToKLogLevel[] = {
+ KLOG_NOTICE_LEVEL, KLOG_DEBUG_LEVEL, KLOG_INFO_LEVEL,
+ KLOG_WARNING_LEVEL, KLOG_ERROR_LEVEL, KLOG_ERROR_LEVEL,
+};
+static_assert(arraysize(kLogSeverityToKLogLevel) == android::base::FATAL + 1,
+ "Mismatch in size of kLogSeverityToKLogLevel and values in LogSeverity");
-static void init_klog_vwrite(int level, const char* fmt, va_list ap) {
- static const char* tag = basename(getprogname());
-
+static void KernelLogger(android::base::LogId, android::base::LogSeverity severity,
+ const char* tag, const char*, unsigned int, const char* msg) {
+ int level = kLogSeverityToKLogLevel[severity];
if (level > klog_get_level()) return;
// The kernel's printk buffer is only 1024 bytes.
// TODO: should we automatically break up long lines into multiple lines?
// Or we could log but with something like "..." at the end?
char buf[1024];
- size_t prefix_size = snprintf(buf, sizeof(buf), "<%d>%s: ", level, tag);
- size_t msg_size = vsnprintf(buf + prefix_size, sizeof(buf) - prefix_size, fmt, ap);
- if (msg_size >= sizeof(buf) - prefix_size) {
- msg_size = snprintf(buf + prefix_size, sizeof(buf) - prefix_size,
- "(%zu-byte message too long for printk)\n", msg_size);
+ size_t size = snprintf(buf, sizeof(buf), "<%d>%s: %s\n", level, tag, msg);
+ if (size > sizeof(buf)) {
+ size = snprintf(buf, sizeof(buf), "<%d>%s: %zu-byte message too long for printk\n",
+ level, tag, size);
}
iovec iov[1];
iov[0].iov_base = buf;
- iov[0].iov_len = prefix_size + msg_size;
-
+ iov[0].iov_len = size;
klog_writev(level, iov, 1);
}
-void init_klog_write(int level, const char* fmt, ...) {
- va_list ap;
- va_start(ap, fmt);
- init_klog_vwrite(level, fmt, ap);
- va_end(ap);
+void InitKernelLogging(char* argv[]) {
+ android::base::InitLogging(argv, &KernelLogger);
+
+ klog_init();
+ klog_set_level(KLOG_NOTICE_LEVEL);
}
int selinux_klog_callback(int type, const char *fmt, ...) {
- int level = KLOG_ERROR_LEVEL;
+ android::base::LogSeverity severity = android::base::ERROR;
if (type == SELINUX_WARNING) {
- level = KLOG_WARNING_LEVEL;
+ severity = android::base::WARNING;
} else if (type == SELINUX_INFO) {
- level = KLOG_INFO_LEVEL;
+ severity = android::base::INFO;
}
+ char buf[1024];
va_list ap;
va_start(ap, fmt);
- init_klog_vwrite(level, fmt, ap);
+ vsnprintf(buf, sizeof(buf), fmt, ap);
va_end(ap);
+ KernelLogger(android::base::MAIN, severity, "selinux", nullptr, 0, buf);
return 0;
}