X-Git-Url: http://git.openwrt.org/?p=project%2Fprocd.git;a=blobdiff_plain;f=upgraded%2Fupgraded.c;h=e70f92dd42cb1f84792d2fc5adf9728e21f640f1;hp=d7433e76071524a5e69f0e153730b2801e5406b8;hb=e7bb2c8d631862e1535cf6eead18387f02a69ad2;hpb=91da63d3d3fd680c805dd1a1b78df5b8731a8173 diff --git a/upgraded/upgraded.c b/upgraded/upgraded.c index d7433e7..e70f92d 100644 --- a/upgraded/upgraded.c +++ b/upgraded/upgraded.c @@ -12,8 +12,11 @@ * GNU General Public License for more details. */ +#define _GNU_SOURCE + #include +#include #include #include #include @@ -24,6 +27,10 @@ #include "../watchdog.h" +#ifndef O_PATH +#define O_PATH 010000000 +#endif + static struct uloop_process upgrade_proc; unsigned int debug = 2; @@ -34,11 +41,12 @@ static void upgrade_proc_cb(struct uloop_process *proc, int ret) uloop_end(); } -static void sysupgarde(char *folder) +static void sysupgrade(char *path, char *command) { - char *args[] = { "/sbin/sysupgrade", "nand", NULL, NULL }; + char *args[] = { "/lib/upgrade/stage2", NULL, NULL, NULL }; - args[2] = folder; + args[1] = path; + args[2] = command; upgrade_proc.cb = upgrade_proc_cb; upgrade_proc.pid = fork(); if (!upgrade_proc.pid) { @@ -47,7 +55,7 @@ static void sysupgarde(char *folder) exit(-1); } if (upgrade_proc.pid <= 0) { - fprintf(stderr, "Failed to start sysupgarde\n"); + fprintf(stderr, "Failed to start sysupgrade\n"); uloop_end(); } } @@ -60,18 +68,29 @@ int main(int argc, char **argv) fprintf(stderr, "this tool needs to run as pid 1\n"); return -1; } - if (chdir("/tmp") == -1) { - fprintf(stderr, "failed to chdir to /tmp: %s\n", strerror(errno)); + + int fd = open("/", O_DIRECTORY|O_PATH); + if (fd < 0) { + fprintf(stderr, "unable to open prefix directory: %s\n", strerror(errno)); + return -1; + } + + chroot("."); + + if (fchdir(fd) == -1) { + fprintf(stderr, "failed to chdir to prefix directory: %s\n", strerror(errno)); return -1; } - if (argc != 2) { - fprintf(stderr, "sysupgrade stage 2 failed, no folder specified\n"); + close(fd); + + if (argc != 3) { + fprintf(stderr, "sysupgrade stage 2 failed, invalid command line\n"); return -1; } uloop_init(); watchdog_init(0); - sysupgarde(argv[1]); + sysupgrade(argv[1], argv[2]); uloop_run(); reboot(RB_AUTOBOOT);