diff --git a/native/jni/Android.mk b/native/jni/Android.mk index 0c5a962e5..e4ab1223c 100644 --- a/native/jni/Android.mk +++ b/native/jni/Android.mk @@ -32,12 +32,14 @@ LOCAL_C_INCLUDES := \ $(LIBUTILS) LOCAL_SRC_FILES := \ - core/magisk.c \ - core/daemon.c \ - core/log_daemon.c \ - core/bootstages.c \ - core/socket.c \ - core/db.c \ + main.c \ + img.c \ + daemon/magisk.c \ + daemon/daemon.c \ + daemon/log_daemon.c \ + daemon/bootstages.c \ + daemon/socket.c \ + daemon/db.c \ magiskhide/magiskhide.c \ magiskhide/proc_monitor.c \ magiskhide/hide_utils.c \ @@ -48,8 +50,7 @@ LOCAL_SRC_FILES := \ su/su.c \ su/connect.c \ su/pts.c \ - su/su_daemon.c \ - utils/img.c + su/su_daemon.c LOCAL_LDLIBS := -llog include $(BUILD_EXECUTABLE) @@ -72,7 +73,7 @@ LOCAL_C_INCLUDES := \ $(LIBUTILS) LOCAL_SRC_FILES := \ - core/magiskinit.c \ + init.c \ magiskpolicy/api.c \ magiskpolicy/magiskpolicy.c \ magiskpolicy/rules.c \ diff --git a/native/jni/core/bootstages.c b/native/jni/daemon/bootstages.c similarity index 99% rename from native/jni/core/bootstages.c rename to native/jni/daemon/bootstages.c index eb3b2bc4a..f778db9f6 100644 --- a/native/jni/core/bootstages.c +++ b/native/jni/daemon/bootstages.c @@ -593,21 +593,23 @@ void startup() { setfilecon("/sbin", "u:object_r:rootfs:s0"); sbin = xopen("/sbin", O_RDONLY | O_CLOEXEC); - // Create wrapper - fd = creat("/sbin/magisk", 0755); - xwrite(fd, wrapper, sizeof(wrapper) - 1); - close(fd); - setfilecon("/sbin/magisk", "u:object_r:"SEPOL_FILE_DOMAIN":s0"); - // Setup magisk symlinks + // Create applet symlinks + for (int i = 0; applet_names[i]; ++i) { + snprintf(buf, PATH_MAX, "/sbin/%s", applet_names[i]); + xsymlink("/sbin/magisk", buf); + } + + // Setup binary and wrapper fd = creat("/sbin/magisk.bin", 0755); xwrite(fd, magisk, magisk_size); close(fd); free(magisk); + unlink("/sbin/magisk"); + fd = creat("/sbin/magisk", 0755); + xwrite(fd, wrapper, sizeof(wrapper) - 1); + close(fd); setfilecon("/sbin/magisk.bin", "u:object_r:"SEPOL_FILE_DOMAIN":s0"); - for (int i = 0; applet[i]; ++i) { - snprintf(buf, PATH_MAX, "/sbin/%s", applet[i]); - xsymlink("/sbin/magisk", buf); - } + setfilecon("/sbin/magisk", "u:object_r:"SEPOL_FILE_DOMAIN":s0"); // Setup magiskinit symlinks fd = creat("/sbin/magiskinit", 0755); diff --git a/native/jni/core/daemon.c b/native/jni/daemon/daemon.c similarity index 100% rename from native/jni/core/daemon.c rename to native/jni/daemon/daemon.c diff --git a/native/jni/core/db.c b/native/jni/daemon/db.c similarity index 100% rename from native/jni/core/db.c rename to native/jni/daemon/db.c diff --git a/native/jni/core/log_daemon.c b/native/jni/daemon/log_daemon.c similarity index 100% rename from native/jni/core/log_daemon.c rename to native/jni/daemon/log_daemon.c diff --git a/native/jni/core/magisk.c b/native/jni/daemon/magisk.c similarity index 75% rename from native/jni/core/magisk.c rename to native/jni/daemon/magisk.c index b6b9d89c2..b0d577425 100644 --- a/native/jni/core/magisk.c +++ b/native/jni/daemon/magisk.c @@ -1,6 +1,3 @@ -/* main.c - The multicall entry point - */ - #include #include #include @@ -13,11 +10,6 @@ #include "selinux.h" #include "flags.h" -char *argv0; - -int (*applet_main[]) (int, char *[]) = - { su_client_main, resetprop_main, magiskhide_main, imgtool_main, NULL }; - int create_links(const char *bin, const char *path) { char self[PATH_MAX], linkpath[PATH_MAX]; if (bin == NULL) { @@ -25,8 +17,8 @@ int create_links(const char *bin, const char *path) { bin = self; } int ret = 0; - for (int i = 0; applet[i]; ++i) { - snprintf(linkpath, sizeof(linkpath), "%s/%s", path, applet[i]); + for (int i = 0; applet_names[i]; ++i) { + snprintf(linkpath, sizeof(linkpath), "%s/%s", path, applet_names[i]); unlink(linkpath); ret |= symlink(bin, linkpath); } @@ -57,8 +49,8 @@ static void usage() { "\n" "Supported applets:\n"); - for (int i = 0; applet[i]; ++i) - fprintf(stderr, i ? ", %s" : " %s", applet[i]); + for (int i = 0; applet_names[i]; ++i) + fprintf(stderr, i ? ", %s" : " %s", applet_names[i]); fprintf(stderr, "\n\n"); exit(1); } @@ -86,8 +78,8 @@ int magisk_main(int argc, char *argv[]) { if (argc == 3) return create_links(NULL, argv[2]); else return create_links(argv[2], argv[3]); } else if (strcmp(argv[1], "--list") == 0) { - for (int i = 0; applet[i]; ++i) - printf("%s\n", applet[i]); + for (int i = 0; applet_names[i]; ++i) + printf("%s\n", applet_names[i]); return 0; } else if (strcmp(argv[1], "--unlock-blocks") == 0) { unlock_blocks(); @@ -120,41 +112,6 @@ int magisk_main(int argc, char *argv[]) { return read_int(fd); } - // Applets - argc--; - argv++; - for (int i = 0; applet[i]; ++i) { - if (strcmp(basename(argv[0]), applet[i]) == 0) { - strcpy(argv0, basename(argv[0])); - return (*applet_main[i])(argc, argv); - } - } - usage(); return 1; } - -int main(int argc, char *argv[]) { - umask(0); - argv0 = argv[0]; - setup_selinux(); - - if (strcmp(basename(argv0), "magisk.bin") == 0) { - if (argc >= 2) { - // It's calling applets - --argc; - ++argv; - } - } - - // Applets - for (int i = 0; applet[i]; ++i) { - if (strcmp(basename(argv[0]), applet[i]) == 0) { - strcpy(argv0, basename(argv[0])); - return (*applet_main[i])(argc, argv); - } - } - - // Not an applet - return magisk_main(argc, argv); -} diff --git a/native/jni/core/socket.c b/native/jni/daemon/socket.c similarity index 100% rename from native/jni/core/socket.c rename to native/jni/daemon/socket.c diff --git a/native/jni/utils/img.c b/native/jni/img.c similarity index 100% rename from native/jni/utils/img.c rename to native/jni/img.c diff --git a/native/jni/include/magisk.h b/native/jni/include/magisk.h index a8cb8721c..e9b4865e7 100644 --- a/native/jni/include/magisk.h +++ b/native/jni/include/magisk.h @@ -42,7 +42,7 @@ extern char *argv0; /* For changing process name */ -#define applet ((char *[]) { "su", "resetprop", "magiskhide", "imgtool", NULL }) +#define applet_names ((char *[]) { "magisk", "su", "resetprop", "magiskhide", "imgtool", NULL }) #define init_applet ((char *[]) { "magiskpolicy", "supolicy", NULL }) extern int (*applet_main[]) (int, char *[]), (*init_applet_main[]) (int, char *[]); @@ -50,6 +50,7 @@ extern int (*applet_main[]) (int, char *[]), (*init_applet_main[]) (int, char *[ int create_links(const char *bin, const char *path); // Multi-call entrypoints +int magisk_main(int argc, char *argv[]); int magiskhide_main(int argc, char *argv[]); int magiskpolicy_main(int argc, char *argv[]); int su_client_main(int argc, char *argv[]); diff --git a/native/jni/core/magiskinit.c b/native/jni/init.c similarity index 99% rename from native/jni/core/magiskinit.c rename to native/jni/init.c index f572a6729..3086c8944 100644 --- a/native/jni/core/magiskinit.c +++ b/native/jni/init.c @@ -1,4 +1,4 @@ -/* magiskinit.c - Pre-init Magisk support +/* init.c - Pre-init Magisk support * * This code has to be compiled statically to work properly. * diff --git a/native/jni/main.c b/native/jni/main.c new file mode 100644 index 000000000..f73189f63 --- /dev/null +++ b/native/jni/main.c @@ -0,0 +1,41 @@ +#include +#include +#include +#include +#include + +#include "magisk.h" +#include "selinux.h" + +int (*applet_main[]) (int, char *[]) = + { magisk_main, su_client_main, resetprop_main, magiskhide_main, imgtool_main, NULL }; + +char *argv0; + +__attribute__((noreturn)) static void call_applets(int argc, char *argv[]) { + // Applets + for (int i = 0; applet_names[i]; ++i) { + if (strcmp(basename(argv[0]), applet_names[i]) == 0) { + strcpy(argv0, basename(argv[0])); + exit((*applet_main[i])(argc, argv)); + } + } + fprintf(stderr, "%s: applet not found\n", argv[0]); + exit(1); +} + +int main(int argc, char *argv[]) { + umask(0); + argv0 = argv[0]; + dload_selinux(); + + if (strcmp(basename(argv0), "magisk.bin") == 0 || + (strcmp(basename(argv[0]), "magisk") == 0 + && argc > 1 && argv[1][0] != '-')) { + --argc; + ++argv; + } + + call_applets(argc, argv); +} + diff --git a/native/jni/utils/include/selinux.h b/native/jni/utils/include/selinux.h index f6f8b608f..0a51b0d12 100644 --- a/native/jni/utils/include/selinux.h +++ b/native/jni/utils/include/selinux.h @@ -8,5 +8,5 @@ extern int (*lgetfilecon)(const char *path, char ** con); extern int (*setfilecon)(const char *path, const char * con); extern int (*lsetfilecon)(const char *path, const char * con); -void setup_selinux(); +void dload_selinux(); void restorecon(); diff --git a/native/jni/utils/selinux.c b/native/jni/utils/selinux.c index ebb86592c..823590a0a 100644 --- a/native/jni/utils/selinux.c +++ b/native/jni/utils/selinux.c @@ -28,14 +28,14 @@ static int i_ssp(const char *s, char ** sp) { // Function pointers -void (*freecon)(char * con) = v_s; -int (*setcon)(const char * con) = i_s; -int (*getfilecon)(const char *path, char ** con) = i_ssp; -int (*lgetfilecon)(const char *path, char ** con) = i_ssp; -int (*setfilecon)(const char *path, const char * con) = i_ss; -int (*lsetfilecon)(const char *path, const char * con) = i_ss; +void (*freecon)(char *) = v_s; +int (*setcon)(const char *) = i_s; +int (*getfilecon)(const char *, char **) = i_ssp; +int (*lgetfilecon)(const char *, char **) = i_ssp; +int (*setfilecon)(const char *, const char *) = i_ss; +int (*lsetfilecon)(const char *, const char *) = i_ss; -void setup_selinux() { +void dload_selinux() { void *handle = dlopen("libselinux.so", RTLD_LAZY); if (handle == NULL) return; @@ -112,9 +112,8 @@ static void restore_magiskcon(int dirfd) { void restorecon() { int fd; fd = xopen(SELINUX_CONTEXT, O_WRONLY | O_CLOEXEC); - if (write(fd, ADB_CON, sizeof(ADB_CON)) >= 0) { + if (write(fd, ADB_CON, sizeof(ADB_CON)) >= 0) lsetfilecon(SECURE_DIR, ADB_CON); - } close(fd); fd = xopen(MOUNTPOINT, O_RDONLY | O_CLOEXEC); restore_syscon(fd);