diff --git a/native/jni/core/bootstages.cpp b/native/jni/core/bootstages.cpp index 453202fa8..95d041d39 100644 --- a/native/jni/core/bootstages.cpp +++ b/native/jni/core/bootstages.cpp @@ -728,7 +728,10 @@ void late_start(int client) { if (access(SECURE_DIR, F_OK) != 0) xmkdir(SECURE_DIR, 0700); // And reboot to make proper setup possible - exec_command_sync("/system/bin/reboot"); + if (RECOVERY_MODE) + exec_command_sync("/system/bin/reboot", "recovery"); + else + exec_command_sync("/system/bin/reboot"); } auto_start_magiskhide(); diff --git a/native/jni/core/daemon.cpp b/native/jni/core/daemon.cpp index 944fc990e..f284ccb56 100644 --- a/native/jni/core/daemon.cpp +++ b/native/jni/core/daemon.cpp @@ -23,7 +23,8 @@ #include int SDK_INT = -1; -struct stat SERVER_STAT; +bool RECOVERY_MODE = false; +static struct stat SERVER_STAT; static void verify_client(int client, pid_t pid) { // Verify caller is the same as server @@ -123,6 +124,13 @@ static void main_daemon() { return true; }); + // Load config status + parse_prop_file(MAGISKTMP "/config", [](auto key, auto val) -> bool { + if (key == "RECOVERYMODE" && val == "true") + RECOVERY_MODE = true; + return true; + }); + struct sockaddr_un sun; socklen_t len = setup_sockaddr(&sun, MAIN_SOCKET); fd = xsocket(AF_LOCAL, SOCK_STREAM | SOCK_CLOEXEC, 0); diff --git a/native/jni/include/daemon.h b/native/jni/include/daemon.h index 637a7a6c2..41baeb9c8 100644 --- a/native/jni/include/daemon.h +++ b/native/jni/include/daemon.h @@ -1,8 +1,4 @@ -/* daemon.h - Utility functions for daemon-client communication - */ - -#ifndef _DAEMON_H_ -#define _DAEMON_H_ +#pragma once #include #include @@ -87,4 +83,5 @@ void magiskhide_handler(int client); void su_daemon_handler(int client, struct ucred *credential); -#endif +extern int SDK_INT; +extern bool RECOVERY_MODE; diff --git a/native/jni/include/magisk.h b/native/jni/include/magisk.h index 1c2ec3460..e3dee09e7 100644 --- a/native/jni/include/magisk.h +++ b/native/jni/include/magisk.h @@ -26,8 +26,6 @@ // Legacy crap #define LEGACYCORE MODULEROOT "/.core" -extern int SDK_INT; - constexpr const char *applet_names[] = { "magisk", "su", "resetprop", "magiskhide", nullptr }; // Multi-call entrypoints diff --git a/native/jni/magiskhide/magiskhide.h b/native/jni/magiskhide/magiskhide.h index 9f70834c4..7e0a81e0e 100644 --- a/native/jni/magiskhide/magiskhide.h +++ b/native/jni/magiskhide/magiskhide.h @@ -10,7 +10,7 @@ #include #include -#include "daemon.h" +#include #define SIGTERMTHRD SIGUSR1