X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?p=elogind.git;a=blobdiff_plain;f=src%2Fload-fragment.c;h=f2f2d72837b8b56a9fd45e8383a0faebd54b53b6;hp=a2974cbeaded5bb595c610c16fdbd259276f1823;hb=674a6e4d0cae372f34df94dfab2513e071d5dc58;hpb=45fb0699c45d2e042e04a53e3ea00501e3f65f59 diff --git a/src/load-fragment.c b/src/load-fragment.c index a2974cbea..f2f2d7283 100644 --- a/src/load-fragment.c +++ b/src/load-fragment.c @@ -1312,16 +1312,20 @@ static int open_follow(char **filename, FILE **_f, Set *names, char **_final) { path_kill_slashes(*filename); /* Add the file name we are currently looking at to - * the names of this unit */ + * the names of this unit, but only if it is a valid + * unit name. */ name = file_name_from_path(*filename); - if (!(id = set_get(names, name))) { - if (!(id = strdup(name))) - return -ENOMEM; + if (unit_name_is_valid(name)) { + if (!(id = set_get(names, name))) { - if ((r = set_put(names, id)) < 0) { - free(id); - return r; + if (!(id = strdup(name))) + return -ENOMEM; + + if ((r = set_put(names, id)) < 0) { + free(id); + return r; + } } } @@ -1340,7 +1344,7 @@ static int open_follow(char **filename, FILE **_f, Set *names, char **_final) { *filename = target; } - if (!(f = fdopen(fd, "r"))) { + if (!(f = fdopen(fd, "re"))) { r = -errno; close_nointr_nofail(fd); return r; @@ -1565,6 +1569,7 @@ static int load_from_path(Unit *u, const char *path) { { "OnlyByDependency", config_parse_bool, &u->meta.only_by_dependency, "Unit" }, { "DefaultDependencies", config_parse_bool, &u->meta.default_dependencies, "Unit" }, { "IgnoreDependencyFailure",config_parse_bool, &u->meta.ignore_dependency_failure, "Unit" }, + { "JobTimeoutSec", config_parse_usec, &u->meta.job_timeout, "Unit" }, { "PIDFile", config_parse_path, &u->service.pid_file, "Service" }, { "ExecStartPre", config_parse_exec, u->service.exec_command+SERVICE_EXEC_START_PRE, "Service" }, @@ -1611,6 +1616,7 @@ static int load_from_path(Unit *u, const char *path) { { "Mark", config_parse_int, &u->socket.mark, "Socket" }, { "PipeSize", config_parse_size, &u->socket.pipe_size, "Socket" }, { "FreeBind", config_parse_bool, &u->socket.free_bind, "Socket" }, + { "TCPCongestion", config_parse_string, &u->socket.tcp_congestion, "Socket" }, EXEC_CONTEXT_CONFIG_ITEMS(u->socket.exec_context, "Socket"), { "What", config_parse_string, &u->mount.parameters_fragment.what, "Mount" }, @@ -1729,6 +1735,7 @@ static int load_from_path(Unit *u, const char *path) { } if (!filename) { + /* Hmm, no suitable file found? */ r = 0; goto finish; } @@ -1749,11 +1756,6 @@ static int load_from_path(Unit *u, const char *path) { goto finish; } - if (!S_ISREG(st.st_mode)) { - r = -ENOENT; - goto finish; - } - /* Now, parse the file contents */ if ((r = config_parse(filename, f, sections, items, false, u)) < 0) goto finish; @@ -1779,68 +1781,69 @@ finish: int unit_load_fragment(Unit *u) { int r; + Iterator i; + const char *t; assert(u); + assert(u->meta.load_state == UNIT_STUB); + assert(u->meta.id); + + /* First, try to find the unit under its id. We always look + * for unit files in the default directories, to make it easy + * to override things by placing things in /etc/systemd/system */ + if ((r = load_from_path(u, u->meta.id)) < 0) + return r; - if (u->meta.fragment_path) { + /* Try to find an alias we can load this with */ + if (u->meta.load_state == UNIT_STUB) + SET_FOREACH(t, u->meta.names, i) { + if (t == u->meta.id) + continue; + + if ((r = load_from_path(u, t)) < 0) + return r; + + if (u->meta.load_state != UNIT_STUB) + break; + } + + /* And now, try looking for it under the suggested (originally linked) path */ + if (u->meta.load_state == UNIT_STUB && u->meta.fragment_path) if ((r = load_from_path(u, u->meta.fragment_path)) < 0) return r; - } else { - Iterator i; - const char *t; + /* Look for a template */ + if (u->meta.load_state == UNIT_STUB && u->meta.instance) { + char *k; + + if (!(k = unit_name_template(u->meta.id))) + return -ENOMEM; - /* Try to find the unit under its id */ - if ((r = load_from_path(u, u->meta.id)) < 0) + r = load_from_path(u, k); + free(k); + + if (r < 0) return r; - /* Try to find an alias we can load this with */ if (u->meta.load_state == UNIT_STUB) SET_FOREACH(t, u->meta.names, i) { if (t == u->meta.id) continue; - if ((r = load_from_path(u, t)) < 0) + if (!(k = unit_name_template(t))) + return -ENOMEM; + + r = load_from_path(u, k); + free(k); + + if (r < 0) return r; if (u->meta.load_state != UNIT_STUB) break; } - - /* Now, follow the same logic, but look for a template */ - if (u->meta.load_state == UNIT_STUB && u->meta.instance) { - char *k; - - if (!(k = unit_name_template(u->meta.id))) - return -ENOMEM; - - r = load_from_path(u, k); - free(k); - - if (r < 0) - return r; - - if (u->meta.load_state == UNIT_STUB) - SET_FOREACH(t, u->meta.names, i) { - - if (t == u->meta.id) - continue; - - if (!(k = unit_name_template(t))) - return -ENOMEM; - - r = load_from_path(u, k); - free(k); - - if (r < 0) - return r; - - if (u->meta.load_state != UNIT_STUB) - break; - } - } } return 0;