am 10821da3: am 8a502000: Merge "init: expand_props for onrestart commands."

* commit '10821da3221ce4fe021c80956a5cac733c97ebb9':
  init: expand_props for onrestart commands.
diff --git a/init/init.cpp b/init/init.cpp
index 42eebe1..c66c487 100644
--- a/init/init.cpp
+++ b/init/init.cpp
@@ -585,6 +585,19 @@
     return result;
 }
 
+bool expand_command_arguments(int nargs, char** args, std::vector<std::string>* expanded_args) {
+    std::vector<std::string>& strs = *expanded_args;
+    strs.resize(nargs);
+    strs[0] = args[0];
+    for (int i = 1; i < nargs; ++i) {
+        if (expand_props(args[i], &strs[i]) == -1) {
+            ERROR("%s: cannot expand '%s'\n", args[0], args[i]);
+            return false;
+        }
+    }
+    return true;
+}
+
 void execute_one_command() {
     Timer t;
 
@@ -606,14 +619,9 @@
         return;
     }
     int result = 0;
-    std::vector<std::string> arg_strs(cur_command->nargs);
-    arg_strs[0] = cur_command->args[0];
-    for (int i = 1; i < cur_command->nargs; ++i) {
-        if (expand_props(cur_command->args[i], &arg_strs[i]) == -1) {
-            ERROR("%s: cannot expand '%s'\n", cur_command->args[0], cur_command->args[i]);
-            result = -EINVAL;
-            break;
-        }
+    std::vector<std::string> arg_strs;
+    if (!expand_command_arguments(cur_command->nargs, cur_command->args, &arg_strs)) {
+        result = -EINVAL;
     }
     if (result == 0) {
         std::vector<char*> args;
diff --git a/init/init.h b/init/init.h
index d812733..d2b2dfb 100644
--- a/init/init.h
+++ b/init/init.h
@@ -161,5 +161,6 @@
 void zap_stdio(void);
 
 void register_epoll_handler(int fd, void (*fn)());
+bool expand_command_arguments(int nargs, char** args, std::vector<std::string>* expanded_args);
 
 #endif	/* _INIT_INIT_H */
diff --git a/init/signal_handler.cpp b/init/signal_handler.cpp
index 39a466d..6893163 100644
--- a/init/signal_handler.cpp
+++ b/init/signal_handler.cpp
@@ -136,7 +136,14 @@
     struct listnode* node;
     list_for_each(node, &svc->onrestart.commands) {
         command* cmd = node_to_item(node, struct command, clist);
-        cmd->func(cmd->nargs, cmd->args);
+        std::vector<std::string> arg_strs;
+        if (expand_command_arguments(cmd->nargs, cmd->args, &arg_strs)) {
+            std::vector<char*> args;
+            for (auto& s : arg_strs) {
+                args.push_back(&s[0]);
+            }
+            cmd->func(args.size(), &args[0]);
+        }
     }
     svc->NotifyStateChange("restarting");
     return true;