Move occupy and unoccupy out of base crate

This commit is contained in:
topjohnwu
2025-11-28 23:06:11 -08:00
committed by John Wu
parent f7ce9c38e1
commit 5d6b703622
3 changed files with 55 additions and 54 deletions

View File

@@ -1,5 +1,4 @@
use crate::WalkResult::{Continue, Skip};
use crate::{Directory, LibcReturn, OsResult, ResultExt, Utf8CStr, Utf8CStrBufArr};
use crate::{LibcReturn, OsResult, Utf8CStr};
use nix::mount::{MntFlags, MsFlags, mount, umount2};
impl Utf8CStr {
@@ -82,52 +81,4 @@ impl Utf8CStr {
)
.check_os_err("set_mount_private", Some(self), None)
}
pub fn occupy(&self) {
Directory::open(self)
.map(|mut dir| {
dir.pre_order_walk(|entry| {
let mut path = Utf8CStrBufArr::default();
entry.resolve_path(&mut path)?;
let path = path.as_utf8_cstr();
mount(
Some(path),
path,
None::<&Utf8CStr>,
MsFlags::MS_BIND | MsFlags::MS_RDONLY,
None::<&Utf8CStr>,
)
.check_os_err("occupy", Some(path), None)?;
Ok(Continue)
})
.log_ok();
})
.log_ok();
}
pub fn unoccupy(&self) -> bool {
let mut ok = false;
Directory::open(self)
.map(|mut dir| {
ok = dir
.pre_order_walk(|entry| {
let mut path = Utf8CStrBufArr::default();
entry.resolve_path(&mut path)?;
let path = path.as_utf8_cstr();
umount2(path, MntFlags::MNT_DETACH).check_os_err(
"unoccupy",
Some(path),
None,
)?;
if entry.is_dir() {
Ok(Skip)
} else {
Ok(Continue)
}
})
.is_ok();
})
.log_ok();
ok
}
}

View File

@@ -1,6 +1,6 @@
use crate::ffi::{BootConfig, MagiskInit, backup_init, magisk_proxy_main};
use crate::logging::setup_klog;
use crate::mount::is_rootfs;
use crate::mount::{is_rootfs, occupy, unoccupy};
use crate::twostage::hexpatch_init_for_second_stage;
use base::libc::{basename, getpid, mount, umask};
use base::nix::mount::MsFlags;
@@ -44,15 +44,15 @@ impl MagiskInit {
}
if rootfs_magisktmp {
info!("Occupy /data.");
cstr!("/data").occupy();
info!("Occupy /data");
occupy(cstr!("/data"));
}
}
fn second_stage(&mut self) {
info!("Second Stage Init");
if cstr!("/data").unoccupy() {
if unoccupy(cstr!("/data")) {
nix::mount::mount(
None::<&Utf8CStr>,
cstr!("/data"),

View File

@@ -1,4 +1,6 @@
use crate::ffi::MagiskInit;
use base::WalkResult::{Continue, Skip};
use base::nix::mount::{MntFlags, mount, umount2};
use base::{
Directory, FsPathBuilder, LibcReturn, LoggedResult, ResultExt, Utf8CStr, cstr, debug, libc,
nix, parse_mount_info, raw_cstr,
@@ -62,6 +64,54 @@ pub(crate) fn is_device_mounted(dev: u64, target: Pin<&mut CxxString>) -> bool {
false
}
pub(crate) fn occupy(path: &Utf8CStr) {
Directory::open(path)
.map(|mut dir| {
dir.pre_order_walk(|entry| {
let mut path = cstr::buf::default();
entry.resolve_path(&mut path)?;
let path = path.as_utf8_cstr();
mount(
Some(path),
path,
None::<&Utf8CStr>,
MsFlags::MS_BIND | MsFlags::MS_RDONLY,
None::<&Utf8CStr>,
)
.check_os_err("occupy", Some(path), None)?;
Ok(Continue)
})
.log_ok();
})
.log_ok();
}
pub(crate) fn unoccupy(path: &Utf8CStr) -> bool {
let mut ok = false;
Directory::open(path)
.map(|mut dir| {
ok = dir
.pre_order_walk(|entry| {
let mut path = cstr::buf::default();
entry.resolve_path(&mut path)?;
let path = path.as_utf8_cstr();
umount2(path, MntFlags::MNT_DETACH).check_os_err(
"unoccupy",
Some(path),
None,
)?;
if entry.is_dir() {
Ok(Skip)
} else {
Ok(Continue)
}
})
.is_ok();
})
.log_ok();
ok
}
const RAMFS_MAGIC: u32 = 0x858458f6;
pub(crate) fn is_rootfs() -> bool {