diff options
author | Zbigniew Jędrzejewski-Szmek <zbyszek@in.waw.pl> | 2022-03-08 10:08:05 +0100 |
---|---|---|
committer | Zbigniew Jędrzejewski-Szmek <zbyszek@in.waw.pl> | 2022-03-29 16:17:56 +0200 |
commit | 25407ad2a785d10b1aadff0c99829ea0cf51082b (patch) | |
tree | dc40723e68f5120274359265924c3ea7573bd944 /src/basic/env-file.c | |
parent | 80e72f80bc407753582b421421c13ca50b675027 (diff) | |
download | systemd-25407ad2a785d10b1aadff0c99829ea0cf51082b.tar.gz |
basic/env-file: make load-env-file deduplicate entries with the same key
We generally assume parsing like the shell would do it, so the last value
should win when there are repeats.
Diffstat (limited to 'src/basic/env-file.c')
-rw-r--r-- | src/basic/env-file.c | 31 |
1 files changed, 20 insertions, 11 deletions
diff --git a/src/basic/env-file.c b/src/basic/env-file.c index 3efd77909c..14925e72e1 100644 --- a/src/basic/env-file.c +++ b/src/basic/env-file.c @@ -414,30 +414,39 @@ static int load_env_file_push_pairs( const char *key, char *value, void *userdata, int *n_pushed) { - char ***m = userdata; + char ***m = ASSERT_PTR(userdata); + bool added = false; int r; r = check_utf8ness_and_warn(filename, line, key, value); if (r < 0) return r; + /* Check if the key is present */ + for (char **t = *m; t && *t; t += 2) + if (streq(t[0], key)) { + if (value) + r = free_and_replace(t[1], value); + else + r = free_and_strdup(t+1, ""); + goto finish; + } + r = strv_extend(m, key); if (r < 0) return -ENOMEM; - if (!value) { - r = strv_extend(m, ""); - if (r < 0) - return -ENOMEM; - } else { + if (value) r = strv_push(m, value); - if (r < 0) - return r; - } + else + r = strv_extend(m, ""); + added = true; + finish: + if (r < 0) + return r; - if (n_pushed) + if (n_pushed && added) (*n_pushed)++; - return 0; } |