You've already forked Magisk
mirror of
https://github.com/topjohnwu/Magisk.git
synced 2025-09-06 06:36:58 +00:00
Refactor sepolicy.rules resolve native
Co-authored-by: LoveSy <shana@zju.edu.cn>
This commit is contained in:
@@ -1,9 +1,3 @@
|
||||
use std::env;
|
||||
use std::path::Path;
|
||||
|
||||
pub use base;
|
||||
use base::libc::{dev_t, makedev};
|
||||
use base::read_lines;
|
||||
pub use logging::*;
|
||||
|
||||
mod logging;
|
||||
@@ -12,74 +6,5 @@ mod logging;
|
||||
pub mod ffi2 {
|
||||
extern "Rust" {
|
||||
fn setup_klog();
|
||||
fn print_rules_device() -> i32;
|
||||
}
|
||||
}
|
||||
|
||||
pub fn print_rules_device() -> i32 {
|
||||
const UNKNOWN: i32 = 0;
|
||||
const PERSIST: i32 = UNKNOWN + 1;
|
||||
const METADATA: i32 = PERSIST + 1;
|
||||
const CACHE: i32 = METADATA + 1;
|
||||
const UNENCRYPTED: i32 = CACHE + 1;
|
||||
const DATA: i32 = UNENCRYPTED + 1;
|
||||
const EXISTING: i32 = DATA + 1;
|
||||
|
||||
let encrypted = env::var("ISENCRYPTED").map_or(false, |var| var == "true");
|
||||
|
||||
let mut matched = UNKNOWN;
|
||||
let mut rules_dev: dev_t = 0;
|
||||
|
||||
if let Ok(lines) = read_lines("/proc/self/mountinfo") {
|
||||
for line in lines {
|
||||
if let Ok(line) = line {
|
||||
let new_matched;
|
||||
if line.contains("/.magisk/sepolicy.rules ") {
|
||||
new_matched = EXISTING;
|
||||
} else if line.contains(" - ext4 ") && !line.contains("/dm-") {
|
||||
if line.contains(" / /cache ") && matched < CACHE {
|
||||
new_matched = CACHE;
|
||||
} else if line.contains(" / /data ") && matched < DATA {
|
||||
if !encrypted {
|
||||
new_matched = UNENCRYPTED;
|
||||
} else if Path::new("/data/unencrypted").is_dir() {
|
||||
new_matched = DATA;
|
||||
} else {
|
||||
continue;
|
||||
}
|
||||
} else if line.contains(" / /metadata ") && matched < METADATA {
|
||||
new_matched = METADATA;
|
||||
} else if (line.contains(" / /persist ")
|
||||
|| line.contains(" / /mnt/vendor/persist "))
|
||||
&& matched < PERSIST
|
||||
{
|
||||
new_matched = PERSIST;
|
||||
} else {
|
||||
continue;
|
||||
}
|
||||
} else {
|
||||
continue;
|
||||
}
|
||||
if let Some(device) = line.splitn(4, ' ').nth(2) {
|
||||
device.split_once(':').map(|(a, b)| {
|
||||
a.parse::<i32>().ok().map(|a| {
|
||||
b.parse::<i32>().ok().map(|b| {
|
||||
rules_dev = unsafe { makedev(a, b) };
|
||||
matched = new_matched;
|
||||
})
|
||||
})
|
||||
});
|
||||
}
|
||||
}
|
||||
}
|
||||
if matched > UNKNOWN {
|
||||
println!("{rules_dev}");
|
||||
return 0;
|
||||
} else {
|
||||
eprintln!("Failed to find sepolicy rules partition");
|
||||
}
|
||||
} else {
|
||||
eprintln!("Error reading /proc/self/mountinfo");
|
||||
}
|
||||
return 1;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user