X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?p=elogind.git;a=blobdiff_plain;f=src%2Fsysctl%2Fsysctl.c;h=035e0ec321c5a4d951fd91e7761fc6430edb0f29;hp=793796d36381a8909123502bb584647fcba35eb1;hb=91b32fa987a4a50faf3d8561b28b6c9d5150adef;hpb=86fc77c47f2d22cd01d0871866869cb194af0884 diff --git a/src/sysctl/sysctl.c b/src/sysctl/sysctl.c index 793796d36..035e0ec32 100644 --- a/src/sysctl/sysctl.c +++ b/src/sysctl/sysctl.c @@ -167,14 +167,18 @@ static int parse_file(const char *path, bool ignore_enoent) { r = hashmap_put(sysctl_options, property, new_value); if (r < 0) { - if (r == -EEXIST) + if (r == -EEXIST) { + /* ignore this "error" to avoid returning it + * for the function when this is the last key + * in the file being parsed. */ + r = 0; log_debug("Skipping previously assigned sysctl variable %s", property); - else + } else log_error("Failed to add sysctl variable %s to hashmap: %s", property, strerror(-r)); free(property); free(new_value); - if (r != -EEXIST) + if (r != 0) goto finish; } } @@ -252,7 +256,7 @@ static int parse_argv(int argc, char *argv[]) { } int main(int argc, char *argv[]) { - int r = 0; + int r = 0, k; char *property, *value; Iterator it; @@ -272,19 +276,18 @@ int main(int argc, char *argv[]) { goto finish; } + r = 0; + if (argc > optind) { int i; for (i = optind; i < argc; i++) { - int k; - k = parse_file(argv[i], false); - if (k < 0 && r == 0) + if (k < 0) r = k; } } else { char **files, **f; - int k; r = conf_files_list(&files, ".conf", "/etc/sysctl.d", @@ -308,14 +311,17 @@ int main(int argc, char *argv[]) { f = files + strv_length(files) - 1; STRV_FOREACH_BACKWARDS(f, files) { k = parse_file(*f, true); - if (k < 0 && r == 0) + if (k < 0) r = k; } strv_free(files); } - r = apply_all(); + k = apply_all(); + if (k < 0) + r = k; + finish: HASHMAP_FOREACH_KEY(value, property, sysctl_options, it) { hashmap_remove(sysctl_options, property);