You've already forked KernelSU-Next
mirror of
https://github.com/KernelSU-Next/KernelSU-Next.git
synced 2025-08-27 23:46:34 +00:00
manager: fixed sus_su features
susfsd: added `sus_su support` command
This commit is contained in:
@@ -650,7 +650,7 @@ private fun InfoCard(autoExpand: Boolean = false) {
|
|||||||
|
|
||||||
val suSFS = getSuSFS()
|
val suSFS = getSuSFS()
|
||||||
if (suSFS == "Supported") {
|
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 susSUMode = if (isSUS_SU) {
|
||||||
val mode = susfsSUS_SU_Mode()
|
val mode = susfsSUS_SU_Mode()
|
||||||
val modeString =
|
val modeString =
|
||||||
|
|||||||
@@ -201,9 +201,9 @@ fun SettingScreen(navigator: DestinationsNavigator) {
|
|||||||
val prefs = context.getSharedPreferences("settings", Context.MODE_PRIVATE)
|
val prefs = context.getSharedPreferences("settings", Context.MODE_PRIVATE)
|
||||||
|
|
||||||
val suSFS = getSuSFS()
|
val suSFS = getSuSFS()
|
||||||
val isSUS_SU = getSuSFSFeatures()
|
val isSUS_SU = hasSuSFs_SUS_SU() == "Supported"
|
||||||
if (suSFS == "Supported") {
|
if (suSFS == "Supported") {
|
||||||
if (isSUS_SU == "CONFIG_KSU_SUSFS_SUS_SU") {
|
if (isSUS_SU) {
|
||||||
var isEnabled by rememberSaveable {
|
var isEnabled by rememberSaveable {
|
||||||
mutableStateOf(susfsSUS_SU_Mode() == "2")
|
mutableStateOf(susfsSUS_SU_Mode() == "2")
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -591,12 +591,19 @@ fun getSuSFSVariant(): String {
|
|||||||
val result = ShellUtils.fastCmd(shell, "${getSuSFSDaemonPath()} variant")
|
val result = ShellUtils.fastCmd(shell, "${getSuSFSDaemonPath()} variant")
|
||||||
return result
|
return result
|
||||||
}
|
}
|
||||||
|
|
||||||
fun getSuSFSFeatures(): String {
|
fun getSuSFSFeatures(): String {
|
||||||
val shell = getRootShell()
|
val shell = getRootShell()
|
||||||
val result = ShellUtils.fastCmd(shell, "${getSuSFSDaemonPath()} features")
|
val result = ShellUtils.fastCmd(shell, "${getSuSFSDaemonPath()} features")
|
||||||
return result
|
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 {
|
fun susfsSUS_SU_0(): String {
|
||||||
val shell = getRootShell()
|
val shell = getRootShell()
|
||||||
val result = ShellUtils.fastCmd(shell, "${getSuSFSDaemonPath()} sus_su 0")
|
val result = ShellUtils.fastCmd(shell, "${getSuSFSDaemonPath()} sus_su 0")
|
||||||
|
|||||||
@@ -104,52 +104,77 @@ int main(int argc, char *argv[]) {
|
|||||||
prctl(KERNEL_SU_OPTION, CMD_SUSFS_SHOW_ENABLED_FEATURES, enabled_features, bufsize, &error);
|
prctl(KERNEL_SU_OPTION, CMD_SUSFS_SHOW_ENABLED_FEATURES, enabled_features, bufsize, &error);
|
||||||
printf("%s\n", error || !strlen(enabled_features) ? "Unsupported" : "Supported");
|
printf("%s\n", error || !strlen(enabled_features) ? "Unsupported" : "Supported");
|
||||||
free(enabled_features);
|
free(enabled_features);
|
||||||
} else if (argc == 3 && !strcmp(argv[1], "sus_su")) {
|
} else if (argc >= 2 && !strcmp(argv[1], "sus_su")) {
|
||||||
int last_working_mode = 0;
|
if (argc == 3 && strcmp(argv[2], "support") == 0) {
|
||||||
int target_working_mode;
|
char *enabled_features;
|
||||||
char* endptr;
|
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);
|
prctl(KERNEL_SU_OPTION, CMD_SUSFS_SHOW_SUS_SU_WORKING_MODE, &last_working_mode, NULL, &error);
|
||||||
if (error)
|
if (error)
|
||||||
return error;
|
return error;
|
||||||
if (!strcmp(argv[2], "mode")) {
|
|
||||||
printf("%d\n", last_working_mode);
|
if (!strcmp(argv[2], "mode")) {
|
||||||
return 0;
|
printf("%d\n", last_working_mode);
|
||||||
}
|
return 0;
|
||||||
target_working_mode = strtol(argv[2], &endptr, 10);
|
}
|
||||||
if (*endptr != '\0') {
|
|
||||||
return 1;
|
target_working_mode = strtol(argv[2], &endptr, 10);
|
||||||
}
|
if (*endptr != '\0') {
|
||||||
if (target_working_mode == SUS_SU_WITH_HOOKS) {
|
return 1;
|
||||||
bool is_sus_su_ready;
|
}
|
||||||
prctl(KERNEL_SU_OPTION, CMD_SUSFS_IS_SUS_SU_READY, &is_sus_su_ready, NULL, &error);
|
|
||||||
if (error)
|
if (target_working_mode == SUS_SU_WITH_HOOKS) {
|
||||||
return error;
|
bool is_sus_su_ready;
|
||||||
if (!is_sus_su_ready) {
|
prctl(KERNEL_SU_OPTION, CMD_SUSFS_IS_SUS_SU_READY, &is_sus_su_ready, NULL, &error);
|
||||||
printf("[-] sus_su mode %d has to be run during or after service stage\n", SUS_SU_WITH_HOOKS);
|
if (error)
|
||||||
return 1;
|
return error;
|
||||||
}
|
if (!is_sus_su_ready) {
|
||||||
if (last_working_mode == SUS_SU_DISABLED) {
|
printf("[-] sus_su mode %d has to be run during or after service stage\n", SUS_SU_WITH_HOOKS);
|
||||||
error = enable_sus_su(last_working_mode, SUS_SU_WITH_HOOKS);
|
return 1;
|
||||||
} else if (last_working_mode == SUS_SU_WITH_HOOKS) {
|
}
|
||||||
printf("[-] sus_su is already in mode %d\n", last_working_mode);
|
|
||||||
return 1;
|
if (last_working_mode == SUS_SU_DISABLED) {
|
||||||
} else {
|
error = enable_sus_su(last_working_mode, SUS_SU_WITH_HOOKS);
|
||||||
error = enable_sus_su(last_working_mode, SUS_SU_DISABLED);
|
} else if (last_working_mode == SUS_SU_WITH_HOOKS) {
|
||||||
if (!error)
|
printf("[-] sus_su is already in mode %d\n", last_working_mode);
|
||||||
error = enable_sus_su(last_working_mode, SUS_SU_WITH_HOOKS);
|
return 1;
|
||||||
}
|
} else {
|
||||||
} else if (target_working_mode == SUS_SU_DISABLED) {
|
error = enable_sus_su(last_working_mode, SUS_SU_DISABLED);
|
||||||
if (last_working_mode == SUS_SU_DISABLED) {
|
if (!error)
|
||||||
printf("[-] sus_su is already in mode %d\n", last_working_mode);
|
error = enable_sus_su(last_working_mode, SUS_SU_WITH_HOOKS);
|
||||||
return 1;
|
}
|
||||||
}
|
} else if (target_working_mode == SUS_SU_DISABLED) {
|
||||||
error = enable_sus_su(last_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 {
|
} else {
|
||||||
fprintf(stderr, "Invalid argument: %s\n", argv[1]);
|
fprintf(stderr, "Invalid argument: %s\n", argv[1]);
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
Reference in New Issue
Block a user