Signed-off-by: André Valentin <[email protected]>
---
package/system/procd/patches/100-sysupgrade.patch | 73 +++++++++++++++++++++
1 file changed, 73 insertions(+)
create mode 100644 package/system/procd/patches/100-sysupgrade.patch
diff --git a/package/system/procd/patches/100-sysupgrade.patch
b/package/system/procd/patches/100-sysupgrade.patch
new file mode 100644
index 0000000..dbe9e5d
--- /dev/null
+++ b/package/system/procd/patches/100-sysupgrade.patch
@@ -0,0 +1,73 @@
+diff -uNrp procd-2014-03-18.orig/procd.h procd-2014-03-18/procd.h
+--- procd-2014-03-18.orig/procd.h 2014-03-21 10:15:26.000000000 +0100
++++ procd-2014-03-18/procd.h 2014-05-20 22:09:35.000000000 +0200
+@@ -36,6 +36,7 @@ void ubus_init_system(struct ubus_contex
+
+ void procd_state_next(void);
+ void procd_shutdown(int event);
++void procd_sysupgrade_as_init(int event);
+ void procd_early(void);
+ void procd_preinit(void);
+ void procd_coldplug(void);
+diff -uNrp procd-2014-03-18.orig/system.c procd-2014-03-18/system.c
+--- procd-2014-03-18.orig/system.c 2014-03-21 10:15:26.000000000 +0100
++++ procd-2014-03-18/system.c 2014-05-20 22:12:17.000000000 +0200
+@@ -195,6 +195,50 @@ static int system_upgrade(struct ubus_co
+ }
+
+ enum {
++ UPG_COMMAND,
++ UPG_ARGUMENTS,
++ __UPG_MAX
++};
++
++static const struct blobmsg_policy upgrade_policy[__UPG_MAX] = {
++ [UPG_COMMAND] = { .name = "command", .type = BLOBMSG_TYPE_STRING },
++ [UPG_ARGUMENTS] = { .name = "arguments", .type = BLOBMSG_TYPE_STRING },
++};
++
++static int system_upgrade_as_init(struct ubus_context *ctx, struct
ubus_object *obj,
++ struct ubus_request_data *req, const char *method,
++ struct blob_attr *msg)
++{
++ struct blob_attr *tb[__UPG_MAX];
++ const char *cmd;
++ const char *args;
++
++ if (!msg)
++ return UBUS_STATUS_INVALID_ARGUMENT;
++
++ blobmsg_parse(upgrade_policy, __UPG_MAX, tb, blob_data(msg),
blob_len(msg));
++ if (!tb[UPG_COMMAND] || !tb[UPG_ARGUMENTS])
++ return UBUS_STATUS_INVALID_ARGUMENT;
++
++ cmd = strdup(blobmsg_get_string(tb[UPG_COMMAND]));
++ args = strdup(blobmsg_get_string(tb[UPG_ARGUMENTS]));
++
++ if (!cmd || !strlen(cmd)) {
++ LOG("sysupgrade command should not be empty!");
++ return 0;
++ }
++
++ upgrade_running = 1;
++ LOG("Running sysupgrade as init, cmd: '%s %s'\n", cmd, args);
++ procd_inittab_run("shutdown");
++ if (args && strlen(args)) {
++ execl(cmd, cmd, args , (char *) 0);
++ }
++ execl(cmd, cmd, (char *) 0);
++ return 0;
++}
++
++enum {
+ WDT_FREQUENCY,
+ WDT_TIMEOUT,
+ WDT_STOP,
+@@ -296,6 +337,7 @@ static const struct ubus_method system_m
+ UBUS_METHOD_NOARG("board", system_board),
+ UBUS_METHOD_NOARG("info", system_info),
+ UBUS_METHOD_NOARG("upgrade", system_upgrade),
++ UBUS_METHOD("upgrade_as_init", system_upgrade_as_init, upgrade_policy),
+ UBUS_METHOD("watchdog", watchdog_set, watchdog_policy),
+ UBUS_METHOD("signal", proc_signal, signal_policy),
+ };
--
1.7.10.4
_______________________________________________
openwrt-devel mailing list
[email protected]
https://lists.openwrt.org/cgi-bin/mailman/listinfo/openwrt-devel