X-Git-Url: https://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?p=elogind.git;a=blobdiff_plain;f=load-fragment.c;h=e002bf5ad1fd754cdc2d4cb66208d1e78210c4c6;hp=95e6cc3f88aa18833713d9d7a9b60bcc92108601;hb=890f434c6086cd076b15d7530f9c450b99f346e4;hpb=b5a0699f0bb8b1d1ae55bb0d86f51dfe2783821b diff --git a/load-fragment.c b/load-fragment.c index 95e6cc3f8..e002bf5ad 100644 --- a/load-fragment.c +++ b/load-fragment.c @@ -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;