Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 35f5d046 authored by Elliott Hughes's avatar Elliott Hughes
Browse files

Fix early init logging.

Remove the /dev/__kmsg__ workarounds (which can then be removed
from sepolicy), and fix confusion in the translation between
android-base logging and kernel logging priorities (in particular,
where 'notice' comes in the hierarchy).

Bug: http://b/30317429
Change-Id: I6eaf9919904b6b55bc402c20bf1a4ae269014bc7
Test: adb shell dmesg | grep init
parent 00a4ee0f
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -118,7 +118,7 @@ void Action::ExecuteCommand(const Command& command) const {
    Timer t;
    int result = command.InvokeFunc();

    if (klog_get_level() >= KLOG_INFO_LEVEL) {
    if (klog_get_level() >= KLOG_DEBUG_LEVEL) {
        std::string trigger_name = BuildTriggersString();
        std::string cmd_str = command.BuildCommandString();
        std::string source = command.BuildSourceString();
+5 −4
Original line number Diff line number Diff line
@@ -29,6 +29,7 @@
#include <sys/mount.h>
#include <sys/socket.h>
#include <sys/stat.h>
#include <sys/sysmacros.h>
#include <sys/types.h>
#include <sys/un.h>
#include <sys/wait.h>
@@ -487,12 +488,11 @@ int main(int argc, char** argv) {
        mount("proc", "/proc", "proc", 0, "hidepid=2,gid=" MAKE_STR(AID_READPROC));
        mount("sysfs", "/sys", "sysfs", 0, NULL);
        mount("selinuxfs", "/sys/fs/selinux", "selinuxfs", 0, NULL);
        mknod("/dev/kmsg", S_IFCHR | 0600, makedev(1, 11));
    }

    // We must have some place other than / to create the device nodes for
    // kmsg and null, otherwise we won't be able to remount / read-only
    // later on. Now that tmpfs is mounted on /dev, we can actually talk
    // to the outside world.
    // Now that tmpfs is mounted on /dev and we have /dev/kmsg, we can actually
    // talk to the outside world...
    InitKernelLogging(argv);

    LOG(INFO) << "init " << (is_first_stage ? "first stage" : "second stage") << " started!";
@@ -536,6 +536,7 @@ int main(int argc, char** argv) {
    // This must happen before /dev is populated by ueventd.
    LOG(INFO) << "Running restorecon...";
    restorecon("/dev");
    restorecon("/dev/kmsg");
    restorecon("/dev/socket");
    restorecon("/dev/__properties__");
    restorecon("/property_contexts");
+7 −3
Original line number Diff line number Diff line
@@ -26,8 +26,12 @@
#include <selinux/selinux.h>

static const int kLogSeverityToKLogLevel[] = {
    KLOG_NOTICE_LEVEL, KLOG_DEBUG_LEVEL, KLOG_INFO_LEVEL,
    KLOG_WARNING_LEVEL, KLOG_ERROR_LEVEL, KLOG_ERROR_LEVEL,
    [android::base::VERBOSE] = KLOG_DEBUG_LEVEL,
    [android::base::DEBUG] = KLOG_DEBUG_LEVEL,
    [android::base::INFO] = KLOG_INFO_LEVEL,
    [android::base::WARNING] = KLOG_WARNING_LEVEL,
    [android::base::ERROR] = KLOG_ERROR_LEVEL,
    [android::base::FATAL] = KLOG_ERROR_LEVEL,
};
static_assert(arraysize(kLogSeverityToKLogLevel) == android::base::FATAL + 1,
              "Mismatch in size of kLogSeverityToKLogLevel and values in LogSeverity");
@@ -68,7 +72,7 @@ void InitKernelLogging(char* argv[]) {
    if (fd > 2) close(fd);

    android::base::InitLogging(argv, &KernelLogger);
    klog_set_level(KLOG_NOTICE_LEVEL);
    klog_set_level(KLOG_INFO_LEVEL);
}

int selinux_klog_callback(int type, const char *fmt, ...) {
+1 −9
Original line number Diff line number Diff line
@@ -37,15 +37,7 @@ void klog_set_level(int level) {
}

static int __open_klog(void) {
    int fd = open("/dev/kmsg", O_WRONLY | O_CLOEXEC);
    if (fd == -1) {
        static const char* name = "/dev/__kmsg__";
        if (mknod(name, S_IFCHR | 0600, (1 << 8) | 11) == 0) {
            fd = open(name, O_WRONLY | O_CLOEXEC);
            unlink(name);
        }
    }
    return fd;
    return TEMP_FAILURE_RETRY(open("/dev/kmsg", O_WRONLY | O_CLOEXEC));
}

#define LOG_BUF_MAX 512