chiark / gitweb /
execute: add EnvironmentFile= option
authorLennart Poettering <lennart@poettering.net>
Fri, 18 Jun 2010 04:06:24 +0000 (06:06 +0200)
committerLennart Poettering <lennart@poettering.net>
Fri, 18 Jun 2010 04:06:24 +0000 (06:06 +0200)
src/load-fragment.c
src/strv.c
src/strv.h

index 1f082d57b3b78213aaad9872a22538c648f029e7..7a51bf81c811b46000b111515b49de5703cc4f2e 100644 (file)
@@ -40,6 +40,9 @@
 #include "missing.h"
 #include "unit-name.h"
 
+#define COMMENTS "#;\n"
+#define LINE_MAX 4096
+
 #define DEFINE_CONFIG_PARSE_ENUM(function,name,type,msg)                \
         static int function(                                            \
                         const char *filename,                           \
@@ -1143,6 +1146,64 @@ static int config_parse_path_unit(
         return 0;
 }
 
+static int config_parse_env_file(
+                const char *filename,
+                unsigned line,
+                const char *section,
+                const char *lvalue,
+                const char *rvalue,
+                void *data,
+                void *userdata) {
+
+        FILE *f;
+        int r;
+        char ***env = data;
+
+        assert(filename);
+        assert(lvalue);
+        assert(rvalue);
+        assert(data);
+
+        if (!(f = fopen(rvalue, "re"))) {
+                log_error("[%s:%u] Failed to open environment file '%s': %m", filename, line, rvalue);
+                return -errno;
+        }
+
+        while (!feof(f)) {
+                char l[LINE_MAX], *p;
+                char **t;
+
+                if (!fgets(l, sizeof(l), f)) {
+                        if (feof(f))
+                                break;
+
+                        r = -errno;
+                        log_error("[%s:%u] Failed to read environment file '%s': %m", filename, line, rvalue);
+                        goto finish;
+                }
+
+                p = strstrip(l);
+
+                if (!*p)
+                        continue;
+
+                if (strchr(COMMENTS, *p))
+                        continue;
+
+                t = strv_env_set(*env, p);
+                strv_free(*env);
+                *env = t;
+        }
+
+        r = 0;
+
+finish:
+        if (f)
+                fclose(f);
+
+        return r;
+}
+
 #define FOLLOW_MAX 8
 
 static int open_follow(char **filename, FILE **_f, Set *names, char **_final) {
@@ -1272,6 +1333,7 @@ static void dump_items(FILE *f, const ConfigItem *items) {
                 { config_parse_cpu_sched_prio,   "CPUSCHEDPRIO" },
                 { config_parse_cpu_affinity,     "CPUAFFINITY" },
                 { config_parse_mode,             "MODE" },
+                { config_parse_env_file,         "FILE" },
                 { config_parse_output,           "OUTPUT" },
                 { config_parse_input,            "INPUT" },
                 { config_parse_facility,         "FACILITY" },
@@ -1358,6 +1420,7 @@ static int load_from_path(Unit *u, const char *path) {
                 { "CPUAffinity",            config_parse_cpu_affinity,    &(context),                                      section   }, \
                 { "UMask",                  config_parse_mode,            &(context).umask,                                section   }, \
                 { "Environment",            config_parse_strv,            &(context).environment,                          section   }, \
+                { "EnvironmentFile",        config_parse_env_file,        &(context).environment,                          section   }, \
                 { "StandardInput",          config_parse_input,           &(context).std_input,                            section   }, \
                 { "StandardOutput",         config_parse_output,          &(context).std_output,                           section   }, \
                 { "StandardError",          config_parse_output,          &(context).std_error,                            section   }, \
index 85599fe92c3e0b1e368402fca2d7f1cffc400f5a..01464e1e330816bfd0f4fae3af4ae3085b5ac0b6 100644 (file)
@@ -511,3 +511,31 @@ char **strv_env_delete(char **x, unsigned n_lists, ...) {
 
         return r;
 }
+
+char **strv_env_set(char **x, const char *p) {
+
+        char **k, **r;
+
+        if (!(r = new(char*, strv_length(x)+2)))
+                return NULL;
+
+        k = r;
+        if (env_append(r, &k, x) < 0)
+                goto fail;
+
+        if (!(*(k++) = strdup(p)))
+                goto fail;
+
+        *k = NULL;
+
+        return r;
+
+fail:
+        for (k--; k >= r; k--)
+                free(*k);
+
+        free(r);
+
+        return NULL;
+
+}
index af13983993565c5eb1b100d542578c968556a425..0d50b02f012063059c742dbb219f92df5ff84adf 100644 (file)
@@ -58,6 +58,8 @@ char *strv_join(char **l, const char *separator) _malloc_;
 char **strv_env_merge(unsigned n_lists, ...);
 char **strv_env_delete(char **x, unsigned n_lists, ...);
 
+char **strv_env_set(char **x, const char *p);
+
 #define STRV_FOREACH(s, l)                      \
         for ((s) = (l); (s) && *(s); (s)++)