X-Git-Url: http://git.openwrt.org/?p=project%2Fprocd.git;a=blobdiff_plain;f=system.c;h=4bbceee7bdf0cfb2a11d8e96817373cdb0864e98;hp=193c9b05afa6ef5a160a1b11633eb4b543b13fe4;hb=79bbe6daf70feb27ec0e2060b86852015cd04465;hpb=056d8ddda8d5236ac94d6897b674291679c05e91 diff --git a/system.c b/system.c index 193c9b0..4bbceee 100644 --- a/system.c +++ b/system.c @@ -28,14 +28,13 @@ #include #include "procd.h" +#include "sysupgrade.h" #include "watchdog.h" static struct blob_buf b; static int notify; static struct ubus_context *_ctx; -int upgrade_running = 0; - static int system_board(struct ubus_context *ctx, struct ubus_object *obj, struct ubus_request_data *req, const char *method, struct blob_attr *msg) @@ -81,7 +80,7 @@ static int system_board(struct ubus_context *ctx, struct ubus_object *obj, fclose(f); } - if ((f = fopen("/tmp/sysinfo/model", "r")) != NULL || + if ((f = fopen("/tmp/sysinfo/board_name", "r")) != NULL || (f = fopen("/proc/device-tree/model", "r")) != NULL) { if (fgets(line, sizeof(line), f)) @@ -235,14 +234,6 @@ static int system_info(struct ubus_context *ctx, struct ubus_object *obj, return UBUS_STATUS_OK; } -static int system_upgrade(struct ubus_context *ctx, struct ubus_object *obj, - struct ubus_request_data *req, const char *method, - struct blob_attr *msg) -{ - upgrade_running = 1; - return 0; -} - static int system_reboot(struct ubus_context *ctx, struct ubus_object *obj, struct ubus_request_data *req, const char *method, struct blob_attr *msg) @@ -346,41 +337,16 @@ static int proc_signal(struct ubus_context *ctx, struct ubus_object *obj, enum { SYSUPGRADE_PATH, SYSUPGRADE_PREFIX, + SYSUPGRADE_COMMAND, __SYSUPGRADE_MAX }; static const struct blobmsg_policy sysupgrade_policy[__SYSUPGRADE_MAX] = { [SYSUPGRADE_PATH] = { .name = "path", .type = BLOBMSG_TYPE_STRING }, [SYSUPGRADE_PREFIX] = { .name = "prefix", .type = BLOBMSG_TYPE_STRING }, + [SYSUPGRADE_COMMAND] = { .name = "command", .type = BLOBMSG_TYPE_STRING }, }; -static void -procd_exec_upgraded(const char *prefix, char *path) -{ - char *wdt_fd = watchdog_fd(); - char *argv[] = { "/sbin/upgraded", NULL, NULL}; - - if (chroot(prefix)) { - fprintf(stderr, "Failed to chroot for upgraded exec.\n"); - return; - } - - argv[1] = path; - - 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) @@ -394,8 +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])); + 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; } @@ -409,11 +376,9 @@ procd_subscribe_cb(struct ubus_context *ctx, struct ubus_object *obj) static const struct ubus_method system_methods[] = { UBUS_METHOD_NOARG("board", system_board), UBUS_METHOD_NOARG("info", system_info), - UBUS_METHOD_NOARG("upgrade", system_upgrade), UBUS_METHOD_NOARG("reboot", system_reboot), UBUS_METHOD("watchdog", watchdog_set, watchdog_policy), UBUS_METHOD("signal", proc_signal, signal_policy), - UBUS_METHOD("nandupgrade", sysupgrade, sysupgrade_policy), UBUS_METHOD("sysupgrade", sysupgrade, sysupgrade_policy), };