diff --git a/manager/app/src/main/java/com/rifsxd/ksunext/ui/screen/Home.kt b/manager/app/src/main/java/com/rifsxd/ksunext/ui/screen/Home.kt index f26be248..a4a0f217 100644 --- a/manager/app/src/main/java/com/rifsxd/ksunext/ui/screen/Home.kt +++ b/manager/app/src/main/java/com/rifsxd/ksunext/ui/screen/Home.kt @@ -650,7 +650,7 @@ private fun InfoCard(autoExpand: Boolean = false) { val suSFS = getSuSFS() if (suSFS == "Supported") { - val isSUS_SU = getSuSFSFeatures() == "CONFIG_KSU_SUSFS_SUS_SU" + val isSUS_SU = hasSuSFs_SUS_SU() == "Supported" val susSUMode = if (isSUS_SU) { val mode = susfsSUS_SU_Mode() val modeString = diff --git a/manager/app/src/main/java/com/rifsxd/ksunext/ui/screen/Settings.kt b/manager/app/src/main/java/com/rifsxd/ksunext/ui/screen/Settings.kt index 6f4b9aa4..4860dfb0 100644 --- a/manager/app/src/main/java/com/rifsxd/ksunext/ui/screen/Settings.kt +++ b/manager/app/src/main/java/com/rifsxd/ksunext/ui/screen/Settings.kt @@ -201,9 +201,9 @@ fun SettingScreen(navigator: DestinationsNavigator) { val prefs = context.getSharedPreferences("settings", Context.MODE_PRIVATE) val suSFS = getSuSFS() - val isSUS_SU = getSuSFSFeatures() + val isSUS_SU = hasSuSFs_SUS_SU() == "Supported" if (suSFS == "Supported") { - if (isSUS_SU == "CONFIG_KSU_SUSFS_SUS_SU") { + if (isSUS_SU) { var isEnabled by rememberSaveable { mutableStateOf(susfsSUS_SU_Mode() == "2") } diff --git a/manager/app/src/main/java/com/rifsxd/ksunext/ui/util/KsuCli.kt b/manager/app/src/main/java/com/rifsxd/ksunext/ui/util/KsuCli.kt index c8c04baf..08b6e858 100644 --- a/manager/app/src/main/java/com/rifsxd/ksunext/ui/util/KsuCli.kt +++ b/manager/app/src/main/java/com/rifsxd/ksunext/ui/util/KsuCli.kt @@ -591,12 +591,19 @@ fun getSuSFSVariant(): String { val result = ShellUtils.fastCmd(shell, "${getSuSFSDaemonPath()} variant") return result } + fun getSuSFSFeatures(): String { val shell = getRootShell() val result = ShellUtils.fastCmd(shell, "${getSuSFSDaemonPath()} features") return result } +fun hasSuSFs_SUS_SU(): String { + val shell = getRootShell() + val result = ShellUtils.fastCmd(shell, "${getSuSFSDaemonPath()} sus_su support") + return result +} + fun susfsSUS_SU_0(): String { val shell = getRootShell() val result = ShellUtils.fastCmd(shell, "${getSuSFSDaemonPath()} sus_su 0") diff --git a/userspace/susfsd/jni/susfsd.c b/userspace/susfsd/jni/susfsd.c index 8ac8ca7c..2a156ac8 100644 --- a/userspace/susfsd/jni/susfsd.c +++ b/userspace/susfsd/jni/susfsd.c @@ -104,52 +104,77 @@ int main(int argc, char *argv[]) { prctl(KERNEL_SU_OPTION, CMD_SUSFS_SHOW_ENABLED_FEATURES, enabled_features, bufsize, &error); printf("%s\n", error || !strlen(enabled_features) ? "Unsupported" : "Supported"); free(enabled_features); - } else if (argc == 3 && !strcmp(argv[1], "sus_su")) { - int last_working_mode = 0; - int target_working_mode; - char* endptr; + } else if (argc >= 2 && !strcmp(argv[1], "sus_su")) { + if (argc == 3 && strcmp(argv[2], "support") == 0) { + char *enabled_features; + size_t bufsize = getpagesize() * 2; + enabled_features = (char *)malloc(bufsize); + if (!enabled_features) { + perror("malloc"); + return -ENOMEM; + } + prctl(KERNEL_SU_OPTION, CMD_SUSFS_SHOW_ENABLED_FEATURES, enabled_features, bufsize, &error); + if (!error && strstr(enabled_features, "CONFIG_KSU_SUSFS_SUS_SU")) { + printf("Supported\n"); + } else { + printf("Unsupported\n"); + } + free(enabled_features); + return 0; + } else if (argc == 3) { + int last_working_mode = 0; + int target_working_mode; + char *endptr; - prctl(KERNEL_SU_OPTION, CMD_SUSFS_SHOW_SUS_SU_WORKING_MODE, &last_working_mode, NULL, &error); - if (error) - return error; - if (!strcmp(argv[2], "mode")) { - printf("%d\n", last_working_mode); - return 0; - } - target_working_mode = strtol(argv[2], &endptr, 10); - if (*endptr != '\0') { - return 1; - } - if (target_working_mode == SUS_SU_WITH_HOOKS) { - bool is_sus_su_ready; - prctl(KERNEL_SU_OPTION, CMD_SUSFS_IS_SUS_SU_READY, &is_sus_su_ready, NULL, &error); - if (error) - return error; - if (!is_sus_su_ready) { - printf("[-] sus_su mode %d has to be run during or after service stage\n", SUS_SU_WITH_HOOKS); - return 1; - } - if (last_working_mode == SUS_SU_DISABLED) { - error = enable_sus_su(last_working_mode, SUS_SU_WITH_HOOKS); - } else if (last_working_mode == SUS_SU_WITH_HOOKS) { - printf("[-] sus_su is already in mode %d\n", last_working_mode); - return 1; - } else { - error = enable_sus_su(last_working_mode, SUS_SU_DISABLED); - if (!error) - error = enable_sus_su(last_working_mode, SUS_SU_WITH_HOOKS); - } - } else if (target_working_mode == SUS_SU_DISABLED) { - if (last_working_mode == SUS_SU_DISABLED) { - printf("[-] sus_su is already in mode %d\n", last_working_mode); - return 1; - } - error = enable_sus_su(last_working_mode, SUS_SU_DISABLED); - } + prctl(KERNEL_SU_OPTION, CMD_SUSFS_SHOW_SUS_SU_WORKING_MODE, &last_working_mode, NULL, &error); + if (error) + return error; + + if (!strcmp(argv[2], "mode")) { + printf("%d\n", last_working_mode); + return 0; + } + + target_working_mode = strtol(argv[2], &endptr, 10); + if (*endptr != '\0') { + return 1; + } + + if (target_working_mode == SUS_SU_WITH_HOOKS) { + bool is_sus_su_ready; + prctl(KERNEL_SU_OPTION, CMD_SUSFS_IS_SUS_SU_READY, &is_sus_su_ready, NULL, &error); + if (error) + return error; + if (!is_sus_su_ready) { + printf("[-] sus_su mode %d has to be run during or after service stage\n", SUS_SU_WITH_HOOKS); + return 1; + } + + if (last_working_mode == SUS_SU_DISABLED) { + error = enable_sus_su(last_working_mode, SUS_SU_WITH_HOOKS); + } else if (last_working_mode == SUS_SU_WITH_HOOKS) { + printf("[-] sus_su is already in mode %d\n", last_working_mode); + return 1; + } else { + error = enable_sus_su(last_working_mode, SUS_SU_DISABLED); + if (!error) + error = enable_sus_su(last_working_mode, SUS_SU_WITH_HOOKS); + } + } else if (target_working_mode == SUS_SU_DISABLED) { + if (last_working_mode == SUS_SU_DISABLED) { + printf("[-] sus_su is already in mode %d\n", last_working_mode); + return 1; + } + error = enable_sus_su(last_working_mode, SUS_SU_DISABLED); + } + } else { + fprintf(stderr, "Usage: %s sus_su <0|2|mode|support>\n", argv[0]); + return 1; + } } else { fprintf(stderr, "Invalid argument: %s\n", argv[1]); return 1; } return 0; -} +} \ No newline at end of file