X-Git-Url: https://glassweightruler.freedombox.rocks/gitweb/Ventoy.git/blobdiff_plain/bfe194c190597ff9a77efc76a21c441bc19b6549..2991f097fb98cfaf1a0ebd5048fc0e8bc08aa20d:/Unix/ventoy_unix_src/DragonFly/oinit.c diff --git a/Unix/ventoy_unix_src/DragonFly/oinit.c b/Unix/ventoy_unix_src/DragonFly/oinit.c index c45ddd1..5323334 100644 --- a/Unix/ventoy_unix_src/DragonFly/oinit.c +++ b/Unix/ventoy_unix_src/DragonFly/oinit.c @@ -84,7 +84,7 @@ static int setctty(const char *name) return fd; } -static void ventoy_init(char **argv_orig) +static void ventoy_init(void) { pid_t pid, wpid; int status, error; @@ -155,29 +155,12 @@ static void ventoy_init(char **argv_orig) /* step 7: swich_root */ vdebug("[VTOY] step 7: switch root ...\n"); - error = chdir("/new_root"); - if (error) - goto chroot_failed; - - error = chroot_kernel("/new_root"); - if (error) - goto chroot_failed; - - error = chroot("/new_root"); - if (error) - goto chroot_failed; - - execv("/sbin/init", __DECONST(char **, argv_orig)); - - /* We failed to exec /sbin/init in the chroot, sleep forever */ -chroot_failed: - while(1) { - sleep(3); - }; } int main(int argc __unused, char **argv) { + pid_t pid, wpid; + int status, error; size_t varsize = sizeof(int); /* Dispose of random users. */ @@ -187,13 +170,40 @@ int main(int argc __unused, char **argv) /* Init is not allowed to die, it would make the kernel panic */ signal(SIGTERM, SIG_IGN); - setctty(_PATH_CONSOLE); + if ((pid = fork()) == 0) { - sysctlbyname("debug.bootverbose", &boot_verbose, &varsize, NULL, 0); + setctty(_PATH_CONSOLE); + sysctlbyname("debug.bootverbose", &boot_verbose, &varsize, NULL, 0); + + vdebug("======= Ventoy Init Start ========\n"); + + ventoy_init(); + exit(1); /* force single user mode */ + } + + do { + wpid = waitpid(-1, &status, WUNTRACED); + } while (wpid != pid); + + error = chdir("/new_root"); + if (error) + goto chroot_failed; + + error = chroot_kernel("/new_root"); + if (error) + goto chroot_failed; - vdebug("======= Ventoy Init Start ========\n"); + error = chroot("/new_root"); + if (error) + goto chroot_failed; - ventoy_init(argv); + execv("/sbin/init", __DECONST(char **, argv)); + + /* We failed to exec /sbin/init in the chroot, sleep forever */ +chroot_failed: + while(1) { + sleep(3); + }; return 1; }