You've already forked Magisk
mirror of
https://github.com/topjohnwu/Magisk.git
synced 2025-09-06 06:36:58 +00:00
92 lines
2.6 KiB
Rust
92 lines
2.6 KiB
Rust
use crate::{LibcReturn, OsResult, Utf8CStr};
|
|
use libc::c_ulong;
|
|
use std::ptr;
|
|
|
|
impl Utf8CStr {
|
|
pub fn bind_mount_to<'a>(&'a self, path: &'a Utf8CStr, rec: bool) -> OsResult<'a, ()> {
|
|
let flag = if rec { libc::MS_REC } else { 0 };
|
|
unsafe {
|
|
libc::mount(
|
|
self.as_ptr(),
|
|
path.as_ptr(),
|
|
ptr::null(),
|
|
libc::MS_BIND | flag,
|
|
ptr::null(),
|
|
)
|
|
.check_os_err("bind_mount", Some(self), Some(path))
|
|
}
|
|
}
|
|
|
|
pub fn remount_mount_point_flags(&self, flags: c_ulong) -> OsResult<'_, ()> {
|
|
unsafe {
|
|
libc::mount(
|
|
ptr::null(),
|
|
self.as_ptr(),
|
|
ptr::null(),
|
|
libc::MS_BIND | libc::MS_REMOUNT | flags,
|
|
ptr::null(),
|
|
)
|
|
.check_os_err("remount", Some(self), None)
|
|
}
|
|
}
|
|
|
|
pub fn remount_mount_flags(&self, flags: c_ulong) -> OsResult<'_, ()> {
|
|
unsafe {
|
|
libc::mount(
|
|
ptr::null(),
|
|
self.as_ptr(),
|
|
ptr::null(),
|
|
libc::MS_REMOUNT | flags,
|
|
ptr::null(),
|
|
)
|
|
.check_os_err("remount", Some(self), None)
|
|
}
|
|
}
|
|
|
|
pub fn remount_with_data(&self, data: &Utf8CStr) -> OsResult<'_, ()> {
|
|
unsafe {
|
|
libc::mount(
|
|
ptr::null(),
|
|
self.as_ptr(),
|
|
ptr::null(),
|
|
libc::MS_REMOUNT,
|
|
data.as_ptr().cast(),
|
|
)
|
|
.check_os_err("remount", Some(self), None)
|
|
}
|
|
}
|
|
|
|
pub fn move_mount_to<'a>(&'a self, path: &'a Utf8CStr) -> OsResult<'a, ()> {
|
|
unsafe {
|
|
libc::mount(
|
|
self.as_ptr(),
|
|
path.as_ptr(),
|
|
ptr::null(),
|
|
libc::MS_MOVE,
|
|
ptr::null(),
|
|
)
|
|
.check_os_err("move_mount", Some(self), Some(path))
|
|
}
|
|
}
|
|
|
|
pub fn unmount(&self) -> OsResult<'_, ()> {
|
|
unsafe {
|
|
libc::umount2(self.as_ptr(), libc::MNT_DETACH).check_os_err("unmount", Some(self), None)
|
|
}
|
|
}
|
|
|
|
pub fn set_mount_private(&self, recursive: bool) -> OsResult<'_, ()> {
|
|
let flag = if recursive { libc::MS_REC } else { 0 };
|
|
unsafe {
|
|
libc::mount(
|
|
ptr::null(),
|
|
self.as_ptr(),
|
|
ptr::null(),
|
|
libc::MS_PRIVATE | flag,
|
|
ptr::null(),
|
|
)
|
|
.check_os_err("set_mount_private", Some(self), None)
|
|
}
|
|
}
|
|
}
|