chiark / gitweb /
mount: implement mounting properly
[elogind.git] / execute.c
index e4a70cd09a7a7d085eaf4ca3d4bd4f558d2e80e7..3d2e511333b9d6003114c94afe2e5daa8cc75736 100644 (file)
--- a/execute.c
+++ b/execute.c
@@ -457,13 +457,18 @@ int exec_spawn(ExecCommand *command,
 
         pid_t pid;
         int r;
+        char *line;
 
         assert(command);
         assert(context);
         assert(ret);
         assert(fds || n_fds <= 0);
 
-        log_debug("About to execute %s", command->path);
+        if (!(line = exec_command_line(command)))
+                return -ENOMEM;
+
+        log_debug("About to execute: %s", line);
+        free(line);
 
         if (cgroup_bondings)
                 if ((r = cgroup_bonding_realize_list(cgroup_bondings)))
@@ -771,14 +776,29 @@ void exec_context_done(ExecContext *c) {
         }
 }
 
+void exec_command_done(ExecCommand *c) {
+        assert(c);
+
+        free(c->path);
+        c->path = NULL;
+
+        strv_free(c->argv);
+        c->argv = NULL;
+}
+
+void exec_command_done_array(ExecCommand *c, unsigned n) {
+        unsigned i;
+
+        for (i = 0; i < n; i++)
+                exec_command_done(c+i);
+}
+
 void exec_command_free_list(ExecCommand *c) {
         ExecCommand *i;
 
         while ((i = c)) {
                 LIST_REMOVE(ExecCommand, command, c, i);
-
-                free(i->path);
-                strv_free(i->argv);
+                exec_command_done(i);
                 free(i);
         }
 }
@@ -1056,6 +1076,34 @@ void exec_command_append_list(ExecCommand **l, ExecCommand *e) {
               *l = e;
 }
 
+int exec_command_set(ExecCommand *c, const char *path, ...) {
+        va_list ap;
+        char **l, *p;
+
+        assert(c);
+        assert(path);
+
+        va_start(ap, path);
+        l = strv_new_ap(path, ap);
+        va_end(ap);
+
+        if (!l)
+                return -ENOMEM;
+
+        if (!(p = strdup(path))) {
+                strv_free(l);
+                return -ENOMEM;
+        }
+
+        free(c->path);
+        c->path = p;
+
+        strv_free(c->argv);
+        c->argv = l;
+
+        return 0;
+}
+
 static const char* const exec_output_table[_EXEC_OUTPUT_MAX] = {
         [EXEC_OUTPUT_CONSOLE] = "console",
         [EXEC_OUTPUT_NULL] = "null",