Move MagiskInit::exec_init to rust

This commit is contained in:
LoveSy 2025-01-30 20:43:47 +08:00 committed by John Wu
parent 449204e380
commit c99f4a591b
3 changed files with 30 additions and 18 deletions

View File

@ -55,9 +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);
fn exec_init(self: &MagiskInit);
}
unsafe extern "C++" {
@ -90,7 +91,6 @@ pub mod ffi {
// SELinux
unsafe fn patch_sepolicy(self: &MagiskInit, in_: *const c_char, out: *const c_char);
fn hijack_sepolicy(self: &mut MagiskInit) -> bool;
fn exec_init(self: &MagiskInit);
fn legacy_system_as_root(self: &mut MagiskInit);
fn rootfs(self: &mut MagiskInit);
fn start(self: &mut MagiskInit);

View File

@ -210,17 +210,6 @@ mount_root:
return is_two_stage;
}
void MagiskInit::exec_init() const noexcept {
// Unmount in reverse order
for (auto i = mount_list.size(); i > 0; --i) {
auto &p = mount_list[i - 1];
if (xumount2(p.data(), MNT_DETACH) == 0)
LOGD("Unmount [%s]\n", p.data());
}
execve("/init", argv, environ);
exit(1);
}
void MagiskInit::setup_tmp(const char *path) const noexcept {
LOGD("Setup Magisk tmp at %s\n", path);
chdir("/data");

View File

@ -1,3 +1,4 @@
use cxx::CxxString;
use std::{
collections::BTreeSet,
ops::Bound::{Excluded, Unbounded},
@ -5,15 +6,18 @@ use std::{
ptr::null as nullptr,
};
use cxx::CxxString;
use crate::ffi::MagiskInit;
use base::{
cstr, debug,
libc::{chdir, chroot, mount, MS_MOVE},
parse_mount_info, raw_cstr, Directory, FsPath, LibcReturn, LoggedResult, StringExt, Utf8CStr,
cstr, debug, libc,
libc::{chdir, chroot, execve, exit, mount, umount2, MNT_DETACH, MS_MOVE},
parse_mount_info, raw_cstr, Directory, FsPath, LibcReturn, LoggedResult, ResultExt, StringExt,
Utf8CStr,
};
extern "C" {
static environ: *const *mut libc::c_char;
}
pub fn switch_root(path: &Utf8CStr) {
let res: LoggedResult<()> = try {
debug!("Switch root to {}", path);
@ -94,4 +98,23 @@ impl MagiskInit {
}
inner().ok();
}
pub(crate) fn exec_init(&self) {
unsafe {
for p in self.mount_list.iter().rev() {
if umount2(p.as_ptr().cast(), MNT_DETACH)
.as_os_err()
.log()
.is_ok()
{
debug!("Unmount [{}]", p);
}
}
execve(raw_cstr!("/init"), self.argv.cast(), environ.cast())
.as_os_err()
.log()
.ok();
exit(1);
}
}
}