summaryrefslogtreecommitdiffstats
path: root/system.c
diff options
context:
space:
mode:
authorJohn Crispin <blogic@openwrt.org>2014-06-10 17:50:15 +0200
committerJohn Crispin <blogic@openwrt.org>2014-06-11 00:06:12 +0200
commit13259259bc53657617844660f2664f4b4fb4ac02 (patch)
treeec7e121e780ddfd1923e48d7d17243241b213948 /system.c
parent53c1ea6b9ade10eff3cec07519db862b365a4233 (diff)
downloadunitd-13259259bc53657617844660f2664f4b4fb4ac02.tar
unitd-13259259bc53657617844660f2664f4b4fb4ac02.zip
add upgraded support for nand flashing
Signed-off-by: John Crispin <blogic@openwrt.org>
Diffstat (limited to 'system.c')
-rw-r--r--system.c45
1 files changed, 45 insertions, 0 deletions
diff --git a/system.c b/system.c
index d5bf000..2110035 100644
--- a/system.c
+++ b/system.c
@@ -286,18 +286,63 @@ static int proc_signal(struct ubus_context *ctx, struct ubus_object *obj,
return 0;
}
+enum {
+ NAND_FOLDER,
+ __NAND_MAX
+};
+
+static const struct blobmsg_policy nand_policy[__NAND_MAX] = {
+ [NAND_FOLDER] = { .name = "folder", .type = BLOBMSG_TYPE_STRING },
+};
+
+static void
+procd_spawn_upgraded(char *folder)
+{
+ char *wdt_fd = watchdog_fd();
+ char *argv[] = { "/tmp/upgraded", NULL, NULL};
+
+ argv[1] = folder;
+
+ DEBUG(2, "Exec to upgraded now\n");
+ if (wdt_fd) {
+ watchdog_no_cloexec();
+ setenv("WDTFD", wdt_fd, 1);
+ }
+ execvp(argv[0], argv);
+}
+
+static int nand_set(struct ubus_context *ctx, struct ubus_object *obj,
+ struct ubus_request_data *req, const char *method,
+ struct blob_attr *msg)
+{
+ struct blob_attr *tb[__NAND_MAX];
+
+ if (!msg)
+ return UBUS_STATUS_INVALID_ARGUMENT;
+
+ blobmsg_parse(nand_policy, __NAND_MAX, tb, blob_data(msg), blob_len(msg));
+ if (!tb[NAND_FOLDER])
+ return UBUS_STATUS_INVALID_ARGUMENT;
+
+ procd_spawn_upgraded(blobmsg_get_string(tb[NAND_FOLDER]));
+ fprintf(stderr, "Yikees, something went wrong. no /sbin/upgraded ?\n");
+ return 0;
+}
+
static void
procd_subscribe_cb(struct ubus_context *ctx, struct ubus_object *obj)
{
notify = obj->has_subscribers;
}
+
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("watchdog", watchdog_set, watchdog_policy),
UBUS_METHOD("signal", proc_signal, signal_policy),
+ UBUS_METHOD("nandupgrade", nand_set, nand_policy),
};
static struct ubus_object_type system_object_type =