manager: fixed sus_su features

susfsd: added `sus_su support` command
This commit is contained in:
Rifat Azad
2025-07-21 04:53:12 +06:00
parent 948975ba35
commit a917314e84
4 changed files with 77 additions and 45 deletions

View File

@@ -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 =

View File

@@ -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")
} }

View File

@@ -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")

View File

@@ -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;
} }