mirror of
https://github.com/systemd/systemd-stable.git
synced 2025-01-12 09:17:44 +03:00
basic/env-util: add a mode where we pull in the variable value from environment
This commit is contained in:
parent
43cadb64d4
commit
a14af47e64
@ -421,6 +421,32 @@ int strv_env_replace_strdup(char ***l, const char *assignment) {
|
||||
return strv_env_replace_consume(l, p);
|
||||
}
|
||||
|
||||
int strv_env_replace_strdup_passthrough(char ***l, const char *assignment) {
|
||||
/* Like strv_env_replace_strdup(), but pulls the variable from the environment of
|
||||
* the calling program, if a variable name without value is specified.
|
||||
*/
|
||||
char *p;
|
||||
|
||||
if (strchr(assignment, '=')) {
|
||||
if (!env_assignment_is_valid(assignment))
|
||||
return -EINVAL;
|
||||
|
||||
p = strdup(assignment);
|
||||
} else {
|
||||
if (!env_name_is_valid(assignment))
|
||||
return -EINVAL;
|
||||
|
||||
/* If we can't find the variable in our environment, we will use
|
||||
* the empty string. This way "passthrough" is equivalent to passing
|
||||
* --setenv=FOO=$FOO in the shell. */
|
||||
p = strjoin(assignment, "=", secure_getenv(assignment));
|
||||
}
|
||||
if (!p)
|
||||
return -ENOMEM;
|
||||
|
||||
return strv_env_replace_consume(l, p);
|
||||
}
|
||||
|
||||
int strv_env_assign(char ***l, const char *key, const char *value) {
|
||||
if (!env_name_is_valid(key))
|
||||
return -EINVAL;
|
||||
|
@ -47,6 +47,7 @@ char **strv_env_unset(char **l, const char *p); /* In place ... */
|
||||
char **strv_env_unset_many(char **l, ...) _sentinel_;
|
||||
int strv_env_replace_consume(char ***l, char *p); /* In place ... */
|
||||
int strv_env_replace_strdup(char ***l, const char *assignment);
|
||||
int strv_env_replace_strdup_passthrough(char ***l, const char *assignment);
|
||||
int strv_env_assign(char ***l, const char *key, const char *value);
|
||||
|
||||
char *strv_env_get_n(char **l, const char *name, size_t k, unsigned flags) _pure_;
|
||||
|
@ -105,6 +105,7 @@ static void test_strv_env_replace_strdup(void) {
|
||||
assert_se(strv_env_replace_strdup(&a, "a=a") == 1);
|
||||
assert_se(strv_env_replace_strdup(&a, "b=b") == 1);
|
||||
assert_se(strv_env_replace_strdup(&a, "a=A") == 0);
|
||||
assert_se(strv_env_replace_strdup(&a, "c") == -EINVAL);
|
||||
|
||||
assert_se(strv_length(a) == 2);
|
||||
strv_sort(a);
|
||||
@ -112,6 +113,27 @@ static void test_strv_env_replace_strdup(void) {
|
||||
assert_se(streq(a[1], "b=b"));
|
||||
}
|
||||
|
||||
static void test_strv_env_replace_strdup_passthrough(void) {
|
||||
log_info("/* %s */", __func__);
|
||||
|
||||
_cleanup_strv_free_ char **a = NULL;
|
||||
|
||||
assert_se(putenv((char*) "a=a") == 0);
|
||||
assert_se(putenv((char*) "b=") == 0);
|
||||
assert_se(unsetenv("c") == 0);
|
||||
|
||||
assert_se(strv_env_replace_strdup_passthrough(&a, "a") == 1);
|
||||
assert_se(strv_env_replace_strdup_passthrough(&a, "b") == 1);
|
||||
assert_se(strv_env_replace_strdup_passthrough(&a, "c") == 1);
|
||||
assert_se(strv_env_replace_strdup_passthrough(&a, "a") == 0);
|
||||
assert_se(strv_env_replace_strdup_passthrough(&a, "$a") == -EINVAL);
|
||||
|
||||
assert_se(strv_length(a) == 3);
|
||||
assert_se(streq(a[0], "a=a"));
|
||||
assert_se(streq(a[1], "b="));
|
||||
assert_se(streq(a[2], "c="));
|
||||
}
|
||||
|
||||
static void test_strv_env_assign(void) {
|
||||
log_info("/* %s */", __func__);
|
||||
|
||||
@ -415,6 +437,7 @@ int main(int argc, char *argv[]) {
|
||||
test_strv_env_unset();
|
||||
test_strv_env_merge();
|
||||
test_strv_env_replace_strdup();
|
||||
test_strv_env_replace_strdup_passthrough();
|
||||
test_strv_env_assign();
|
||||
test_env_strv_get_n();
|
||||
test_replace_env(false);
|
||||
|
Loading…
Reference in New Issue
Block a user