You've already forked Magisk
mirror of
https://github.com/topjohnwu/Magisk.git
synced 2025-09-06 06:36:58 +00:00
Implement magiskinit logging in Rust
This commit is contained in:
+56
-14
@@ -1,27 +1,69 @@
|
||||
use base::ffi::LogLevel;
|
||||
use base::*;
|
||||
use std::fmt::Arguments;
|
||||
use std::fs;
|
||||
use std::fs::File;
|
||||
use std::io::Write;
|
||||
use std::sync::OnceLock;
|
||||
|
||||
extern "C" {
|
||||
fn klog_write(msg: *const u8, len: i32);
|
||||
}
|
||||
use base::ffi::LogLevel;
|
||||
use base::libc::{
|
||||
close, makedev, mknod, open, syscall, unlink, SYS_dup3, O_CLOEXEC, O_RDWR, STDERR_FILENO,
|
||||
STDIN_FILENO, STDOUT_FILENO, S_IFCHR,
|
||||
};
|
||||
use base::*;
|
||||
|
||||
static KMSG: OnceLock<File> = OnceLock::new();
|
||||
|
||||
pub fn setup_klog() {
|
||||
const PREFIX: &[u8; 12] = b"magiskinit: ";
|
||||
const PFX_LEN: usize = PREFIX.len();
|
||||
// Shut down first 3 fds
|
||||
unsafe {
|
||||
let mut fd = open(str_ptr!("/dev/null"), O_RDWR | O_CLOEXEC);
|
||||
if fd < 0 {
|
||||
mknod(str_ptr!("/null"), S_IFCHR | 0666, makedev(1, 3));
|
||||
fd = open(str_ptr!("/null"), O_RDWR | O_CLOEXEC);
|
||||
fs::remove_file("/null").ok();
|
||||
}
|
||||
|
||||
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 {
|
||||
mknod(str_ptr!("/kmsg"), S_IFCHR | 0666, makedev(1, 11));
|
||||
KMSG.set(File::options().write(true).open("/kmsg").unwrap())
|
||||
.ok();
|
||||
unlink(str_ptr!("/kmsg"));
|
||||
}
|
||||
}
|
||||
|
||||
// Disable kmsg rate limiting
|
||||
if let Ok(mut rate) = File::options()
|
||||
.write(true)
|
||||
.open("/proc/sys/kernel/printk_devkmsg")
|
||||
{
|
||||
writeln!(rate, "on").ok();
|
||||
}
|
||||
|
||||
fn klog_fmt(_: LogLevel, args: Arguments) {
|
||||
let mut buf: [u8; 4096] = [0; 4096];
|
||||
buf[..PFX_LEN].copy_from_slice(PREFIX);
|
||||
let len = fmt_to_buf(&mut buf[PFX_LEN..], args) + PFX_LEN;
|
||||
unsafe {
|
||||
klog_write(buf.as_ptr(), len as i32);
|
||||
if let Some(kmsg) = KMSG.get().as_mut() {
|
||||
let mut buf: [u8; 4096] = [0; 4096];
|
||||
let len = fmt_to_buf(&mut buf, format_args!("magiskinit: {}", args));
|
||||
kmsg.write_all(&buf[..len]).ok();
|
||||
}
|
||||
}
|
||||
|
||||
fn klog_write_impl(_: LogLevel, msg: &[u8]) {
|
||||
unsafe {
|
||||
klog_write(msg.as_ptr(), msg.len() as i32);
|
||||
if let Some(kmsg) = KMSG.get().as_mut() {
|
||||
let mut buf: [u8; 4096] = [0; 4096];
|
||||
let mut len = copy_str(&mut buf, b"magiskinit: ");
|
||||
len += copy_str(&mut buf[len..], msg);
|
||||
kmsg.write_all(&buf[..len]).ok();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user