X-Git-Url: http://git.openwrt.org/?p=project%2Fprocd.git;a=blobdiff_plain;f=upgraded%2Fupgraded.c;h=db98701d8ab64da4c78f105a6182ae0db9edb062;hp=6bc5ad8f94f3060c7c56535418b5df6f64df2f26;hb=4a127c3c60af888b0aa5185a90799e5d12aa15c4;hpb=d749b2a3507517ff0fe39f7dac69f44ce20c56a2 diff --git a/upgraded/upgraded.c b/upgraded/upgraded.c index 6bc5ad8..db98701 100644 --- a/upgraded/upgraded.c +++ b/upgraded/upgraded.c @@ -43,23 +43,24 @@ static void upgrade_proc_cb(struct uloop_process *proc, int ret) static void sysupgrade(char *path, char *command) { - char *args[] = { "/lib/upgrade/stage2", NULL, NULL, NULL }; + char *args[] = { "/lib/upgrade/stage2", path, command, NULL }; - args[1] = path; - args[2] = command; upgrade_proc.cb = upgrade_proc_cb; upgrade_proc.pid = fork(); - if (!upgrade_proc.pid) { - execvp(args[0], args); + if (upgrade_proc.pid < 0) { fprintf(stderr, "Failed to fork sysupgrade\n"); - exit(-1); + return; } - if (upgrade_proc.pid <= 0) { - fprintf(stderr, "Failed to start sysupgrade\n"); - uloop_end(); + + if (!upgrade_proc.pid) { + /* Child */ + execvp(args[0], args); + fprintf(stderr, "Failed to exec sysupgrade\n"); + _exit(EXIT_FAILURE); } uloop_process_add(&upgrade_proc); + uloop_run(); } int main(int argc, char **argv) @@ -68,32 +69,34 @@ int main(int argc, char **argv) if (p != 1) { fprintf(stderr, "this tool needs to run as pid 1\n"); - return -1; + return 1; } int fd = open("/", O_DIRECTORY|O_PATH); if (fd < 0) { - fprintf(stderr, "unable to open prefix directory: %s\n", strerror(errno)); - return -1; + fprintf(stderr, "unable to open prefix directory: %m\n"); + return 1; } - chroot("."); + if (chroot(".") < 0) { + fprintf(stderr, "failed to chroot: %m\n"); + return 1; + } if (fchdir(fd) == -1) { - fprintf(stderr, "failed to chdir to prefix directory: %s\n", strerror(errno)); - return -1; + fprintf(stderr, "failed to chdir to prefix directory: %m\n"); + return 1; } close(fd); if (argc != 3) { fprintf(stderr, "sysupgrade stage 2 failed, invalid command line\n"); - return -1; + return 1; } uloop_init(); watchdog_init(0); sysupgrade(argv[1], argv[2]); - uloop_run(); reboot(RB_AUTOBOOT);