diff --git a/userspace/ksud/src/defs.rs b/userspace/ksud/src/defs.rs index 2cb1ffa1..5499e205 100644 --- a/userspace/ksud/src/defs.rs +++ b/userspace/ksud/src/defs.rs @@ -3,6 +3,7 @@ use const_format::concatcp; pub const ADB_DIR: &str = "/data/adb/"; pub const WORKING_DIR: &str = concatcp!(ADB_DIR, "ksu/"); pub const BINARY_DIR: &str = concatcp!(WORKING_DIR, "bin/"); +pub const LOG_DIR: &str = concatcp!(WORKING_DIR, "log/"); pub const KSURC_PATH: &str = concatcp!(WORKING_DIR, ".ksurc"); pub const KSU_OVERLAY_SOURCE: &str = "KSU"; diff --git a/userspace/ksud/src/event.rs b/userspace/ksud/src/event.rs index cc9e3970..f1531839 100644 --- a/userspace/ksud/src/event.rs +++ b/userspace/ksud/src/event.rs @@ -86,6 +86,9 @@ pub fn mount_systemlessly(module_dir: &str) -> Result<()> { pub fn on_post_data_fs() -> Result<()> { crate::ksu::report_post_fs_data(); + #[cfg(unix)] + let _ = catch_bootlog(); + if utils::has_magisk() { warn!("Magisk detected, skip post-fs-data!"); return Ok(()); @@ -235,3 +238,42 @@ fn link_ksud_to_bin() -> Result<()> { } Ok(()) } + +#[cfg(unix)] +fn catch_bootlog() -> Result<()> { + use std::os::unix::process::CommandExt; + use std::process::Stdio; + + let logdir = Path::new(defs::LOG_DIR); + utils::ensure_dir_exists(logdir)?; + let bootlog = logdir.join("boot.log"); + let oldbootlog = logdir.join("boot.old.log"); + + if bootlog.exists() { + std::fs::rename(&bootlog, &oldbootlog)?; + } + + let bootlog = std::fs::File::create(bootlog)?; + + // timeout -s 9 30s logcat > boot.log + let result = unsafe { + std::process::Command::new("timeout") + .process_group(0) + .pre_exec(|| { + utils::switch_cgroups(); + Ok(()) + }) + .arg("-s") + .arg("9") + .arg("30s") + .arg("logcat") + .stdout(Stdio::from(bootlog)) + .spawn() + }; + + if let Err(e) = result { + warn!("Failed to start logcat: {:#}", e); + } + + Ok(()) +}