diff options
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; } |