diff --git a/native/src/init/lib.rs b/native/src/init/lib.rs index bd797b1d5..b0214fcae 100644 --- a/native/src/init/lib.rs +++ b/native/src/init/lib.rs @@ -55,6 +55,10 @@ pub mod ffi { fn reset_overlay_contexts(); unsafe fn start_magisk_init(argv: *mut *mut c_char); } + + extern "Rust" { + fn prepare_data(self: &MagiskInit); + } unsafe extern "C++" { include!("../base/include/base.hpp"); @@ -70,7 +74,6 @@ pub mod ffi { unsafe fn setup_tmp(self: &MagiskInit, path: *const c_char); fn collect_devices(self: &MagiskInit); fn mount_preinit_dir(self: &MagiskInit); - fn prepare_data(self: &MagiskInit); unsafe fn find_block(self: &MagiskInit, partname: *const c_char) -> u64; fn mount_system_root(self: &mut MagiskInit) -> bool; diff --git a/native/src/init/mount.cpp b/native/src/init/mount.cpp index 92e2ae8ba..5e4b0b085 100644 --- a/native/src/init/mount.cpp +++ b/native/src/init/mount.cpp @@ -221,16 +221,6 @@ void MagiskInit::exec_init() const noexcept { exit(1); } -void MagiskInit::prepare_data() const noexcept { - LOGD("Setup data tmp\n"); - xmkdir("/data", 0755); - xmount("magisk", "/data", "tmpfs", 0, "mode=755"); - - cp_afc("/init", REDIR_PATH); - cp_afc("/.backup", "/data/.backup"); - cp_afc("/overlay.d", "/data/overlay.d"); -} - void MagiskInit::setup_tmp(const char *path) const noexcept { LOGD("Setup Magisk tmp at %s\n", path); chdir("/data"); diff --git a/native/src/init/mount.rs b/native/src/init/mount.rs index b23d8653f..37139110a 100644 --- a/native/src/init/mount.rs +++ b/native/src/init/mount.rs @@ -7,10 +7,11 @@ use std::{ use cxx::CxxString; +use crate::ffi::MagiskInit; use base::{ cstr, debug, libc::{chdir, chroot, mount, MS_MOVE}, - parse_mount_info, raw_cstr, Directory, LibcReturn, LoggedResult, StringExt, Utf8CStr, + parse_mount_info, raw_cstr, Directory, FsPath, LibcReturn, LoggedResult, StringExt, Utf8CStr, }; pub fn switch_root(path: &Utf8CStr) { @@ -68,3 +69,29 @@ pub fn is_device_mounted(dev: u64, target: Pin<&mut CxxString>) -> bool { } false } + +impl MagiskInit { + pub(crate) fn prepare_data(&self) { + debug!("Setup data tmp"); + fn inner() -> LoggedResult<()> { + FsPath::from(cstr!("/data")).mkdir(0o755)?; + unsafe { + mount( + raw_cstr!("magisk"), + raw_cstr!("/data"), + raw_cstr!("tmpfs"), + 0, + raw_cstr!("mode=755").cast(), + ) + } + .as_os_err()?; + + FsPath::from(cstr!("/init")).copy_to(FsPath::from(cstr!("/data/magiskinit")))?; + FsPath::from(cstr!("/.backup")).copy_to(FsPath::from(cstr!("/data/.backup")))?; + FsPath::from(cstr!("/overlay.d")).copy_to(FsPath::from(cstr!("/data/overlay.d")))?; + + Ok(()) + } + inner().ok(); + } +}