Adjust the daemon for Pixel support

This commit is contained in:
topjohnwu 2017-09-13 15:45:07 +08:00
parent 518f3d229f
commit 7a376c9efc
4 changed files with 52 additions and 22 deletions

View File

@ -314,7 +314,11 @@ static void clone_skeleton(struct node_entry *node) {
if (IS_LNK(child)) { if (IS_LNK(child)) {
// Copy symlinks directly // Copy symlinks directly
cp_afc(buf2, buf); cp_afc(buf2, buf);
LOGI("cplink: %s -> %s\n", buf2, buf); #ifdef MAGISK_DEBUG
LOGD("cplink: %s -> %s\n",buf2, buf);
#else
LOGI("cplink: %s\n", buf);
#endif
} else { } else {
snprintf(buf, PATH_MAX, "%s/%s", full_path, child->name); snprintf(buf, PATH_MAX, "%s/%s", full_path, child->name);
bind_mount(buf2, buf); bind_mount(buf2, buf);
@ -394,12 +398,26 @@ static void mount_mirrors() {
vec_init(&mounts); vec_init(&mounts);
file_to_vector("/proc/mounts", &mounts); file_to_vector("/proc/mounts", &mounts);
char *line; char *line;
int skip_initramfs = 0;
// Check whether skip_initramfs device
vec_for_each(&mounts, line) { vec_for_each(&mounts, line) {
if (strstr(line, " /system ")) { if (strstr(line, " /system_root ")) {
xmkdir_p(MIRRDIR "/system", 0755);
bind_mount("/system_root/system", MIRRDIR "/system");
skip_initramfs = 1;
break;
}
}
vec_for_each(&mounts, line) {
if (!skip_initramfs && strstr(line, " /system ")) {
sscanf(line, "%s", buf); sscanf(line, "%s", buf);
xmkdir_p(MIRRDIR "/system", 0755); xmkdir_p(MIRRDIR "/system", 0755);
xmount(buf, MIRRDIR "/system", "ext4", MS_RDONLY, NULL); xmount(buf, MIRRDIR "/system", "ext4", MS_RDONLY, NULL);
LOGI("mount: %s -> %s\n", buf, MIRRDIR "/system"); #ifdef MAGISK_DEBUG
LOGD("mount: %s -> %s\n", buf, MIRRDIR "/system");
#else
LOGI("mount: %s\n", MIRRDIR "/system");
#endif
continue; continue;
} }
if (strstr(line, " /vendor ")) { if (strstr(line, " /vendor ")) {
@ -407,14 +425,22 @@ static void mount_mirrors() {
sscanf(line, "%s", buf); sscanf(line, "%s", buf);
xmkdir_p(MIRRDIR "/vendor", 0755); xmkdir_p(MIRRDIR "/vendor", 0755);
xmount(buf, MIRRDIR "/vendor", "ext4", MS_RDONLY, NULL); xmount(buf, MIRRDIR "/vendor", "ext4", MS_RDONLY, NULL);
LOGI("mount: %s -> %s\n", buf, MIRRDIR "/vendor"); #ifdef MAGISK_DEBUG
LOGD("mount: %s -> %s\n", buf, MIRRDIR "/vendor");
#else
LOGI("mount: %s\n", MIRRDIR "/vendor");
#endif
continue; continue;
} }
} }
vec_deep_destroy(&mounts); vec_deep_destroy(&mounts);
if (!seperate_vendor) { if (!seperate_vendor) {
symlink(MIRRDIR "/system/vendor", MIRRDIR "/vendor"); symlink(MIRRDIR "/system/vendor", MIRRDIR "/vendor");
LOGI("link: %s -> %s\n", MIRRDIR "/system/vendor", MIRRDIR "/vendor"); #ifdef MAGISK_DEBUG
LOGD("link: %s -> %s\n", MIRRDIR "/system/vendor", MIRRDIR "/vendor");
#else
LOGI("link: %s\n", MIRRDIR "/vendor");
#endif
} }
mkdir_p(MIRRDIR "/bin", 0755); mkdir_p(MIRRDIR "/bin", 0755);
bind_mount(DATABIN, MIRRDIR "/bin"); bind_mount(DATABIN, MIRRDIR "/bin");
@ -503,9 +529,6 @@ void post_fs(int client) {
// Error handler // Error handler
err_handler = unblock_boot_process; err_handler = unblock_boot_process;
// Start log monitor
monitor_logs();
LOGI("** post-fs mode running\n"); LOGI("** post-fs mode running\n");
// ack // ack
write_int(client, 0); write_int(client, 0);
@ -536,6 +559,9 @@ void post_fs_data(int client) {
if (!check_data()) if (!check_data())
goto unblock; goto unblock;
// Start log monitor
monitor_logs();
#ifdef MAGISK_DEBUG #ifdef MAGISK_DEBUG
// Start debug logs in new process // Start debug logs in new process
debug_log_fd = xopen(DEBUG_LOG, O_WRONLY | O_CREAT | O_CLOEXEC | O_TRUNC, 0644); debug_log_fd = xopen(DEBUG_LOG, O_WRONLY | O_CREAT | O_CLOEXEC | O_TRUNC, 0644);
@ -569,10 +595,6 @@ void post_fs_data(int client) {
link_busybox(); link_busybox();
// Merge images // Merge images
if (merge_img("/cache/magisk.img", MAINIMG)) {
LOGE("Image merge %s -> %s failed!\n", "/cache/magisk.img", MAINIMG);
goto unblock;
}
if (merge_img("/data/magisk_merge.img", MAINIMG)) { if (merge_img("/data/magisk_merge.img", MAINIMG)) {
LOGE("Image merge %s -> %s failed!\n", "/data/magisk_merge.img", MAINIMG); LOGE("Image merge %s -> %s failed!\n", "/data/magisk_merge.img", MAINIMG);
goto unblock; goto unblock;

View File

@ -134,7 +134,7 @@ void start_daemon(int client) {
close(client); close(client);
xsetsid(); xsetsid();
setcon("u:r:su:s0"); setcon("u:r:su:s0");
umask(022); umask(0);
int fd = xopen("/dev/null", O_RDWR | O_CLOEXEC); int fd = xopen("/dev/null", O_RDWR | O_CLOEXEC);
xdup2(fd, STDIN_FILENO); xdup2(fd, STDIN_FILENO);
xdup2(fd, STDOUT_FILENO); xdup2(fd, STDOUT_FILENO);
@ -171,7 +171,6 @@ void start_daemon(int client) {
create_links(NULL, "/sbin"); create_links(NULL, "/sbin");
xchmod("/sbin", 0755); xchmod("/sbin", 0755);
xmkdir("/magisk", 0755); xmkdir("/magisk", 0755);
xchmod("/magisk", 0755);
xmount(NULL, "/", NULL, MS_REMOUNT | MS_RDONLY, NULL); xmount(NULL, "/", NULL, MS_REMOUNT | MS_RDONLY, NULL);
// Loop forever to listen for requests // Loop forever to listen for requests

View File

@ -21,7 +21,7 @@
static int zygote_num; static int zygote_num;
static char init_ns[32], zygote_ns[2][32], cache_block[256]; static char init_ns[32], zygote_ns[2][32], cache_block[256];
static int log_pid, log_fd, target_pid; static int log_pid, log_fd, target_pid, has_cache = 1;
static char *buffer; static char *buffer;
// Workaround for the lack of pthread_cancel // Workaround for the lack of pthread_cancel
@ -101,20 +101,30 @@ static void hide_daemon(int pid) {
file_to_vector(buffer, &mount_list); file_to_vector(buffer, &mount_list);
// Find the cache block name if not found yet // Find the cache block name if not found yet
if (cache_block[0] == '\0') { if (has_cache && cache_block[0] == '\0') {
vec_for_each(&mount_list, line) { vec_for_each(&mount_list, line) {
if (strstr(line, " /cache ")) { if (strstr(line, " /cache ")) {
sscanf(line, "%256s", cache_block); sscanf(line, "%256s", cache_block);
break; break;
} }
} }
if (strlen(cache_block) == 0)
has_cache = 0;
} }
// First unmount dummy skeletons, /sbin links, cache mounts, and mirrors // Unmout cache mounts
if (has_cache) {
vec_for_each(&mount_list, line) {
if (strstr(line, cache_block) && (strstr(line, " /system/") || strstr(line, " /vendor/"))) {
sscanf(line, "%*s %4096s", buffer);
lazy_unmount(buffer);
}
}
}
// Unmount dummy skeletons, /sbin links, and mirrors
vec_for_each(&mount_list, line) { vec_for_each(&mount_list, line) {
if (strstr(line, "tmpfs /system") || strstr(line, "tmpfs /vendor") || strstr(line, "tmpfs /sbin") if (strstr(line, "tmpfs /system") || strstr(line, "tmpfs /vendor") || strstr(line, "tmpfs /sbin") || strstr(line, MIRRDIR)) {
|| (strstr(line, cache_block) && (strstr(line, " /system") || strstr(line, " /vendor")))
|| strstr(line, MIRRDIR)) {
sscanf(line, "%*s %4096s", buffer); sscanf(line, "%*s %4096s", buffer);
lazy_unmount(buffer); lazy_unmount(buffer);
} }

View File

@ -196,8 +196,7 @@ void unlock_blocks() {
while((entry = readdir(dir))) { while((entry = readdir(dir))) {
if (entry->d_type == DT_BLK && if (entry->d_type == DT_BLK &&
strstr(entry->d_name, "ram") == NULL && strstr(entry->d_name, "ram") == NULL &&
strstr(entry->d_name, "loop") == NULL && strstr(entry->d_name, "loop") == NULL) {
strstr(entry->d_name, "dm-0") == NULL) {
snprintf(path, sizeof(path), "%s/%s", DEV_BLOCK, entry->d_name); snprintf(path, sizeof(path), "%s/%s", DEV_BLOCK, entry->d_name);
if ((fd = xopen(path, O_RDONLY)) < 0) if ((fd = xopen(path, O_RDONLY)) < 0)
continue; continue;