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

Reply via email to