summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorLennart Poettering <lennart@poettering.net>2010-08-10 21:05:19 +0200
committerLennart Poettering <lennart@poettering.net>2010-08-11 01:44:38 +0200
commitb95cf3629e8d78a0d28e71b0f5559fa9a8c038b5 (patch)
tree4d72938e060181b52403d878e1e7ac94b191ced2 /src
parent3454f9e519260c1b9908dda23870a6c6cdd79f22 (diff)
util: when replacing env vars replace unset envvars by nothing
This makes it easier to support /etc/sysconfig/xxxx with command line env vars in style of $OPTIONS which might or might not be set.
Diffstat (limited to 'src')
-rw-r--r--src/util.c53
1 files changed, 28 insertions, 25 deletions
diff --git a/src/util.c b/src/util.c
index 7281b703ab..a2def28730 100644
--- a/src/util.c
+++ b/src/util.c
@@ -3085,18 +3085,18 @@ char *replace_env(const char *format, char **env) {
case VARIABLE:
if (*e == '}') {
- char *t;
+ const char *t;
- if ((t = strv_env_get_with_length(env, word+2, e-word-2))) {
- if (!(k = strappend(r, t)))
- goto fail;
+ if (!(t = strv_env_get_with_length(env, word+2, e-word-2)))
+ t = "";
- free(r);
- r = k;
+ if (!(k = strappend(r, t)))
+ goto fail;
- word = e+1;
- }
+ free(r);
+ r = k;
+ word = e+1;
state = WORD;
}
break;
@@ -3126,36 +3126,39 @@ char **replace_env_argv(char **argv, char **env) {
STRV_FOREACH(i, argv) {
/* If $FOO appears as single word, replace it by the split up variable */
- if ((*i)[0] == '$') {
- char *e = strv_env_get(env, *i+1);
+ if ((*i)[0] == '$' && (*i)[1] != '{') {
+ char *e;
+ char **w, **m;
+ unsigned q;
- if (e) {
- char **w, **m;
- unsigned q;
+ if ((e = strv_env_get(env, *i+1))) {
if (!(m = strv_split_quoted(e))) {
r[k] = NULL;
strv_free(r);
return NULL;
}
+ } else
+ m = NULL;
- q = strv_length(m);
- l = l + q - 1;
+ q = strv_length(m);
+ l = l + q - 1;
- if (!(w = realloc(r, sizeof(char*) * (l+1)))) {
- r[k] = NULL;
- strv_free(r);
- strv_free(m);
- return NULL;
- }
+ if (!(w = realloc(r, sizeof(char*) * (l+1)))) {
+ r[k] = NULL;
+ strv_free(r);
+ strv_free(m);
+ return NULL;
+ }
- r = w;
+ r = w;
+ if (m) {
memcpy(r + k, m, q * sizeof(char*));
free(m);
-
- k += q;
- continue;
}
+
+ k += q;
+ continue;
}
/* If ${FOO} appears as part of a word, replace it by the variable as-is */