chiark / gitweb /
use strneq instead of strncmp
[elogind.git] / src / core / manager.c
index c8d7d70dc405e00a8dea0bac251166e6d967a632..bd49892cd46a9b08e61b91be3f7d219fb61c5d7e 100644 (file)
@@ -71,6 +71,7 @@
 #include "path-util.h"
 #include "audit-fd.h"
 #include "efivars.h"
+#include "env-util.h"
 
 /* As soon as 16 units are in our GC queue, make sure to run a gc sweep */
 #define GC_QUEUE_ENTRIES_MAX 16
@@ -289,6 +290,9 @@ static void manager_strip_environment(Manager *m) {
          * the initrd interface:
          * http://www.freedesktop.org/wiki/Software/systemd/InitrdInterface */
         strv_remove_prefix(m->environment, "RD_");
+
+        /* Drop invalid entries */
+        strv_env_clean(m->environment);
 }
 
 int manager_new(SystemdRunningAs running_as, Manager **_m) {
@@ -1852,6 +1856,7 @@ int manager_serialize(Manager *m, FILE *f, FDSet *fds, bool serialize_jobs) {
         Iterator i;
         Unit *u;
         const char *t;
+        char **e;
         int r;
 
         assert(m);
@@ -1875,6 +1880,14 @@ int manager_serialize(Manager *m, FILE *f, FDSet *fds, bool serialize_jobs) {
                 dual_timestamp_serialize(f, "finish-timestamp", &m->finish_timestamp);
         }
 
+        STRV_FOREACH(e, m->environment) {
+                _cleanup_free_ char *ce;
+
+                ce = cescape(*e);
+                if (ce)
+                        fprintf(f, "env=%s\n", *e);
+        }
+
         fputc('\n', f);
 
         HASHMAP_FOREACH_KEY(u, t, m->units, i) {
@@ -1975,7 +1988,25 @@ int manager_deserialize(Manager *m, FILE *f, FDSet *fds) {
                         dual_timestamp_deserialize(l+20, &m->userspace_timestamp);
                 else if (startswith(l, "finish-timestamp="))
                         dual_timestamp_deserialize(l+17, &m->finish_timestamp);
-                else
+                else if (startswith(l, "env=")) {
+                        _cleanup_free_ char *uce = NULL;
+                        char **e;
+
+                        uce = cunescape(l+4);
+                        if (!uce) {
+                                r = -ENOMEM;
+                                goto finish;
+                        }
+
+                        e = strv_env_set(m->environment, uce);
+                        if (!e) {
+                                r = -ENOMEM;
+                                goto finish;
+                        }
+
+                        strv_free(m->environment);
+                        m->environment = e;
+                } else
                         log_debug("Unknown serialization item '%s'", l);
         }