X-Git-Url: https://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?p=elogind.git;a=blobdiff_plain;f=src%2Fcore%2Fload-fragment.c;h=6e333aaf1599cd3a91f1d202d39b412da25716be;hp=8436d4f95ef1e9224ae5b7d22d98b6f2a4e3b8fc;hb=641906e9366891e0ad3e6e38b7396a427678c4cf;hpb=843fc7f7f26a6507fe896a79ed1b474c35c4300f diff --git a/src/core/load-fragment.c b/src/core/load-fragment.c index 8436d4f95..6e333aaf1 100644 --- a/src/core/load-fragment.c +++ b/src/core/load-fragment.c @@ -48,6 +48,7 @@ #include "utf8.h" #include "path-util.h" #include "syscall-list.h" +#include "env-util.h" #ifndef HAVE_SYSV_COMPAT int config_parse_warn_compat( @@ -458,7 +459,7 @@ int config_parse_exec( k = 0; FOREACH_WORD_QUOTED(w, l, rvalue, state) { - if (strncmp(w, ";", MAX(l, 1U)) == 0) + if (strneq(w, ";", MAX(l, 1U))) break; k++; @@ -470,9 +471,9 @@ int config_parse_exec( k = 0; FOREACH_WORD_QUOTED(w, l, rvalue, state) { - if (strncmp(w, ";", MAX(l, 1U)) == 0) + if (strneq(w, ";", MAX(l, 1U))) break; - else if (strncmp(w, "\\;", MAX(l, 1U)) == 0) + else if (strneq(w, "\\;", MAX(l, 1U))) w ++; if (honour_argv0 && w == rvalue) { @@ -1486,9 +1487,10 @@ int config_parse_unit_env_file( void *data, void *userdata) { - char ***env = data, **k; + char ***env = data; Unit *u = userdata; - char *s; + _cleanup_free_ char *s = NULL; + int r; assert(filename); assert(lvalue); @@ -1497,7 +1499,6 @@ int config_parse_unit_env_file( if (isempty(rvalue)) { /* Empty assignment frees the list */ - strv_free(*env); *env = NULL; return 0; @@ -1509,17 +1510,67 @@ int config_parse_unit_env_file( if (!path_is_absolute(s[0] == '-' ? s + 1 : s)) { log_error("[%s:%u] Path '%s' is not absolute, ignoring.", filename, line, s); - free(s); return 0; } - k = strv_append(*env, s); - free(s); + r = strv_extend(env, s); + if (r < 0) + return log_oom(); + + return 0; +} + +int config_parse_environ( + const char *filename, + unsigned line, + const char *section, + const char *lvalue, + int ltype, + const char *rvalue, + void *data, + void *userdata) { + + Unit *u = userdata; + char*** env = data, *w, *state; + size_t l; + _cleanup_free_ char *k = NULL; + + assert(filename); + assert(lvalue); + assert(rvalue); + assert(u); + + if (isempty(rvalue)) { + /* Empty assignment resets the list */ + strv_free(*env); + *env = NULL; + return 0; + } + + k = unit_full_printf(u, rvalue); if (!k) return log_oom(); - strv_free(*env); - *env = k; + FOREACH_WORD_QUOTED(w, l, k, state) { + _cleanup_free_ char *n; + char **x; + + n = cunescape_length(w, l); + if (!n) + return log_oom(); + + if (!env_assignment_is_valid(n)) { + log_error("[%s:%u] Invalid environment assignment, ignoring: %s", filename, line, rvalue); + continue; + } + + x = strv_env_set(*env, n); + if (!x) + return log_oom(); + + strv_free(*env); + *env = x; + } return 0; } @@ -2619,7 +2670,7 @@ void unit_dump_config_items(FILE *f) { prefix_len = dot-i; if (dot) - if (!prev || strncmp(prev, i, prefix_len+1) != 0) { + if (!prev || !strneq(prev, i, prefix_len+1)) { if (prev) fputc('\n', f);