diff --git a/userspace/ksud_magic/src/boot_patch.rs b/userspace/ksud_magic/src/boot_patch.rs index 1737bc3e..b29235a4 100644 --- a/userspace/ksud_magic/src/boot_patch.rs +++ b/userspace/ksud_magic/src/boot_patch.rs @@ -167,6 +167,21 @@ fn do_cpio_cmd(magiskboot: &Path, workdir: &Path, cmd: &str) -> Result<()> { Ok(()) } +fn do_vendor_cpio_cmd(magiskboot: &Path, workdir: &Path, cmd: &str) -> Result<()> { + let vendor_ramdisk_cpio = workdir.join("vendor_ramdisk").join("init_boot.cpio"); + let status = Command::new(magiskboot) + .current_dir(workdir) + .stdout(Stdio::null()) + .stderr(Stdio::null()) + .arg("cpio") + .arg(vendor_ramdisk_cpio) + .arg(cmd) + .status()?; + + ensure!(status.success(), "magiskboot cpio {} failed", cmd); + Ok(()) +} + fn is_magisk_patched(magiskboot: &Path, workdir: &Path) -> Result { let status = Command::new(magiskboot) .current_dir(workdir) @@ -441,11 +456,6 @@ fn do_patch( assets::copy_assets_to_file("ksuinit", init_file).context("copy ksuinit failed")?; } - // magiskboot unpack boot.img - // magiskboot cpio ramdisk.cpio 'cp init init.real' - // magiskboot cpio ramdisk.cpio 'add 0755 ksuinit init' - // magiskboot cpio ramdisk.cpio 'add 0755 kernelsu.ko' - println!("- Unpacking boot image"); let status = Command::new(&magiskboot) .current_dir(workdir) @@ -468,17 +478,29 @@ fn do_patch( let mut need_backup = false; if !is_kernelsu_patched { - // kernelsu.ko is not exist, backup init if necessary - let status = do_cpio_cmd(&magiskboot, workdir, "exists init"); - if status.is_ok() { - do_cpio_cmd(&magiskboot, workdir, "mv init init.real")?; + if no_ramdisk { + // vendor ramdisk patching + let status = do_vendor_cpio_cmd(&magiskboot, workdir, "exists init"); + if status.is_ok() { + do_vendor_cpio_cmd(&magiskboot, workdir, "mv init init.real")?; + } + } else { + // kernelsu.ko is not exist, backup init if necessary + let status = do_cpio_cmd(&magiskboot, workdir, "exists init"); + if status.is_ok() { + do_cpio_cmd(&magiskboot, workdir, "mv init init.real")?; + } + need_backup = flash; } - - need_backup = flash; } - do_cpio_cmd(&magiskboot, workdir, "add 0755 init init")?; - do_cpio_cmd(&magiskboot, workdir, "add 0755 kernelsu.ko kernelsu.ko")?; + if no_ramdisk { + do_vendor_cpio_cmd(&magiskboot, workdir, "add 0755 init init")?; + do_vendor_cpio_cmd(&magiskboot, workdir, "add 0755 kernelsu.ko kernelsu.ko")?; + } else { + do_cpio_cmd(&magiskboot, workdir, "add 0755 init init")?; + do_cpio_cmd(&magiskboot, workdir, "add 0755 kernelsu.ko kernelsu.ko")?; + } #[cfg(target_os = "android")] if need_backup { diff --git a/userspace/ksud_overlayfs/src/boot_patch.rs b/userspace/ksud_overlayfs/src/boot_patch.rs index 2d2a0eb2..b29235a4 100644 --- a/userspace/ksud_overlayfs/src/boot_patch.rs +++ b/userspace/ksud_overlayfs/src/boot_patch.rs @@ -167,6 +167,21 @@ fn do_cpio_cmd(magiskboot: &Path, workdir: &Path, cmd: &str) -> Result<()> { Ok(()) } +fn do_vendor_cpio_cmd(magiskboot: &Path, workdir: &Path, cmd: &str) -> Result<()> { + let vendor_ramdisk_cpio = workdir.join("vendor_ramdisk").join("init_boot.cpio"); + let status = Command::new(magiskboot) + .current_dir(workdir) + .stdout(Stdio::null()) + .stderr(Stdio::null()) + .arg("cpio") + .arg(vendor_ramdisk_cpio) + .arg(cmd) + .status()?; + + ensure!(status.success(), "magiskboot cpio {} failed", cmd); + Ok(()) +} + fn is_magisk_patched(magiskboot: &Path, workdir: &Path) -> Result { let status = Command::new(magiskboot) .current_dir(workdir) @@ -301,7 +316,7 @@ pub fn restore( let output_dir = std::env::current_dir()?; let now = chrono::Utc::now(); let output_image = output_dir.join(format!( - "kernelsu_restore_{}.img", + "kernelsu_next_restore_{}.img", now.format("%Y%m%d_%H%M%S") )); @@ -441,11 +456,6 @@ fn do_patch( assets::copy_assets_to_file("ksuinit", init_file).context("copy ksuinit failed")?; } - // magiskboot unpack boot.img - // magiskboot cpio ramdisk.cpio 'cp init init.real' - // magiskboot cpio ramdisk.cpio 'add 0755 ksuinit init' - // magiskboot cpio ramdisk.cpio 'add 0755 kernelsu.ko' - println!("- Unpacking boot image"); let status = Command::new(&magiskboot) .current_dir(workdir) @@ -468,17 +478,29 @@ fn do_patch( let mut need_backup = false; if !is_kernelsu_patched { - // kernelsu.ko is not exist, backup init if necessary - let status = do_cpio_cmd(&magiskboot, workdir, "exists init"); - if status.is_ok() { - do_cpio_cmd(&magiskboot, workdir, "mv init init.real")?; + if no_ramdisk { + // vendor ramdisk patching + let status = do_vendor_cpio_cmd(&magiskboot, workdir, "exists init"); + if status.is_ok() { + do_vendor_cpio_cmd(&magiskboot, workdir, "mv init init.real")?; + } + } else { + // kernelsu.ko is not exist, backup init if necessary + let status = do_cpio_cmd(&magiskboot, workdir, "exists init"); + if status.is_ok() { + do_cpio_cmd(&magiskboot, workdir, "mv init init.real")?; + } + need_backup = flash; } - - need_backup = flash; } - do_cpio_cmd(&magiskboot, workdir, "add 0755 init init")?; - do_cpio_cmd(&magiskboot, workdir, "add 0755 kernelsu.ko kernelsu.ko")?; + if no_ramdisk { + do_vendor_cpio_cmd(&magiskboot, workdir, "add 0755 init init")?; + do_vendor_cpio_cmd(&magiskboot, workdir, "add 0755 kernelsu.ko kernelsu.ko")?; + } else { + do_cpio_cmd(&magiskboot, workdir, "add 0755 init init")?; + do_cpio_cmd(&magiskboot, workdir, "add 0755 kernelsu.ko kernelsu.ko")?; + } #[cfg(target_os = "android")] if need_backup {