summaryrefslogtreecommitdiff
path: root/system.c
diff options
context:
space:
mode:
authorMatthias Schiffer <mschiffer@universe-factory.net>2017-04-24 00:40:27 +0200
committerMatthias Schiffer <mschiffer@universe-factory.net>2017-05-29 23:06:36 +0200
commit63789e51ed913394c6bd4ac34e40ed0c8fcccccf (patch)
treeb2e3b07c6714b612c99acaefc6a52b1400da0ed8 /system.c
parent5b1fb35427ba36d20c9f2a6b9403d1545b3abee6 (diff)
downloadprocd-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.c35
1 files changed, 4 insertions, 31 deletions
diff --git a/system.c b/system.c
index dc509ff..8b8cdbc 100644
--- a/system.c
+++ b/system.c
@@ -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;
}