From 5497c0004d365c25ff3fc04984d2d1dabcbc3de2 Mon Sep 17 00:00:00 2001 From: ShirkNeko <109797057+ShirkNeko@users.noreply.github.com> Date: Tue, 23 Sep 2025 18:40:58 +0800 Subject: [PATCH] Revert "ksud: Only start the monitor and load the module when KPM is enabled" This reverts commit 3ed1d9aebc3a59ded08c20158a2d7602ec3a2ef0. --- userspace/ksud/src/init_event.rs | 10 +-- userspace/ksud/src/kpm.rs | 135 +++++++++++++++++++------------ 2 files changed, 89 insertions(+), 56 deletions(-) diff --git a/userspace/ksud/src/init_event.rs b/userspace/ksud/src/init_event.rs index 2c751e3c..4d4a5c4e 100644 --- a/userspace/ksud/src/init_event.rs +++ b/userspace/ksud/src/init_event.rs @@ -9,6 +9,8 @@ use std::path::Path; pub fn on_post_data_fs() -> Result<()> { ksucalls::report_post_fs_data(); + kpm::start_kpm_watcher()?; + utils::umask(0); #[cfg(unix)] @@ -105,13 +107,11 @@ pub fn on_post_data_fs() -> Result<()> { info!("no mount requested"); } - if kpm::is_kpm_enabled()? { - kpm::start_kpm_watcher()?; - kpm::load_kpm_modules()?; - } - run_stage("post-mount", true); + // load kpm modules + kpm::load_kpm_modules()?; + Ok(()) } diff --git a/userspace/ksud/src/kpm.rs b/userspace/ksud/src/kpm.rs index 478db622..7a8c80a9 100644 --- a/userspace/ksud/src/kpm.rs +++ b/userspace/ksud/src/kpm.rs @@ -4,19 +4,20 @@ use notify::{RecursiveMode, Watcher}; use std::ffi::OsStr; use std::fs; use std::path::Path; -use std::process::Command; pub const KPM_DIR: &str = "/data/adb/kpm"; pub const KPMMGR_PATH: &str = "/data/adb/ksu/bin/kpmmgr"; -// 启动 KPM 监视器 -pub fn start_kpm_watcher() -> Result<()> { - - // 检查 KPM 是否启用 - if !is_kpm_enabled()? { - log::warn!("KPM is not enabled. Disabling all KPM-related functionality."); - return Ok(()); +// 确保 KPM 目录存在,如果不存在则创建 +pub fn ensure_kpm_dir() -> Result<()> { + if !Path::new(KPM_DIR).exists() { + fs::create_dir_all(KPM_DIR)?; } + Ok(()) +} + +pub fn start_kpm_watcher() -> Result<()> { + ensure_kpm_dir()?; // 检查是否处于安全模式 if crate::utils::is_safe_mode() { @@ -27,7 +28,6 @@ pub fn start_kpm_watcher() -> Result<()> { return Ok(()); } - // 启动文件系统监视器 let mut watcher = notify::recommended_watcher(|res| match res { Ok(event) => handle_kpm_event(event), Err(e) => log::error!("monitoring error: {:?}", e), @@ -37,40 +37,16 @@ pub fn start_kpm_watcher() -> Result<()> { Ok(()) } -// 检查 KPM 版本 -pub fn is_kpm_enabled() -> Result { - - // KPM 文件夹不存在则视为未启用 - if !Path::new(KPM_DIR).exists() { - return Ok(false); - } - - let output = Command::new(KPMMGR_PATH) - .args(["version"]) - .output()?; - - if output.status.success() { - let output_str = String::from_utf8_lossy(&output.stdout); - if output_str.to_lowercase().contains("error") { - Ok(false) - } else { - Ok(true) - } - } else { - Err(anyhow!("Failed to check KPM version: {:?}", output.stderr)) - } -} - // 处理 KPM 事件 -fn handle_kpm_event(event: notify::Event) { +pub fn handle_kpm_event(event: notify::Event) { match event.kind { notify::EventKind::Create(_) => handle_create_event(event.paths), + notify::EventKind::Remove(_) => handle_remove_event(event.paths), notify::EventKind::Modify(_) => handle_modify_event(event.paths), _ => {} } } -// 处理创建事件 fn handle_create_event(paths: Vec) { for path in paths { if path.extension() == Some(OsStr::new("kpm")) { @@ -81,49 +57,106 @@ fn handle_create_event(paths: Vec) { } } -// 处理修改事件 +fn handle_remove_event(paths: Vec) { + for path in paths { + if let Some(name) = path.file_stem().and_then(|s| s.to_str()) { + if let Err(e) = unload_kpm(name) { + log::warn!("Failed to unload {}: {}", name, e); + } + if let Err(e) = fs::remove_file(&path) { + log::error!("Failed to delete file: {}: {}", path.display(), e); + } + } + } +} + fn handle_modify_event(paths: Vec) { for path in paths { log::info!("Modified file: {}", path.display()); } } -// 加载单个 KPM 模块 -fn load_kpm(path: &Path) -> Result<()> { +// 加载 KPM 模块 +pub fn load_kpm(path: &Path) -> Result<()> { let path_str = path .to_str() .ok_or_else(|| anyhow!("Invalid path: {}", path.display()))?; - let status = Command::new(KPMMGR_PATH) + let status = std::process::Command::new(KPMMGR_PATH) .args(["load", path_str, ""]) .status()?; if status.success() { log::info!("Loaded KPM: {}", path.display()); - } else { - log::warn!("KPM unloading may have failed: {}", path.display()); } Ok(()) } +// 卸载 KPM 模块并尝试删除对应文件 +pub fn unload_kpm(name: &str) -> Result<()> { + let status = std::process::Command::new(KPMMGR_PATH) + .args(["unload", name]) + .status() + .map_err(|e| anyhow!("Failed to execute kpmmgr: {}", e))?; + + if status.success() { + let kpm_path = find_kpm_file(name)?; + if let Some(path) = kpm_path { + fs::remove_file(&path) + .map_err(|e| anyhow!("Failed to delete KPM file: {}: {}", path.display(), e))?; + log::info!("Deleted KPM file: {}", path.display()); + } + + log::info!("Successfully unloaded KPM: {}", name); + } else { + log::warn!("KPM unloading may have failed: {}", name); + } + + Ok(()) +} + +// 通过名称查找 KPM 文件 +fn find_kpm_file(name: &str) -> Result> { + let kpm_dir = Path::new(KPM_DIR); + if !kpm_dir.exists() { + return Ok(None); + } + + for entry in fs::read_dir(kpm_dir)? { + let path = entry?.path(); + if let Some(file_name) = path.file_stem() { + if let Some(file_name_str) = file_name.to_str() { + if file_name_str == name && path.extension() == Some(OsStr::new("kpm")) { + return Ok(Some(path)); + } + } + } + } + Ok(None) +} + // 安全模式下删除所有 KPM 模块 -fn remove_all_kpms() -> Result<()> { +pub fn remove_all_kpms() -> Result<()> { + ensure_kpm_dir()?; + for entry in fs::read_dir(KPM_DIR)? { - let path = entry?.path(); - if path.extension().is_some_and(|ext| ext == "kpm") { - if let Err(e) = fs::remove_file(&path) { - log::error!("Failed to delete file: {}: {}", path.display(), e); + let path = entry?.path(); + if path.extension().is_some_and(|ext| ext == "kpm") { + if let Some(name) = path.file_stem() { + if let Err(e) = unload_kpm(name.to_string_lossy().as_ref()) { + log::error!("Failed to remove KPM: {}", e); + } + if let Err(e) = fs::remove_file(&path) { + log::error!("Failed to delete file: {}: {}", path.display(), e); + } } } } Ok(()) } -// 遍历加载所有 KPM 模块 +// 加载 KPM 模块 pub fn load_kpm_modules() -> Result<()> { - if !is_kpm_enabled()? { - log::warn!("KPM is not enabled. Disabling all KPM-related functionality."); - return Ok(()); - } + ensure_kpm_dir()?; for entry in std::fs::read_dir(KPM_DIR)? { let path = entry?.path();