chiark / gitweb /
unit: rename load_path to fragment_path to make clear what kind of configuration...
[elogind.git] / load-fragment.c
index 95e6cc3f88aa18833713d9d7a9b60bcc92108601..4183b5c8fa912eec2ed5f412804c7eb6e1b29659 100644 (file)
@@ -1128,7 +1128,7 @@ static int load_from_path(Unit *u, const char *path) {
         int r;
         Set *symlink_names;
         FILE *f;
-        char *filename, *id;
+        char *filename = NULL, *id;
 
         sections[0] = "Meta";
         sections[1] = section_table[u->meta.type];
@@ -1137,18 +1137,56 @@ static int load_from_path(Unit *u, const char *path) {
         if (!(symlink_names = set_new(string_hash_func, string_compare_func)))
                 return -ENOMEM;
 
-        /* Instead of opening the path right away, we manually
-         * follow all symlinks and add their name to our unit
-         * name set while doing so */
-        if (!(filename = path_make_absolute(path, unit_path()))) {
-                r = -ENOMEM;
-                goto finish;
-        }
+        if (path_is_absolute(path)) {
+
+                if (!(filename = strdup(path))) {
+                        r = -ENOMEM;
+                        goto finish;
+                }
+
+                if ((r = open_follow(&filename, &f, symlink_names, &id)) < 0) {
+                        free(filename);
+                        filename = NULL;
 
-        if ((r = open_follow(&filename, &f, symlink_names, &id)) < 0) {
-                if (r == -ENOENT)
-                        r = 0; /* returning 0 means: no suitable config file found */
+                        if (r != -ENOENT)
+                                goto finish;
+                }
+
+        } else  {
+                char **p;
+
+                STRV_FOREACH(p, u->meta.manager->unit_path) {
+
+                        /* Instead of opening the path right away, we manually
+                         * follow all symlinks and add their name to our unit
+                         * name set while doing so */
+                        if (!(filename = path_make_absolute(path, *p))) {
+                                r = -ENOMEM;
+                                goto finish;
+                        }
+
+                        if ((r = open_follow(&filename, &f, symlink_names, &id)) < 0) {
+                                char *sn;
+
+                                free(filename);
+                                filename = NULL;
+
+                                if (r != -ENOENT)
+                                        goto finish;
+
+                                /* Empty the symlink names for the next run */
+                                while ((sn = set_steal_first(symlink_names)))
+                                        free(sn);
+
+                                continue;
+                        }
+
+                        break;
+                }
+        }
 
+        if (!filename) {
+                r = 0; /* returning 0 means: no suitable config file found */
                 goto finish;
         }
 
@@ -1169,8 +1207,8 @@ static int load_from_path(Unit *u, const char *path) {
         }
 
 
-        free(u->meta.load_path);
-        u->meta.load_path = filename;
+        free(u->meta.fragment_path);
+        u->meta.fragment_path = filename;
         filename = NULL;
 
         r = 1; /* returning 1 means: suitable config file found and loaded */
@@ -1191,8 +1229,8 @@ int unit_load_fragment(Unit *u) {
         assert(u);
         assert(u->meta.load_state == UNIT_STUB);
 
-        if (u->meta.load_path)
-                r = load_from_path(u, u->meta.load_path);
+        if (u->meta.fragment_path)
+                r = load_from_path(u, u->meta.fragment_path);
         else {
                 Iterator i;
                 char *t;