ksud: try parse kmi from gki modules if uname is modified

This commit is contained in:
weishu
2024-03-19 10:37:05 +08:00
parent 7f73827658
commit f41d73f7eb

View File

@@ -48,21 +48,45 @@ pub fn get_kernel_version() -> Result<(i32, i32, i32)> {
} }
#[cfg(target_os = "android")] #[cfg(target_os = "android")]
fn parse_kmi() -> Result<String> { fn parse_kmi(version: &str) -> Result<String> {
use regex::Regex; use regex::Regex;
let uname = rustix::system::uname();
let version = uname.release().to_string_lossy();
let re = Regex::new(r"(.* )?(\d+\.\d+)(\S+)?(android\d+)(.*)")?; let re = Regex::new(r"(.* )?(\d+\.\d+)(\S+)?(android\d+)(.*)")?;
let cap = re let cap = re
.captures(&version) .captures(version)
.ok_or_else(|| anyhow::anyhow!("No match found"))?; .ok_or_else(|| anyhow::anyhow!("No match found"))?;
let android_version = cap.get(4).map_or("", |m| m.as_str()); let android_version = cap.get(4).map_or("", |m| m.as_str());
let kernel_version = cap.get(2).map_or("", |m| m.as_str()); let kernel_version = cap.get(2).map_or("", |m| m.as_str());
Ok(format!("{android_version}-{kernel_version}")) Ok(format!("{android_version}-{kernel_version}"))
} }
#[cfg(target_os = "android")]
fn parse_kmi_from_uname() -> Result<String> {
let uname = rustix::system::uname();
let version = uname.release().to_string_lossy();
parse_kmi(&version)
}
#[cfg(target_os = "android")]
fn parse_kmi_from_modules() -> Result<String> {
use std::io::BufRead;
let output = Command::new("modinfo")
.arg("/vendor/lib/modules/fips140.ko")
.output()?;
for line in output.stdout.lines().flatten() {
if line.starts_with("vermagic") {
return parse_kmi(&line);
}
}
anyhow::bail!("Unknown KMI, try use --kmi to specify it.")
}
#[cfg(target_os = "android")]
fn get_kmi() -> Result<String> {
parse_kmi_from_uname().or_else(|_| parse_kmi_from_modules())
}
#[cfg(not(target_os = "android"))] #[cfg(not(target_os = "android"))]
fn parse_kmi() -> Result<String> { fn get_kmi() -> Result<String> {
bail!("Unknown KMI, try use --kmi to specify it.") bail!("Unknown KMI, try use --kmi to specify it.")
} }
@@ -233,11 +257,7 @@ fn do_patch(
std::fs::copy(kmod, kmod_file).with_context(|| "copy kernel module failed".to_string())?; std::fs::copy(kmod, kmod_file).with_context(|| "copy kernel module failed".to_string())?;
} else { } else {
// If kmod is not specified, extract from assets // If kmod is not specified, extract from assets
let kmi = if let Some(kmi) = kmi { let kmi = if let Some(kmi) = kmi { kmi } else { get_kmi()? };
kmi
} else {
parse_kmi()?
};
println!("- KMI: {kmi}"); println!("- KMI: {kmi}");
let name = format!("{kmi}_kernelsu.ko"); let name = format!("{kmi}_kernelsu.ko");
assets::copy_assets_to_file(&name, kmod_file) assets::copy_assets_to_file(&name, kmod_file)