diff --git a/native/jni/core/bootstages.c b/native/jni/core/bootstages.c index 242bd8e82..8c9490e95 100644 --- a/native/jni/core/bootstages.c +++ b/native/jni/core/bootstages.c @@ -465,6 +465,12 @@ static void unblock_boot_process() { pthread_exit(NULL); } +static const char wrapper[] = +"#!/system/bin/sh\n" +"unset LD_LIBRARY_PATH\n" +"unset LD_PRELOAD\n" +"exec /sbin/magisk.bin \"${0##*/}\" \"$@\"\n"; + void startup() { if (!check_data()) return; @@ -537,12 +543,17 @@ initialize: setfilecon("/sbin", "u:object_r:rootfs:s0"); sbin = xopen("/sbin", O_RDONLY | O_CLOEXEC); - // Setup magisk symlinks + // 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 + fd = creat("/sbin/magisk.bin", 0755); xwrite(fd, magisk, magisk_size); close(fd); free(magisk); - setfilecon("/sbin/magisk", "u:object_r:"SEPOL_FILE_DOMAIN":s0"); + 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); diff --git a/native/jni/core/magisk.c b/native/jni/core/magisk.c index fac59cd0f..f1f241f90 100644 --- a/native/jni/core/magisk.c +++ b/native/jni/core/magisk.c @@ -33,8 +33,8 @@ static void usage() { fprintf(stderr, "Magisk v" xstr(MAGISK_VERSION) "(" xstr(MAGISK_VER_CODE) ") (by topjohnwu) multi-call binary\n" "\n" - "Usage: %s [applet [arguments]...]\n" - " or: %s [options]...\n" + "Usage: magisk [applet [arguments]...]\n" + " or: magisk [options]...\n" "\n" "Options:\n" " -c print current binary version\n" @@ -56,8 +56,7 @@ static void usage() { "Supported init triggers:\n" " startup, post-fs-data, service\n" "\n" - "Supported applets:\n" - , argv0, argv0); + "Supported applets:\n"); for (int i = 0; applet[i]; ++i) fprintf(stderr, i ? ", %s" : " %s", applet[i]); @@ -65,102 +64,109 @@ static void usage() { exit(1); } +int magisk_main(int argc, char *argv[]) { + if (argc < 2) + usage(); + if (strcmp(argv[1], "-c") == 0) { + printf("%s (%d)\n", MAGISK_VER_STR, MAGISK_VER_CODE); + return 0; + } else if (strcmp(argv[1], "-v") == 0) { + int fd = connect_daemon(0); + write_int(fd, CHECK_VERSION); + char *v = read_string(fd); + printf("%s\n", v); + free(v); + return 0; + } else if (strcmp(argv[1], "-V") == 0) { + int fd = connect_daemon(0); + write_int(fd, CHECK_VERSION_CODE); + printf("%d\n", read_int(fd)); + return 0; + } else if (strcmp(argv[1], "--install") == 0) { + if (argc < 3) usage(); + 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]); + return 0; + } else if (strcmp(argv[1], "--createimg") == 0) { + if (argc < 4) usage(); + int size; + sscanf(argv[3], "%d", &size); + return create_img(argv[2], size); + } else if (strcmp(argv[1], "--imgsize") == 0) { + if (argc < 3) usage(); + int used, total; + if (get_img_size(argv[2], &used, &total)) { + fprintf(stderr, "Cannot check %s size\n", argv[2]); + return 1; + } + printf("%d %d\n", used, total); + return 0; + } else if (strcmp(argv[1], "--resizeimg") == 0) { + if (argc < 4) usage(); + int used, total, size; + sscanf(argv[3], "%d", &size); + if (get_img_size(argv[2], &used, &total)) { + fprintf(stderr, "Cannot check %s size\n", argv[2]); + return 1; + } + if (size <= used) { + fprintf(stderr, "Cannot resize smaller than %dM\n", used); + return 1; + } + return resize_img(argv[2], size); + } else if (strcmp(argv[1], "--mountimg") == 0) { + if (argc < 4) usage(); + char *loop = mount_image(argv[2], argv[3]); + if (loop == NULL) { + fprintf(stderr, "Cannot mount image!\n"); + return 1; + } else { + printf("%s\n", loop); + free(loop); + return 0; + } + } else if (strcmp(argv[1], "--umountimg") == 0) { + if (argc < 4) usage(); + umount_image(argv[2], argv[3]); + return 0; + } else if (strcmp(argv[1], "--unlock-blocks") == 0) { + unlock_blocks(); + return 0; + } else if (strcmp(argv[1], "--restorecon") == 0) { + fix_filecon(); + return 0; + } else if (strcmp(argv[1], "--clone-attr") == 0) { + if (argc < 4) usage(); + clone_attr(argv[2], argv[3]); + return 0; + } else if (strcmp(argv[1], "--daemon") == 0) { + int fd = connect_daemon(0); + close(fd); + return 0; + } else if (strcmp(argv[1], "--startup") == 0) { + startup(); + return 0; + } else if (strcmp(argv[1], "--post-fs-data") == 0) { + int fd = connect_daemon(1); + write_int(fd, POST_FS_DATA); + return read_int(fd); + } else if (strcmp(argv[1], "--service") == 0) { + int fd = connect_daemon(0); + write_int(fd, LATE_START); + return read_int(fd); + } + usage(); + return 1; +} + int main(int argc, char *argv[]) { umask(0); argv0 = argv[0]; - if (strcmp(basename(argv[0]), "magisk") == 0) { - if (argc < 2) usage(); - if (strcmp(argv[1], "-c") == 0) { - printf("%s (%d)\n", MAGISK_VER_STR, MAGISK_VER_CODE); - return 0; - } else if (strcmp(argv[1], "-v") == 0) { - int fd = connect_daemon(0); - write_int(fd, CHECK_VERSION); - char *v = read_string(fd); - printf("%s\n", v); - free(v); - return 0; - } else if (strcmp(argv[1], "-V") == 0) { - int fd = connect_daemon(0); - write_int(fd, CHECK_VERSION_CODE); - printf("%d\n", read_int(fd)); - return 0; - } else if (strcmp(argv[1], "--install") == 0) { - if (argc < 3) usage(); - 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]); - return 0; - } else if (strcmp(argv[1], "--createimg") == 0) { - if (argc < 4) usage(); - int size; - sscanf(argv[3], "%d", &size); - return create_img(argv[2], size); - } else if (strcmp(argv[1], "--imgsize") == 0) { - if (argc < 3) usage(); - int used, total; - if (get_img_size(argv[2], &used, &total)) { - fprintf(stderr, "Cannot check %s size\n", argv[2]); - return 1; - } - printf("%d %d\n", used, total); - return 0; - } else if (strcmp(argv[1], "--resizeimg") == 0) { - if (argc < 4) usage(); - int used, total, size; - sscanf(argv[3], "%d", &size); - if (get_img_size(argv[2], &used, &total)) { - fprintf(stderr, "Cannot check %s size\n", argv[2]); - return 1; - } - if (size <= used) { - fprintf(stderr, "Cannot resize smaller than %dM\n", used); - return 1; - } - return resize_img(argv[2], size); - } else if (strcmp(argv[1], "--mountimg") == 0) { - if (argc < 4) usage(); - char *loop = mount_image(argv[2], argv[3]); - if (loop == NULL) { - fprintf(stderr, "Cannot mount image!\n"); - return 1; - } else { - printf("%s\n", loop); - free(loop); - return 0; - } - } else if (strcmp(argv[1], "--umountimg") == 0) { - if (argc < 4) usage(); - umount_image(argv[2], argv[3]); - return 0; - } else if (strcmp(argv[1], "--unlock-blocks") == 0) { - unlock_blocks(); - return 0; - } else if (strcmp(argv[1], "--restorecon") == 0) { - fix_filecon(); - return 0; - } else if (strcmp(argv[1], "--clone-attr") == 0) { - if (argc < 4) usage(); - clone_attr(argv[2], argv[3]); - return 0; - } else if (strcmp(argv[1], "--daemon") == 0) { - int fd = connect_daemon(0); - close(fd); - return 0; - } else if (strcmp(argv[1], "--startup") == 0) { - startup(); - return 0; - } else if (strcmp(argv[1], "--post-fs-data") == 0) { - int fd = connect_daemon(1); - write_int(fd, POST_FS_DATA); - return read_int(fd); - } else if (strcmp(argv[1], "--service") == 0) { - int fd = connect_daemon(0); - write_int(fd, LATE_START); - return read_int(fd); - } else { + if (strcmp(basename(argv0), "magisk.bin") == 0) { + if (argc >= 2) { // It's calling applets --argc; ++argv; @@ -173,6 +179,6 @@ int main(int argc, char *argv[]) { return (*applet_main[i])(argc, argv); } - fprintf(stderr, "%s: applet not found\n", basename(argv[0])); - return 1; + // Not an applet + return magisk_main(argc, argv); }