X-Git-Url: https://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?a=blobdiff_plain;f=load-fragment.c;h=bf17111482d30731a373fb79925eb239134c9871;hb=24e61ac49db6add10ffa448f42202245fb883b96;hp=4183b5c8fa912eec2ed5f412804c7eb6e1b29659;hpb=6be1e7d538e12f4e5c79c1271dba90e66726d8fd;p=elogind.git diff --git a/load-fragment.c b/load-fragment.c index 4183b5c8f..bf1711148 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; @@ -948,6 +943,37 @@ static int config_parse_limit( return 0; } +static int config_parse_cgroup( + const char *filename, + unsigned line, + const char *section, + const char *lvalue, + const char *rvalue, + void *data, + void *userdata) { + + Unit *u = userdata; + char *w; + size_t l; + char *state; + + FOREACH_WORD(w, l, rvalue, state) { + char *t; + int r; + + if (!(t = strndup(w, l))) + return -ENOMEM; + + r = unit_add_cgroup_from_text(u, t); + free(t); + + if (r < 0) + return r; + } + + return 0; +} + #define FOLLOW_MAX 8 static int open_follow(char **filename, FILE **_f, Set *names, char **_id) { @@ -1072,7 +1098,8 @@ static int load_from_path(Unit *u, const char *path) { { "LimitNICE", config_parse_limit, &(context).rlimit[RLIMIT_NICE], section }, \ { "LimitRTPRIO", config_parse_limit, &(context).rlimit[RLIMIT_RTPRIO], section }, \ { "LimitRTTIME", config_parse_limit, &(context).rlimit[RLIMIT_RTTIME], section }, \ - { "NonBlocking", config_parse_bool, &(context).non_blocking, section } + { "NonBlocking", config_parse_bool, &(context).non_blocking, section }, \ + { "ControlGroup", config_parse_cgroup, u, section } \ const ConfigItem items[] = { { "Names", config_parse_names, u, "Meta" }, @@ -1099,6 +1126,9 @@ static int load_from_path(Unit *u, const char *path) { { "TimeoutSec", config_parse_usec, &u->service.timeout_usec, "Service" }, { "Type", config_parse_service_type, &u->service, "Service" }, { "Restart", config_parse_service_restart, &u->service, "Service" }, + { "PermissionsStartOnly", config_parse_bool, &u->service.permissions_start_only, "Service" }, + { "RootDirectoryStartOnly", config_parse_bool, &u->service.root_directory_start_only, "Service" }, + { "ValidNoProcess", config_parse_bool, &u->service.valid_no_process, "Service" }, EXEC_CONTEXT_CONFIG_ITEMS(u->service.exec_context, "Service"), { "ListenStream", config_parse_listen, &u->socket, "Socket" }, @@ -1224,7 +1254,6 @@ finish: int unit_load_fragment(Unit *u) { int r = 0; - ExecContext *c; assert(u); assert(u->meta.load_state == UNIT_STUB); @@ -1233,33 +1262,43 @@ int unit_load_fragment(Unit *u) { 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 (r >= 0 && c && - (c->output == EXEC_OUTPUT_KERNEL || c->output == EXEC_OUTPUT_SYSLOG)) { - int k; + 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 syslog or kernel logging is requested, make sure - * our own logging daemon is run first. */ + if (c && + (c->output == EXEC_OUTPUT_KERNEL || c->output == EXEC_OUTPUT_SYSLOG)) { + int k; - if ((k = unit_add_dependency_by_name(u, UNIT_AFTER, SPECIAL_LOGGER_SOCKET)) < 0) - return k; + /* 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_REQUIRES, SPECIAL_LOGGER_SOCKET)) < 0) - return k; + if ((k = unit_add_dependency_by_name(u, UNIT_AFTER, SPECIAL_LOGGER_SOCKET)) < 0) + return k; + + if (u->meta.manager->running_as != MANAGER_SESSION) + if ((k = unit_add_dependency_by_name(u, UNIT_REQUIRES, SPECIAL_LOGGER_SOCKET)) < 0) + return k; + } } return r;