You've already forked Magisk
mirror of
https://github.com/topjohnwu/Magisk.git
synced 2025-09-06 06:36:58 +00:00
Simplify MagiskD Rust/C++ FFI
This commit is contained in:
@@ -148,8 +148,8 @@ static bool check_safe_mode() {
|
|||||||
* Boot Stage Handlers *
|
* Boot Stage Handlers *
|
||||||
***********************/
|
***********************/
|
||||||
|
|
||||||
bool MagiskD::post_fs_data() const {
|
bool MagiskD::post_fs_data() const noexcept {
|
||||||
as_rust().setup_logfile();
|
setup_logfile();
|
||||||
|
|
||||||
LOGI("** post-fs-data mode running\n");
|
LOGI("** post-fs-data mode running\n");
|
||||||
|
|
||||||
@@ -194,8 +194,8 @@ bool MagiskD::post_fs_data() const {
|
|||||||
return safe_mode;
|
return safe_mode;
|
||||||
}
|
}
|
||||||
|
|
||||||
void MagiskD::late_start() const {
|
void MagiskD::late_start() const noexcept {
|
||||||
as_rust().setup_logfile();
|
setup_logfile();
|
||||||
|
|
||||||
LOGI("** late_start service mode running\n");
|
LOGI("** late_start service mode running\n");
|
||||||
|
|
||||||
@@ -203,8 +203,8 @@ void MagiskD::late_start() const {
|
|||||||
exec_module_scripts("service");
|
exec_module_scripts("service");
|
||||||
}
|
}
|
||||||
|
|
||||||
void MagiskD::boot_complete() const {
|
void MagiskD::boot_complete() const noexcept {
|
||||||
as_rust().setup_logfile();
|
setup_logfile();
|
||||||
|
|
||||||
LOGI("** boot-complete triggered\n");
|
LOGI("** boot-complete triggered\n");
|
||||||
|
|
||||||
|
|||||||
@@ -128,20 +128,8 @@ static void poll_ctrl_handler(pollfd *pfd) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
const MagiskD &MagiskD::get() {
|
void MagiskD::reboot() const noexcept {
|
||||||
return *reinterpret_cast<const MagiskD*>(&rust::get_magiskd());
|
if (is_recovery())
|
||||||
}
|
|
||||||
|
|
||||||
const rust::MagiskD *MagiskD::operator->() const {
|
|
||||||
return reinterpret_cast<const rust::MagiskD*>(this);
|
|
||||||
}
|
|
||||||
|
|
||||||
const rust::MagiskD &MagiskD::as_rust() const {
|
|
||||||
return *operator->();
|
|
||||||
}
|
|
||||||
|
|
||||||
void MagiskD::reboot() const {
|
|
||||||
if (as_rust().is_recovery())
|
|
||||||
exec_command_sync("/system/bin/reboot", "recovery");
|
exec_command_sync("/system/bin/reboot", "recovery");
|
||||||
else
|
else
|
||||||
exec_command_sync("/system/bin/reboot");
|
exec_command_sync("/system/bin/reboot");
|
||||||
@@ -171,7 +159,7 @@ static void handle_request_async(int client, int code, const sock_cred &cred) {
|
|||||||
write_int(client, 0);
|
write_int(client, 0);
|
||||||
close(client);
|
close(client);
|
||||||
if (do_reboot) {
|
if (do_reboot) {
|
||||||
MagiskD::get().reboot();
|
MagiskD().reboot();
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@@ -196,7 +184,7 @@ static void handle_request_sync(int client, int code) {
|
|||||||
write_int(client, MAGISK_VER_CODE);
|
write_int(client, MAGISK_VER_CODE);
|
||||||
break;
|
break;
|
||||||
case +RequestCode::START_DAEMON:
|
case +RequestCode::START_DAEMON:
|
||||||
MagiskD::get()->setup_logfile();
|
MagiskD().setup_logfile();
|
||||||
break;
|
break;
|
||||||
case +RequestCode::STOP_DAEMON: {
|
case +RequestCode::STOP_DAEMON: {
|
||||||
// Unmount all overlays
|
// Unmount all overlays
|
||||||
@@ -298,7 +286,7 @@ static void handle_request(pollfd *pfd) {
|
|||||||
exec_task([=, fd = client.release()] { handle_request_async(fd, code, cred); });
|
exec_task([=, fd = client.release()] { handle_request_async(fd, code, cred); });
|
||||||
} else {
|
} else {
|
||||||
exec_task([=, fd = client.release()] {
|
exec_task([=, fd = client.release()] {
|
||||||
MagiskD::get()->boot_stage_handler(fd, code);
|
MagiskD().boot_stage_handler(fd, code);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
use std::fs::File;
|
use std::fs::File;
|
||||||
|
use std::io;
|
||||||
use std::io::BufReader;
|
use std::io::BufReader;
|
||||||
use std::sync::{Mutex, OnceLock};
|
use std::sync::{Mutex, OnceLock};
|
||||||
use std::{io, mem};
|
|
||||||
|
|
||||||
use base::libc::{O_CLOEXEC, O_RDONLY};
|
use base::libc::{O_CLOEXEC, O_RDONLY};
|
||||||
use base::{
|
use base::{
|
||||||
@@ -10,7 +10,7 @@ use base::{
|
|||||||
};
|
};
|
||||||
|
|
||||||
use crate::consts::MAIN_CONFIG;
|
use crate::consts::MAIN_CONFIG;
|
||||||
use crate::ffi::{get_magisk_tmp, CxxMagiskD, RequestCode};
|
use crate::ffi::{get_magisk_tmp, RequestCode};
|
||||||
use crate::get_prop;
|
use crate::get_prop;
|
||||||
use crate::logging::magisk_logging;
|
use crate::logging::magisk_logging;
|
||||||
|
|
||||||
@@ -64,7 +64,7 @@ impl MagiskD {
|
|||||||
match code {
|
match code {
|
||||||
RequestCode::POST_FS_DATA => {
|
RequestCode::POST_FS_DATA => {
|
||||||
if check_data() && !state.contains(BootState::PostFsDataDone) {
|
if check_data() && !state.contains(BootState::PostFsDataDone) {
|
||||||
if self.as_cxx().post_fs_data() {
|
if self.post_fs_data() {
|
||||||
state.set(BootState::SafeMode);
|
state.set(BootState::SafeMode);
|
||||||
}
|
}
|
||||||
state.set(BootState::PostFsDataDone);
|
state.set(BootState::PostFsDataDone);
|
||||||
@@ -75,7 +75,7 @@ impl MagiskD {
|
|||||||
unsafe { libc::close(client) };
|
unsafe { libc::close(client) };
|
||||||
if state.contains(BootState::PostFsDataDone) && !state.contains(BootState::SafeMode)
|
if state.contains(BootState::PostFsDataDone) && !state.contains(BootState::SafeMode)
|
||||||
{
|
{
|
||||||
self.as_cxx().late_start();
|
self.late_start();
|
||||||
state.set(BootState::LateStartDone);
|
state.set(BootState::LateStartDone);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -83,7 +83,7 @@ impl MagiskD {
|
|||||||
unsafe { libc::close(client) };
|
unsafe { libc::close(client) };
|
||||||
if state.contains(BootState::PostFsDataDone) {
|
if state.contains(BootState::PostFsDataDone) {
|
||||||
state.set(BootState::BootComplete);
|
state.set(BootState::BootComplete);
|
||||||
self.as_cxx().boot_complete()
|
self.boot_complete()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
_ => {
|
_ => {
|
||||||
@@ -91,11 +91,6 @@ impl MagiskD {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#[inline(always)]
|
|
||||||
fn as_cxx(&self) -> &CxxMagiskD {
|
|
||||||
unsafe { mem::transmute(self) }
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn daemon_entry() {
|
pub fn daemon_entry() {
|
||||||
|
|||||||
@@ -108,7 +108,7 @@ db_settings::db_settings() {
|
|||||||
data[SU_MULTIUSER_MODE] = MULTIUSER_MODE_OWNER_ONLY;
|
data[SU_MULTIUSER_MODE] = MULTIUSER_MODE_OWNER_ONLY;
|
||||||
data[SU_MNT_NS] = NAMESPACE_MODE_REQUESTER;
|
data[SU_MNT_NS] = NAMESPACE_MODE_REQUESTER;
|
||||||
data[DENYLIST_CONFIG] = false;
|
data[DENYLIST_CONFIG] = false;
|
||||||
data[ZYGISK_CONFIG] = MagiskD::get()->is_emulator();
|
data[ZYGISK_CONFIG] = MagiskD().is_emulator();
|
||||||
data[BOOTLOOP_COUNT] = 0;
|
data[BOOTLOOP_COUNT] = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -2,29 +2,6 @@
|
|||||||
|
|
||||||
#include <base.hpp>
|
#include <base.hpp>
|
||||||
|
|
||||||
namespace rust {
|
|
||||||
struct MagiskD;
|
|
||||||
}
|
|
||||||
|
|
||||||
struct MagiskD {
|
|
||||||
// Make sure only references can exist
|
|
||||||
~MagiskD() = delete;
|
|
||||||
|
|
||||||
// Binding to Rust
|
|
||||||
static const MagiskD &get();
|
|
||||||
|
|
||||||
// C++ implementation
|
|
||||||
void reboot() const;
|
|
||||||
bool post_fs_data() const;
|
|
||||||
void late_start() const;
|
|
||||||
void boot_complete() const;
|
|
||||||
|
|
||||||
const rust::MagiskD *operator->() const;
|
|
||||||
|
|
||||||
private:
|
|
||||||
const rust::MagiskD &as_rust() const;
|
|
||||||
};
|
|
||||||
|
|
||||||
const char *get_magisk_tmp();
|
const char *get_magisk_tmp();
|
||||||
|
|
||||||
// Rust bindings
|
// Rust bindings
|
||||||
|
|||||||
@@ -74,12 +74,6 @@ pub mod ffi {
|
|||||||
fn resolve_preinit_dir(base_dir: Utf8CStrRef) -> String;
|
fn resolve_preinit_dir(base_dir: Utf8CStrRef) -> String;
|
||||||
|
|
||||||
fn switch_mnt_ns(pid: i32) -> i32;
|
fn switch_mnt_ns(pid: i32) -> i32;
|
||||||
|
|
||||||
#[cxx_name = "MagiskD"]
|
|
||||||
type CxxMagiskD;
|
|
||||||
fn post_fs_data(self: &CxxMagiskD) -> bool;
|
|
||||||
fn late_start(self: &CxxMagiskD);
|
|
||||||
fn boot_complete(self: &CxxMagiskD);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
extern "Rust" {
|
extern "Rust" {
|
||||||
@@ -99,18 +93,28 @@ pub mod ffi {
|
|||||||
unsafe fn persist_get_props(prop_cb: Pin<&mut PropCb>);
|
unsafe fn persist_get_props(prop_cb: Pin<&mut PropCb>);
|
||||||
unsafe fn persist_delete_prop(name: Utf8CStrRef) -> bool;
|
unsafe fn persist_delete_prop(name: Utf8CStrRef) -> bool;
|
||||||
unsafe fn persist_set_prop(name: Utf8CStrRef, value: Utf8CStrRef) -> bool;
|
unsafe fn persist_set_prop(name: Utf8CStrRef, value: Utf8CStrRef) -> bool;
|
||||||
|
|
||||||
|
#[namespace = "rust"]
|
||||||
|
fn daemon_entry();
|
||||||
}
|
}
|
||||||
|
|
||||||
#[namespace = "rust"]
|
// FFI for MagiskD
|
||||||
extern "Rust" {
|
extern "Rust" {
|
||||||
fn daemon_entry();
|
|
||||||
|
|
||||||
type MagiskD;
|
type MagiskD;
|
||||||
fn get_magiskd() -> &'static MagiskD;
|
|
||||||
fn setup_logfile(self: &MagiskD);
|
fn setup_logfile(self: &MagiskD);
|
||||||
fn is_emulator(self: &MagiskD) -> bool;
|
fn is_emulator(self: &MagiskD) -> bool;
|
||||||
fn is_recovery(self: &MagiskD) -> bool;
|
fn is_recovery(self: &MagiskD) -> bool;
|
||||||
fn boot_stage_handler(self: &MagiskD, client: i32, code: i32);
|
fn boot_stage_handler(self: &MagiskD, client: i32, code: i32);
|
||||||
|
|
||||||
|
#[cxx_name = "MagiskD"]
|
||||||
|
fn get_magiskd() -> &'static MagiskD;
|
||||||
|
}
|
||||||
|
unsafe extern "C++" {
|
||||||
|
#[allow(dead_code)]
|
||||||
|
fn reboot(self: &MagiskD);
|
||||||
|
fn post_fs_data(self: &MagiskD) -> bool;
|
||||||
|
fn late_start(self: &MagiskD);
|
||||||
|
fn boot_complete(self: &MagiskD);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user