diff --git a/native/jni/core/init.cpp b/native/jni/core/init.cpp index f2c2f626a..7a0c4e894 100644 --- a/native/jni/core/init.cpp +++ b/native/jni/core/init.cpp @@ -1,3 +1,9 @@ +#include +#include +#include +#include +#include +#include #include #include #include @@ -5,11 +11,6 @@ #include #include #include -#include -#include -#include -#include -#include #include #include @@ -175,6 +176,49 @@ static inline void parse_cmdline(const std::function= 300) { + close(eventfd); + return true; + } + // Check every 10ms + usleep(10000); + } + close(eventfd); + return false; +} + void MagiskInit::load_kernel_info() { // Communicate with kernel using procfs and sysfs mkdir("/proc", 0755); @@ -184,6 +228,7 @@ void MagiskInit::load_kernel_info() { bool enter_recovery = false; bool kirin = false; + bool recovery_mode = false; parse_cmdline([&](auto key, auto value) -> void { LOGD("cmdline: [%s]=[%s]\n", key.data(), value); @@ -205,21 +250,24 @@ void MagiskInit::load_kernel_info() { parse_prop_file("/.backup/.magisk", [&](auto key, auto value) -> bool { if (key == "RECOVERYMODE" && value == "true") - cmd.system_as_root = true; + recovery_mode = true; return true; }); if (kirin && enter_recovery) { // Inform that we are actually booting as recovery - if (!cmd.system_as_root) { + if (!recovery_mode) { if (FILE *f = fopen("/.backup/.magisk", "ae"); f) { fprintf(f, "RECOVERYMODE=true\n"); fclose(f); } - cmd.system_as_root = true; + recovery_mode = true; } } + if (recovery_mode) + cmd.system_as_root = !check_key_combo(); + if (cmd.dt_dir[0] == '\0') strcpy(cmd.dt_dir, DEFAULT_DT_DIR);