From af6965eefa1a958a1deebdd153e997aa387fc12f Mon Sep 17 00:00:00 2001 From: topjohnwu Date: Mon, 26 Feb 2024 17:49:11 -0800 Subject: [PATCH] Update init logging implementation Use less std::fs --- native/src/init/logging.rs | 60 ++++++++++++++++++-------------------- 1 file changed, 28 insertions(+), 32 deletions(-) diff --git a/native/src/init/logging.rs b/native/src/init/logging.rs index c907aa3ec..e38b915b0 100644 --- a/native/src/init/logging.rs +++ b/native/src/init/logging.rs @@ -1,58 +1,54 @@ -use std::fs; use std::fs::File; use std::io::{IoSlice, Write}; -use std::sync::OnceLock; use base::libc::{ - close, makedev, mknod, open, syscall, unlink, SYS_dup3, O_CLOEXEC, O_RDWR, STDERR_FILENO, - STDIN_FILENO, STDOUT_FILENO, S_IFCHR, + makedev, mknod, syscall, SYS_dup3, O_CLOEXEC, O_RDWR, O_WRONLY, STDERR_FILENO, STDIN_FILENO, + STDOUT_FILENO, S_IFCHR, }; -use base::{cstr, exit_on_error, raw_cstr, LogLevel, Logger, Utf8CStr, LOGGER}; +use base::{cstr, exit_on_error, open_fd, raw_cstr, FsPath, LogLevel, Logger, Utf8CStr, LOGGER}; -static KMSG: OnceLock = OnceLock::new(); +// SAFETY: magiskinit is single threaded +static mut KMSG: Option = None; pub fn setup_klog() { - // Shut down first 3 fds unsafe { - let mut fd = open(raw_cstr!("/dev/null"), O_RDWR | O_CLOEXEC); - if fd < 0 { + // Shut down first 3 fds + let mut fd = open_fd!(cstr!("/dev/null"), O_RDWR | O_CLOEXEC); + if fd.is_err() { mknod(raw_cstr!("/null"), S_IFCHR | 0o666, makedev(1, 3)); - fd = open(raw_cstr!("/null"), O_RDWR | O_CLOEXEC); - fs::remove_file("/null").ok(); + fd = open_fd!(cstr!("/null"), O_RDWR | O_CLOEXEC); + FsPath::from(cstr!("/null")).remove().ok(); + } + if let Ok(ref fd) = fd { + syscall(SYS_dup3, fd, STDIN_FILENO, O_CLOEXEC); + syscall(SYS_dup3, fd, STDOUT_FILENO, O_CLOEXEC); + syscall(SYS_dup3, fd, STDERR_FILENO, O_CLOEXEC); } - syscall(SYS_dup3, fd, STDIN_FILENO, O_CLOEXEC); - syscall(SYS_dup3, fd, STDOUT_FILENO, O_CLOEXEC); - syscall(SYS_dup3, fd, STDERR_FILENO, O_CLOEXEC); - if fd > STDERR_FILENO { - close(fd); - } - } - - if let Ok(kmsg) = File::options().write(true).open("/dev/kmsg") { - KMSG.set(kmsg).ok(); - } else { - unsafe { + // Then open kmsg fd + let mut fd = open_fd!(cstr!("/dev/kmsg"), O_WRONLY | O_CLOEXEC); + if fd.is_err() { mknod(raw_cstr!("/kmsg"), S_IFCHR | 0o666, makedev(1, 11)); - KMSG.set(File::options().write(true).open("/kmsg").unwrap()) - .ok(); - unlink(raw_cstr!("/kmsg")); + fd = open_fd!(cstr!("/kmsg"), O_WRONLY | O_CLOEXEC); + FsPath::from(cstr!("/kmsg")).remove().ok(); } + KMSG = fd.map(|fd| fd.into()).ok(); } // Disable kmsg rate limiting - if let Ok(mut rate) = File::options() - .write(true) - .open("/proc/sys/kernel/printk_devkmsg") - { + if let Ok(rate) = open_fd!( + cstr!("/proc/sys/kernel/printk_devkmsg"), + O_WRONLY | O_CLOEXEC + ) { + let mut rate = File::from(rate); writeln!(rate, "on").ok(); } fn kmsg_log_write(_: LogLevel, msg: &Utf8CStr) { - if let Some(kmsg) = KMSG.get().as_mut() { + if let Some(kmsg) = unsafe { &mut KMSG } { let io1 = IoSlice::new("magiskinit: ".as_bytes()); let io2 = IoSlice::new(msg.as_bytes()); - kmsg.write_vectored(&[io1, io2]).ok(); + let _ = kmsg.write_vectored(&[io1, io2]).ok(); } }