diff options
author | Matthias Schiffer <mschiffer@universe-factory.net> | 2017-04-24 00:40:27 +0200 |
---|---|---|
committer | Matthias Schiffer <mschiffer@universe-factory.net> | 2017-05-29 23:06:36 +0200 |
commit | 63789e51ed913394c6bd4ac34e40ed0c8fcccccf (patch) | |
tree | b2e3b07c6714b612c99acaefc6a52b1400da0ed8 /system.c | |
parent | 5b1fb35427ba36d20c9f2a6b9403d1545b3abee6 (diff) | |
download | procd-63789e51ed913394c6bd4ac34e40ed0c8fcccccf.tar.gz |
init: add support for sysupgrades triggered from preinit
This will allow to add support for sysupgrades via upgraded from failsafe
mode.
Signed-off-by: Matthias Schiffer <mschiffer@universe-factory.net>
Diffstat (limited to 'system.c')
-rw-r--r-- | system.c | 35 |
1 files changed, 4 insertions, 31 deletions
@@ -28,6 +28,7 @@ #include <libubox/uloop.h> #include "procd.h" +#include "sysupgrade.h" #include "watchdog.h" static struct blob_buf b; @@ -346,34 +347,6 @@ static const struct blobmsg_policy sysupgrade_policy[__SYSUPGRADE_MAX] = { [SYSUPGRADE_COMMAND] = { .name = "command", .type = BLOBMSG_TYPE_STRING }, }; -static void -procd_exec_upgraded(const char *prefix, char *path, char *command) -{ - char *wdt_fd = watchdog_fd(); - char *argv[] = { "/sbin/upgraded", NULL, NULL, NULL}; - - if (chroot(prefix)) { - fprintf(stderr, "Failed to chroot for upgraded exec.\n"); - return; - } - - argv[1] = path; - argv[2] = command; - - DEBUG(2, "Exec to upgraded now\n"); - if (wdt_fd) { - watchdog_set_cloexec(false); - setenv("WDTFD", wdt_fd, 1); - } - execvp(argv[0], argv); - - /* Cleanup on failure */ - fprintf(stderr, "Failed to exec upgraded.\n"); - unsetenv("WDTFD"); - watchdog_set_cloexec(true); - chroot("."); -} - static int sysupgrade(struct ubus_context *ctx, struct ubus_object *obj, struct ubus_request_data *req, const char *method, struct blob_attr *msg) @@ -387,9 +360,9 @@ static int sysupgrade(struct ubus_context *ctx, struct ubus_object *obj, if (!tb[SYSUPGRADE_PATH] || !tb[SYSUPGRADE_PREFIX]) return UBUS_STATUS_INVALID_ARGUMENT; - procd_exec_upgraded(blobmsg_get_string(tb[SYSUPGRADE_PREFIX]), - blobmsg_get_string(tb[SYSUPGRADE_PATH]), - tb[SYSUPGRADE_COMMAND] ? blobmsg_get_string(tb[SYSUPGRADE_COMMAND]) : NULL); + sysupgrade_exec_upgraded(blobmsg_get_string(tb[SYSUPGRADE_PREFIX]), + blobmsg_get_string(tb[SYSUPGRADE_PATH]), + tb[SYSUPGRADE_COMMAND] ? blobmsg_get_string(tb[SYSUPGRADE_COMMAND]) : NULL); return 0; } |