+ return k;
+}
+
+static int enumerate_dir_d(Hashmap *top, Hashmap *bottom, Hashmap *drops, const char *toppath, const char *drop) {
+ _cleanup_free_ char *conf = NULL;
+ _cleanup_free_ char *path = NULL;
+ _cleanup_strv_free_ char **list = NULL;
+ char **file;
+ char *c;
+ int r;
+
+ path = strjoin(toppath, "/", drop, NULL);
+ if (!path)
+ return -ENOMEM;
+
+ path_kill_slashes(path);
+
+ conf = strdup(drop);
+ if (!conf)
+ return -ENOMEM;
+
+ c = strrchr(conf, '.');
+ if (!c)
+ return -EINVAL;
+ *c = 0;
+
+ r = get_files_in_directory(path, &list);
+ if (r < 0){
+ log_error("Failed to enumerate %s: %s", path, strerror(-r));
+ return r;
+ }
+
+ STRV_FOREACH(file, list) {
+ Hashmap *h;
+ int k;
+ char *p;
+ char *d;
+
+ if (!endswith(*file, ".conf"))
+ continue;
+
+ p = strjoin(path, "/", *file, NULL);
+ if (!p)
+ return -ENOMEM;
+
+ path_kill_slashes(p);
+
+ d = strrchr(p, '/');
+ if (!d || d == p) {
+ free(p);
+ return -EINVAL;
+ }
+ d--;
+ d = strrchr(p, '/');
+
+ if (!d || d == p) {
+ free(p);
+ return -EINVAL;
+ }
+
+ k = hashmap_put(top, d, p);
+ if (k >= 0) {
+ p = strdup(p);
+ if (!p)
+ return -ENOMEM;
+ d = strrchr(p, '/');
+ d--;
+ d = strrchr(p, '/');
+ } else if (k != -EEXIST) {
+ free(p);
+ return k;
+ }
+
+ free(hashmap_remove(bottom, d));
+ k = hashmap_put(bottom, d, p);
+ if (k < 0) {
+ free(p);
+ return k;
+ }
+
+ h = hashmap_get(drops, conf);
+ if (!h) {
+ h = hashmap_new(string_hash_func, string_compare_func);
+ if (!h)
+ return -ENOMEM;
+ hashmap_put(drops, conf, h);
+ conf = strdup(conf);
+ if (!conf)
+ return -ENOMEM;
+ }
+
+ p = strdup(p);
+ if (!p)
+ return -ENOMEM;