Reorganization

This commit is contained in:
topjohnwu 2018-09-27 18:26:41 -04:00
parent 60b3b8ddce
commit cce636224c
13 changed files with 81 additions and 80 deletions

View File

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

View File

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

View File

@ -1,6 +1,3 @@
/* main.c - The multicall entry point
*/
#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
@ -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);
}

View File

@ -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[]);

View File

@ -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.
*

41
native/jni/main.c Normal file
View File

@ -0,0 +1,41 @@
#include <libgen.h>
#include <stdlib.h>
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#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);
}

View File

@ -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();

View File

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