ksud: handle errors and non compatible ramdisk
Co-authored-by: rifsxd <rifat.44.azad.rifs@gmail.com>
This commit is contained in:
@@ -167,14 +167,14 @@ fn do_cpio_cmd(magiskboot: &Path, workdir: &Path, cmd: &str) -> Result<()> {
|
|||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|
||||||
fn do_vendor_cpio_cmd(magiskboot: &Path, workdir: &Path, cmd: &str) -> Result<()> {
|
fn do_vendor_init_boot_cpio_cmd(magiskboot: &Path, workdir: &Path, cmd: &str) -> Result<()> {
|
||||||
let vendor_ramdisk_cpio = workdir.join("vendor_ramdisk").join("init_boot.cpio");
|
let vendor_init_boot_cpio = workdir.join("vendor_ramdisk").join("init_boot.cpio");
|
||||||
let status = Command::new(magiskboot)
|
let status = Command::new(magiskboot)
|
||||||
.current_dir(workdir)
|
.current_dir(workdir)
|
||||||
.stdout(Stdio::null())
|
.stdout(Stdio::null())
|
||||||
.stderr(Stdio::null())
|
.stderr(Stdio::null())
|
||||||
.arg("cpio")
|
.arg("cpio")
|
||||||
.arg(vendor_ramdisk_cpio)
|
.arg(vendor_init_boot_cpio)
|
||||||
.arg(cmd)
|
.arg(cmd)
|
||||||
.status()?;
|
.status()?;
|
||||||
|
|
||||||
@@ -194,15 +194,15 @@ fn is_magisk_patched(magiskboot: &Path, workdir: &Path) -> Result<bool> {
|
|||||||
Ok(status.code() == Some(1))
|
Ok(status.code() == Some(1))
|
||||||
}
|
}
|
||||||
|
|
||||||
fn is_magisk_patched_vendor(magiskboot: &Path, workdir: &Path) -> Result<bool> {
|
fn is_magisk_patched_vendor_init_boot(magiskboot: &Path, workdir: &Path) -> Result<bool> {
|
||||||
let vendor_ramdisk_cpio = workdir.join("vendor_ramdisk").join("init_boot.cpio");
|
let vendor_init_boot_cpio = workdir.join("vendor_ramdisk").join("init_boot.cpio");
|
||||||
let status = Command::new(magiskboot)
|
let status = Command::new(magiskboot)
|
||||||
.current_dir(workdir)
|
.current_dir(workdir)
|
||||||
.stdout(Stdio::null())
|
.stdout(Stdio::null())
|
||||||
.stderr(Stdio::null())
|
.stderr(Stdio::null())
|
||||||
.args([
|
.args([
|
||||||
"cpio",
|
"cpio",
|
||||||
vendor_ramdisk_cpio.to_str().unwrap(),
|
vendor_init_boot_cpio.to_str().unwrap(),
|
||||||
"test",
|
"test",
|
||||||
])
|
])
|
||||||
.status()?;
|
.status()?;
|
||||||
@@ -222,7 +222,7 @@ fn is_kernelsu_patched(magiskboot: &Path, workdir: &Path) -> Result<bool> {
|
|||||||
Ok(status.success())
|
Ok(status.success())
|
||||||
}
|
}
|
||||||
|
|
||||||
fn is_kernelsu_patched_vendor(magiskboot: &Path, workdir: &Path) -> Result<bool> {
|
fn is_kernelsu_patched_vendor_init_boot(magiskboot: &Path, workdir: &Path) -> Result<bool> {
|
||||||
let vendor_ramdisk_cpio = workdir.join("vendor_ramdisk").join("init_boot.cpio");
|
let vendor_ramdisk_cpio = workdir.join("vendor_ramdisk").join("init_boot.cpio");
|
||||||
let status = Command::new(magiskboot)
|
let status = Command::new(magiskboot)
|
||||||
.current_dir(workdir)
|
.current_dir(workdir)
|
||||||
@@ -284,8 +284,8 @@ pub fn restore(
|
|||||||
|
|
||||||
let no_ramdisk = !workdir.join("ramdisk.cpio").exists();
|
let no_ramdisk = !workdir.join("ramdisk.cpio").exists();
|
||||||
let is_kernelsu_patched = is_kernelsu_patched(&magiskboot, workdir)?;
|
let is_kernelsu_patched = is_kernelsu_patched(&magiskboot, workdir)?;
|
||||||
let is_kernelsu_patched_vendor = is_kernelsu_patched_vendor(&magiskboot, workdir)?;
|
let is_kernelsu_patched_vendor_init_boot = is_kernelsu_patched_vendor_init_boot(&magiskboot, workdir)?;
|
||||||
ensure!(is_kernelsu_patched || is_kernelsu_patched_vendor, "boot image is not patched by KernelSU");
|
ensure!(is_kernelsu_patched || is_kernelsu_patched_vendor_init_boot, "boot image is not patched by KernelSU");
|
||||||
|
|
||||||
let mut new_boot = None;
|
let mut new_boot = None;
|
||||||
let mut from_backup = false;
|
let mut from_backup = false;
|
||||||
@@ -318,15 +318,15 @@ pub fn restore(
|
|||||||
|
|
||||||
if new_boot.is_none() {
|
if new_boot.is_none() {
|
||||||
if no_ramdisk {
|
if no_ramdisk {
|
||||||
// vendor ramdisk restore
|
// vendor init_boot restore
|
||||||
do_vendor_cpio_cmd(&magiskboot, workdir, "rm kernelsu.ko")?;
|
do_vendor_init_boot_cpio_cmd(&magiskboot, workdir, "rm kernelsu.ko")?;
|
||||||
// if init.real exists, restore it
|
// if init.real exists, restore it
|
||||||
let status = do_vendor_cpio_cmd(&magiskboot, workdir, "exists init.real").is_ok();
|
let status = do_vendor_init_boot_cpio_cmd(&magiskboot, workdir, "exists init.real").is_ok();
|
||||||
if status {
|
if status {
|
||||||
do_vendor_cpio_cmd(&magiskboot, workdir, "mv init.real init")?;
|
do_vendor_init_boot_cpio_cmd(&magiskboot, workdir, "mv init.real init")?;
|
||||||
} else {
|
} else {
|
||||||
let vendor_ramdisk = workdir.join("vendor_ramdisk").join("init_boot.cpio");
|
let vendor_init_boot = workdir.join("vendor_ramdisk").join("init_boot.cpio");
|
||||||
std::fs::remove_file(vendor_ramdisk)?;
|
std::fs::remove_file(vendor_init_boot )?;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
// remove kernelsu.ko
|
// remove kernelsu.ko
|
||||||
@@ -516,24 +516,31 @@ fn do_patch(
|
|||||||
ensure!(status.success(), "magiskboot unpack failed");
|
ensure!(status.success(), "magiskboot unpack failed");
|
||||||
|
|
||||||
let no_ramdisk = !workdir.join("ramdisk.cpio").exists();
|
let no_ramdisk = !workdir.join("ramdisk.cpio").exists();
|
||||||
|
let no_vendor_init_boot = !workdir
|
||||||
|
.join("vendor_ramdisk")
|
||||||
|
.join("init_boot.cpio")
|
||||||
|
.exists();Add commentMore actions
|
||||||
|
if no_ramdisk && no_vendor_init_boot {
|
||||||
|
bail!("No compatible ramdisk found.");
|
||||||
|
}
|
||||||
let is_magisk_patched = is_magisk_patched(&magiskboot, workdir)?;
|
let is_magisk_patched = is_magisk_patched(&magiskboot, workdir)?;
|
||||||
let is_magisk_patched_vendor = is_magisk_patched_vendor(&magiskboot, workdir)?;
|
let is_magisk_patched_vendor_init_boot = is_magisk_patched_vendor_init_boot(&magiskboot, workdir)?;
|
||||||
ensure!(
|
ensure!(
|
||||||
no_ramdisk || !is_magisk_patched || !is_magisk_patched_vendor,
|
!is_magisk_patched || !is_magisk_patched_vendor_init_boot,
|
||||||
"Cannot work with Magisk patched image"
|
"Cannot work with Magisk patched image"
|
||||||
);
|
);
|
||||||
|
|
||||||
println!("- Adding KernelSU LKM");
|
println!("- Adding KernelSU LKM");
|
||||||
let is_kernelsu_patched = is_kernelsu_patched(&magiskboot, workdir)?;
|
let is_kernelsu_patched = is_kernelsu_patched(&magiskboot, workdir)?;
|
||||||
let is_kernelsu_patched_vendor = is_kernelsu_patched_vendor(&magiskboot, workdir)?;
|
let is_kernelsu_patched_vendor_init_boot = is_kernelsu_patched_vendor_init_boot(&magiskboot, workdir)?;
|
||||||
|
|
||||||
let mut need_backup = false;
|
let mut need_backup = false;
|
||||||
if !is_kernelsu_patched || !is_kernelsu_patched_vendor {
|
if !is_kernelsu_patched || (no_ramdisk && !is_kernelsu_patched_vendor_init_boot) {
|
||||||
if no_ramdisk {
|
if no_ramdisk {
|
||||||
// vendor ramdisk patching
|
// vendor init_boot patching
|
||||||
let status = do_vendor_cpio_cmd(&magiskboot, workdir, "exists init");
|
let status = do_vendor_init_boot_cpio_cmd(&magiskboot, workdir, "exists init");
|
||||||
if status.is_ok() {
|
if status.is_ok() {
|
||||||
do_vendor_cpio_cmd(&magiskboot, workdir, "mv init init.real")?;
|
do_vendor_init_boot_cpio_cmd(&magiskboot, workdir, "mv init init.real")?;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
// kernelsu.ko is not exist, backup init if necessary
|
// kernelsu.ko is not exist, backup init if necessary
|
||||||
@@ -546,8 +553,8 @@ fn do_patch(
|
|||||||
}
|
}
|
||||||
|
|
||||||
if no_ramdisk {
|
if no_ramdisk {
|
||||||
do_vendor_cpio_cmd(&magiskboot, workdir, "add 0755 init init")?;
|
do_vendor_init_boot_cpio_cmd(&magiskboot, workdir, "add 0755 init init")?;
|
||||||
do_vendor_cpio_cmd(&magiskboot, workdir, "add 0755 kernelsu.ko kernelsu.ko")?;
|
do_vendor_init_boot_cpio_cmd(&magiskboot, workdir, "add 0755 kernelsu.ko kernelsu.ko")?;
|
||||||
} else {
|
} else {
|
||||||
do_cpio_cmd(&magiskboot, workdir, "add 0755 init init")?;
|
do_cpio_cmd(&magiskboot, workdir, "add 0755 init init")?;
|
||||||
do_cpio_cmd(&magiskboot, workdir, "add 0755 kernelsu.ko kernelsu.ko")?;
|
do_cpio_cmd(&magiskboot, workdir, "add 0755 kernelsu.ko kernelsu.ko")?;
|
||||||
|
|||||||
Reference in New Issue
Block a user