Use bitflags to implement BootState

This commit is contained in:
topjohnwu
2025-09-15 11:24:14 -07:00
committed by John Wu
parent 8b3a44344f
commit 0acc39cec0
4 changed files with 20 additions and 28 deletions

1
native/src/Cargo.lock generated
View File

@@ -644,6 +644,7 @@ dependencies = [
"argh",
"base",
"bit-set",
"bitflags",
"bytemuck",
"cxx",
"cxx-gen",

View File

@@ -27,3 +27,4 @@ thiserror = { workspace = true }
bit-set = { workspace = true }
argh = { workspace = true }
nix = { workspace = true, features = ["fs", "mount", "poll", "signal", "term", "user", "zerocopy"] }
bitflags = { workspace = true }

View File

@@ -1,5 +1,5 @@
use crate::consts::{APP_PACKAGE_NAME, BBPATH, DATABIN, MODULEROOT, SECURE_DIR};
use crate::daemon::{BootState, MagiskD};
use crate::daemon::MagiskD;
use crate::ffi::{
DbEntryKey, RequestCode, check_key_combo, exec_common_scripts, exec_module_scripts,
get_magisk_tmp, initialize_denylist,
@@ -11,12 +11,23 @@ use crate::resetprop::get_prop;
use crate::selinux::restorecon;
use base::const_format::concatcp;
use base::{BufReadExt, FsPathBuilder, ResultExt, cstr, error, info};
use bitflags::bitflags;
use nix::fcntl::OFlag;
use std::io::BufReader;
use std::os::unix::net::UnixStream;
use std::process::{Command, Stdio};
use std::sync::atomic::Ordering;
bitflags! {
#[derive(Default)]
pub struct BootState : u32 {
const PostFsDataDone = 1 << 0;
const LateStartDone = 1 << 1;
const BootComplete = 1 << 2;
const SafeMode = 1 << 3;
}
}
impl MagiskD {
fn setup_magisk_env(&self) -> bool {
info!("* Initializing Magisk environment");
@@ -185,9 +196,9 @@ impl MagiskD {
RequestCode::POST_FS_DATA => {
if check_data() && !state.contains(BootState::PostFsDataDone) {
if self.post_fs_data() {
state.set(BootState::SafeMode);
state.insert(BootState::SafeMode);
}
state.set(BootState::PostFsDataDone);
state.insert(BootState::PostFsDataDone);
}
}
RequestCode::LATE_START => {
@@ -195,13 +206,13 @@ impl MagiskD {
if state.contains(BootState::PostFsDataDone) && !state.contains(BootState::SafeMode)
{
self.late_start();
state.set(BootState::LateStartDone);
state.insert(BootState::LateStartDone);
}
}
RequestCode::BOOT_COMPLETE => {
drop(client);
if state.contains(BootState::PostFsDataDone) {
state.set(BootState::BootComplete);
state.insert(BootState::BootComplete);
self.boot_complete()
}
}

View File

@@ -1,3 +1,4 @@
use crate::bootstages::BootState;
use crate::consts::{
MAGISK_FILE_CON, MAGISK_FULL_VER, MAGISK_PROC_CON, MAGISK_VER_CODE, MAGISK_VERSION,
MAIN_CONFIG, MAIN_SOCKET, ROOTMNT, ROOTOVL,
@@ -38,28 +39,6 @@ use std::sync::{Mutex, OnceLock};
// Global magiskd singleton
pub static MAGISKD: OnceLock<MagiskD> = OnceLock::new();
#[repr(u32)]
pub enum BootState {
PostFsDataDone = (1 << 0),
LateStartDone = (1 << 1),
BootComplete = (1 << 2),
SafeMode = (1 << 3),
}
#[derive(Default)]
#[repr(transparent)]
pub struct BootStateFlags(u32);
impl BootStateFlags {
pub fn contains(&self, stage: BootState) -> bool {
(self.0 & stage as u32) != 0
}
pub fn set(&mut self, stage: BootState) {
self.0 |= stage as u32;
}
}
pub const AID_ROOT: i32 = 0;
pub const AID_SHELL: i32 = 2000;
pub const AID_APP_START: i32 = 10000;
@@ -78,7 +57,7 @@ pub const fn to_user_id(uid: i32) -> i32 {
pub struct MagiskD {
pub sql_connection: Mutex<Option<Sqlite3>>,
pub manager_info: Mutex<ManagerInfo>,
pub boot_stage_lock: Mutex<BootStateFlags>,
pub boot_stage_lock: Mutex<BootState>,
pub module_list: OnceLock<Vec<ModuleInfo>>,
pub zygisk_enabled: AtomicBool,
pub zygisk: Mutex<ZygiskState>,