chiark / gitweb /
load-fragment: prefer unit id over alias names when looking for fragments
[elogind.git] / load-fragment.c
index 95e6cc3f88aa18833713d9d7a9b60bcc92108601..e002bf5ad1fd754cdc2d4cb66208d1e78210c4c6 100644 (file)
@@ -56,7 +56,7 @@ static int config_parse_deps(
         assert(lvalue);
         assert(rvalue);
 
-        FOREACH_WORD(w, &l, rvalue, state) {
+        FOREACH_WORD(w, l, rvalue, state) {
                 char *t;
                 int r;
 
@@ -92,7 +92,7 @@ static int config_parse_names(
         assert(rvalue);
         assert(data);
 
-        FOREACH_WORD(w, &l, rvalue, state) {
+        FOREACH_WORD(w, l, rvalue, state) {
                 char *t;
                 int r;
                 Unit *other;
@@ -328,7 +328,7 @@ static int config_parse_exec(
                 void *data,
                 void *userdata) {
 
-        ExecCommand **e = data, *ee, *nce = NULL;
+        ExecCommand **e = data, *nce = NULL;
         char **n;
         char *w;
         unsigned k;
@@ -367,12 +367,7 @@ static int config_parse_exec(
         if (!(nce->path = strdup(n[0])))
                 goto fail;
 
-        if (*e) {
-                /* It's kinda important that we keep the order here */
-                LIST_FIND_TAIL(ExecCommand, command, *e, ee);
-                LIST_INSERT_AFTER(ExecCommand, command, *e, ee, nce);
-        } else
-                *e = nce;
+        exec_command_append_list(e, nce);
 
         return 0;
 
@@ -751,7 +746,7 @@ static int config_parse_cpu_affinity(
         assert(rvalue);
         assert(data);
 
-        FOREACH_WORD(w, &l, rvalue, state) {
+        FOREACH_WORD(w, l, rvalue, state) {
                 char *t;
                 int r;
                 unsigned cpu;
@@ -826,7 +821,7 @@ static int config_parse_secure_bits(
         assert(rvalue);
         assert(data);
 
-        FOREACH_WORD(w, &l, rvalue, state) {
+        FOREACH_WORD(w, l, rvalue, state) {
                 if (first_word(w, "keep-caps"))
                         c->secure_bits |= SECURE_KEEP_CAPS;
                 else if (first_word(w, "keep-caps-locked"))
@@ -867,7 +862,7 @@ static int config_parse_bounding_set(
         assert(rvalue);
         assert(data);
 
-        FOREACH_WORD(w, &l, rvalue, state) {
+        FOREACH_WORD(w, l, rvalue, state) {
                 char *t;
                 int r;
                 cap_value_t cap;
@@ -1128,7 +1123,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 +1132,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 != -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;
 
-        if ((r = open_follow(&filename, &f, symlink_names, &id)) < 0) {
-                if (r == -ENOENT)
-                        r = 0; /* returning 0 means: no suitable config file found */
+                                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 +1202,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 */
@@ -1186,42 +1219,49 @@ finish:
 
 int unit_load_fragment(Unit *u) {
         int r = 0;
-        ExecContext *c;
 
         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;
+                const char *t;
 
-                /* Try to find a name we can load this with */
-                SET_FOREACH(t, u->meta.names, i)
-                        if ((r = load_from_path(u, t)) != 0)
-                                return r;
+                /* Try to find the unit under its id */
+                if ((t = unit_id(u)))
+                        r = load_from_path(u, t);
+
+                /* Try to find an alias we can load this with */
+                if (r == 0)
+                        SET_FOREACH(t, u->meta.names, i)
+                                if ((r = load_from_path(u, t)) != 0)
+                                        break;
         }
 
-        if (u->meta.type == UNIT_SOCKET)
-                c = &u->socket.exec_context;
-        else if (u->meta.type == UNIT_SERVICE)
-                c = &u->service.exec_context;
-        else
-                c = NULL;
+        if (r >= 0) {
+                ExecContext *c;
+
+                if (u->meta.type == UNIT_SOCKET)
+                        c = &u->socket.exec_context;
+                else if (u->meta.type == UNIT_SERVICE)
+                        c = &u->service.exec_context;
+                else
+                        c = NULL;
 
-        if (r >= 0 && c &&
-            (c->output == EXEC_OUTPUT_KERNEL || c->output == EXEC_OUTPUT_SYSLOG)) {
-                int k;
+                if (c && (c->output == EXEC_OUTPUT_KERNEL || c->output == EXEC_OUTPUT_SYSLOG)) {
+                        int k;
 
-                /* If syslog or kernel logging is requested, make sure
-                 * our own logging daemon is run first. */
+                        /* If syslog or kernel logging is requested, make sure
+                         * our own logging daemon is run first. */
 
-                if ((k = unit_add_dependency_by_name(u, UNIT_AFTER, SPECIAL_LOGGER_SOCKET)) < 0)
-                        return k;
+                        if ((k = unit_add_dependency_by_name(u, UNIT_AFTER, SPECIAL_LOGGER_SOCKET)) < 0)
+                                return k;
 
-                if ((k = unit_add_dependency_by_name(u, UNIT_REQUIRES, SPECIAL_LOGGER_SOCKET)) < 0)
-                        return k;
+                        if ((k = unit_add_dependency_by_name(u, UNIT_REQUIRES, SPECIAL_LOGGER_SOCKET)) < 0)
+                                return k;
+                }
         }
 
         return r;