Improve daemon startup
This commit is contained in:
parent
7db3d84ba2
commit
614c552e55
@ -137,29 +137,33 @@ void daemon_init() {
|
|||||||
DIR *dir;
|
DIR *dir;
|
||||||
struct dirent *entry;
|
struct dirent *entry;
|
||||||
int root, sbin, fd;
|
int root, sbin, fd;
|
||||||
char buf[PATH_MAX], buf2[PATH_MAX];
|
char buf[PATH_MAX];
|
||||||
void *data;
|
void *magisk, *init;
|
||||||
size_t size;
|
size_t magisk_size, init_size;
|
||||||
|
|
||||||
// Create hardlink mirror of /sbin to /root
|
// Create hardlink mirror of /sbin to /root
|
||||||
xmount(NULL, "/", NULL, MS_REMOUNT, NULL);
|
xmount(NULL, "/", NULL, MS_REMOUNT, NULL);
|
||||||
full_read("/sbin/magisk", &data, &size);
|
mkdir("/root", 0750);
|
||||||
|
full_read("/sbin/magisk", &magisk, &magisk_size);
|
||||||
|
full_read("/sbin/magiskinit", &init, &init_size);
|
||||||
root = xopen("/root", O_RDONLY | O_CLOEXEC);
|
root = xopen("/root", O_RDONLY | O_CLOEXEC);
|
||||||
sbin = xopen("/sbin", O_RDONLY | O_CLOEXEC);
|
sbin = xopen("/sbin", O_RDONLY | O_CLOEXEC);
|
||||||
|
// unlink("/sbin/magisk");
|
||||||
|
unlink("/sbin/magiskinit");
|
||||||
link_dir(sbin, root);
|
link_dir(sbin, root);
|
||||||
unlink("/sbin/magisk");
|
|
||||||
close(sbin);
|
close(sbin);
|
||||||
|
|
||||||
// Mount the /sbin tmpfs overlay
|
// Mount the /sbin tmpfs overlay
|
||||||
xmount("tmpfs", "/sbin", "tmpfs", 0, NULL);
|
xmount("tmpfs", "/sbin", "tmpfs", 0, NULL);
|
||||||
chmod("/sbin", 0755);
|
chmod("/sbin", 0755);
|
||||||
setfilecon("/sbin", "u:object_r:rootfs:s0");
|
setfilecon("/sbin", "u:object_r:rootfs:s0");
|
||||||
|
sbin = xopen("/sbin", O_RDONLY | O_CLOEXEC);
|
||||||
|
|
||||||
// Setup magisk
|
// Setup magisk
|
||||||
fd = creat("/sbin/magisk", 0755);
|
fd = creat("/sbin/magisk", 0755);
|
||||||
xwrite(fd, data, size);
|
xwrite(fd, magisk, magisk_size);
|
||||||
close(fd);
|
close(fd);
|
||||||
free(data);
|
free(magisk);
|
||||||
setfilecon("/sbin/magisk", "u:object_r:"SEPOL_FILE_DOMAIN":s0");
|
setfilecon("/sbin/magisk", "u:object_r:"SEPOL_FILE_DOMAIN":s0");
|
||||||
for (int i = 0; applet[i]; ++i) {
|
for (int i = 0; applet[i]; ++i) {
|
||||||
snprintf(buf, PATH_MAX, "/sbin/%s", applet[i]);
|
snprintf(buf, PATH_MAX, "/sbin/%s", applet[i]);
|
||||||
@ -167,12 +171,10 @@ void daemon_init() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Setup magiskinit
|
// Setup magiskinit
|
||||||
full_read("/root/magiskinit", &data, &size);
|
|
||||||
unlink("/root/magiskinit");
|
|
||||||
fd = creat("/sbin/magiskinit", 0755);
|
fd = creat("/sbin/magiskinit", 0755);
|
||||||
xwrite(fd, data, size);
|
xwrite(fd, init, init_size);
|
||||||
close(fd);
|
close(fd);
|
||||||
free(data);
|
free(init);
|
||||||
setfilecon("/sbin/magiskinit", "u:object_r:"SEPOL_FILE_DOMAIN":s0");
|
setfilecon("/sbin/magiskinit", "u:object_r:"SEPOL_FILE_DOMAIN":s0");
|
||||||
for (int i = 0; init_applet[i]; ++i) {
|
for (int i = 0; init_applet[i]; ++i) {
|
||||||
snprintf(buf, PATH_MAX, "/sbin/%s", init_applet[i]);
|
snprintf(buf, PATH_MAX, "/sbin/%s", init_applet[i]);
|
||||||
@ -184,10 +186,10 @@ void daemon_init() {
|
|||||||
while((entry = xreaddir(dir))) {
|
while((entry = xreaddir(dir))) {
|
||||||
if (strcmp(entry->d_name, ".") == 0 || strcmp(entry->d_name, "..") == 0) continue;
|
if (strcmp(entry->d_name, ".") == 0 || strcmp(entry->d_name, "..") == 0) continue;
|
||||||
snprintf(buf, PATH_MAX, "/root/%s", entry->d_name);
|
snprintf(buf, PATH_MAX, "/root/%s", entry->d_name);
|
||||||
snprintf(buf2, PATH_MAX, "/sbin/%s", entry->d_name);
|
symlinkat(buf, sbin, entry->d_name);
|
||||||
xsymlink(buf, buf2);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
close(sbin);
|
||||||
close(root);
|
close(root);
|
||||||
xmount(NULL, "/", NULL, MS_REMOUNT | MS_RDONLY, NULL);
|
xmount(NULL, "/", NULL, MS_REMOUNT | MS_RDONLY, NULL);
|
||||||
|
|
||||||
|
@ -375,14 +375,8 @@ int main(int argc, char *argv[]) {
|
|||||||
if (null > STDERR_FILENO)
|
if (null > STDERR_FILENO)
|
||||||
close(null);
|
close(null);
|
||||||
|
|
||||||
// Extract and link files
|
// Backup self
|
||||||
mkdir("/overlay", 0000);
|
link("/init", "/init.bak");
|
||||||
dump_magiskrc("/overlay/init.magisk.rc", 0750);
|
|
||||||
mkdir("/overlay/sbin", 0755);
|
|
||||||
dump_magisk("/overlay/sbin/magisk", 0755);
|
|
||||||
patch_socket_name("/overlay/sbin/magisk");
|
|
||||||
mkdir("/overlay/root", 0750);
|
|
||||||
link("/init", "/overlay/root/magiskinit");
|
|
||||||
|
|
||||||
struct cmdline cmd;
|
struct cmdline cmd;
|
||||||
parse_cmdline(&cmd);
|
parse_cmdline(&cmd);
|
||||||
@ -395,7 +389,7 @@ int main(int argc, char *argv[]) {
|
|||||||
|
|
||||||
if (cmd.skip_initramfs) {
|
if (cmd.skip_initramfs) {
|
||||||
// Clear rootfs
|
// Clear rootfs
|
||||||
excl_list = (char *[]) { "overlay", ".backup", NULL };
|
excl_list = (char *[]) { "overlay", ".backup", "init.bak", NULL };
|
||||||
frm_rf(root);
|
frm_rf(root);
|
||||||
} else if (access("/ramdisk.cpio.xz", R_OK) == 0) {
|
} else if (access("/ramdisk.cpio.xz", R_OK) == 0) {
|
||||||
// High compression mode
|
// High compression mode
|
||||||
@ -464,20 +458,28 @@ int main(int argc, char *argv[]) {
|
|||||||
|
|
||||||
// Only patch rootfs if not intended to run in recovery
|
// Only patch rootfs if not intended to run in recovery
|
||||||
if (access("/etc/recovery.fstab", F_OK) != 0) {
|
if (access("/etc/recovery.fstab", F_OK) != 0) {
|
||||||
int overlay = open("/overlay", O_RDONLY | O_CLOEXEC);
|
int fd;
|
||||||
mv_dir(overlay, root);
|
|
||||||
close(overlay);
|
// Handle ramdisk overlays
|
||||||
rmdir("/overlay");
|
fd = open("/overlay", O_RDONLY | O_CLOEXEC);
|
||||||
|
if (fd >= 0) {
|
||||||
|
mv_dir(fd, root);
|
||||||
|
close(fd);
|
||||||
|
rmdir("/overlay");
|
||||||
|
}
|
||||||
|
|
||||||
patch_ramdisk();
|
patch_ramdisk();
|
||||||
patch_sepolicy();
|
patch_sepolicy();
|
||||||
|
|
||||||
|
// Dump binaries
|
||||||
|
dump_magiskrc("/init.magisk.rc", 0750);
|
||||||
|
dump_magisk("/sbin/magisk", 0755);
|
||||||
|
patch_socket_name("/sbin/magisk");
|
||||||
|
rename("/init.bak", "/sbin/magiskinit");
|
||||||
}
|
}
|
||||||
|
|
||||||
// Clean up
|
// Clean up
|
||||||
close(root);
|
close(root);
|
||||||
close(STDIN_FILENO);
|
|
||||||
close(STDOUT_FILENO);
|
|
||||||
close(STDERR_FILENO);
|
|
||||||
if (!cmd.skip_initramfs)
|
if (!cmd.skip_initramfs)
|
||||||
umount("/system");
|
umount("/system");
|
||||||
umount("/vendor");
|
umount("/vendor");
|
||||||
|
Loading…
Reference in New Issue
Block a user