X-Git-Url: https://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?a=blobdiff_plain;f=src%2Fcore%2Fservice.c;h=c7b35050bd2f61d9b8181559f9270c0dda830100;hb=c43b2132f37264600cc26e07c8d85dfdd6c969f0;hp=26b9b56371afff8f638fbab89edbbef9a9efb893;hpb=2339fc936a1f0b1c60cc8a3446a1dbf994c6aaf3;p=elogind.git diff --git a/src/core/service.c b/src/core/service.c index 26b9b5637..c7b35050b 100644 --- a/src/core/service.c +++ b/src/core/service.c @@ -21,7 +21,6 @@ #include #include -#include #include #include "async.h" @@ -495,8 +494,7 @@ static int service_add_default_dependencies(Service *s) { return r; /* Second, activate normal shutdown */ - r = unit_add_two_dependencies_by_name(UNIT(s), UNIT_BEFORE, UNIT_CONFLICTS, SPECIAL_SHUTDOWN_TARGET, NULL, true); - return r; + return unit_add_two_dependencies_by_name(UNIT(s), UNIT_BEFORE, UNIT_CONFLICTS, SPECIAL_SHUTDOWN_TARGET, NULL, true); } static void service_fix_output(Service *s) { @@ -517,6 +515,67 @@ static void service_fix_output(Service *s) { s->exec_context.std_output = UNIT(s)->manager->default_std_output; } +static int service_add_extras(Service *s) { + int r; + + assert(s); + + if (s->type == _SERVICE_TYPE_INVALID) { + /* Figure out a type automatically */ + if (s->bus_name) + s->type = SERVICE_DBUS; + else if (s->exec_command[SERVICE_EXEC_START]) + s->type = SERVICE_SIMPLE; + else + s->type = SERVICE_ONESHOT; + } + + /* Oneshot services have disabled start timeout by default */ + if (s->type == SERVICE_ONESHOT && !s->start_timeout_defined) + s->timeout_start_usec = 0; + + service_fix_output(s); + + r = unit_patch_contexts(UNIT(s)); + if (r < 0) + return r; + + r = unit_add_exec_dependencies(UNIT(s), &s->exec_context); + if (r < 0) + return r; + + r = unit_add_default_slice(UNIT(s), &s->cgroup_context); + if (r < 0) + return r; + + if (s->type == SERVICE_NOTIFY && s->notify_access == NOTIFY_NONE) + s->notify_access = NOTIFY_MAIN; + + if (s->watchdog_usec > 0 && s->notify_access == NOTIFY_NONE) + s->notify_access = NOTIFY_MAIN; + + if (s->bus_name) { + const char *n; + + r = unit_watch_bus_name(UNIT(s), s->bus_name); + if (r < 0) + return r; + + n = strjoina(s->bus_name, ".busname"); + r = unit_add_dependency_by_name(UNIT(s), UNIT_AFTER, n, NULL, true); + if (r < 0) + return r; + } + + if (UNIT(s)->default_dependencies) { + r = service_add_default_dependencies(s); + if (r < 0) + return r; + } + + return 0; +} + static int service_load(Unit *u) { Service *s = SERVICE(u); int r; @@ -541,52 +600,11 @@ static int service_load(Unit *u) { if (r < 0) return r; - if (s->type == _SERVICE_TYPE_INVALID) { - /* Figure out a type automatically */ - if (s->bus_name) - s->type = SERVICE_DBUS; - else if (s->exec_command[SERVICE_EXEC_START]) - s->type = SERVICE_SIMPLE; - else - s->type = SERVICE_ONESHOT; - } - - /* Oneshot services have disabled start timeout by default */ - if (s->type == SERVICE_ONESHOT && !s->start_timeout_defined) - s->timeout_start_usec = 0; - - service_fix_output(s); - - r = unit_patch_contexts(u); - if (r < 0) - return r; - - r = unit_add_exec_dependencies(u, &s->exec_context); - if (r < 0) - return r; - - r = unit_add_default_slice(u, &s->cgroup_context); + /* This is a new unit? Then let's add in some + * extras */ + r = service_add_extras(s); if (r < 0) return r; - - if (s->type == SERVICE_NOTIFY && s->notify_access == NOTIFY_NONE) - s->notify_access = NOTIFY_MAIN; - - if (s->watchdog_usec > 0 && s->notify_access == NOTIFY_NONE) - s->notify_access = NOTIFY_MAIN; - - if (s->bus_name) { - r = unit_watch_bus_name(u, s->bus_name); - if (r < 0) - return r; - } - - if (u->default_dependencies) { - r = service_add_default_dependencies(s); - if (r < 0) - - return r; - } } return service_verify(s); @@ -600,7 +618,7 @@ static void service_dump(Unit *u, FILE *f, const char *prefix) { assert(s); prefix = strempty(prefix); - prefix2 = strappenda(prefix, "\t"); + prefix2 = strjoina(prefix, "\t"); fprintf(f, "%sService State: %s\n" @@ -1104,7 +1122,7 @@ static int service_spawn( } if (is_control && UNIT(s)->cgroup_path) { - path = strappenda(UNIT(s)->cgroup_path, "/control"); + path = strjoina(UNIT(s)->cgroup_path, "/control"); cg_create(SYSTEMD_CGROUP_CONTROLLER, path); } else path = UNIT(s)->cgroup_path; @@ -1470,7 +1488,7 @@ static void service_kill_control_processes(Service *s) { if (!UNIT(s)->cgroup_path) return; - p = strappenda(UNIT(s)->cgroup_path, "/control"); + p = strjoina(UNIT(s)->cgroup_path, "/control"); cg_kill_recursive(SYSTEMD_CGROUP_CONTROLLER, p, SIGKILL, true, true, true, NULL); } @@ -1818,7 +1836,7 @@ static int service_start(Unit *u) { s->notify_state = NOTIFY_UNKNOWN; service_enter_start_pre(s); - return 0; + return 1; } static int service_stop(Unit *u) { @@ -1859,7 +1877,7 @@ static int service_stop(Unit *u) { s->state == SERVICE_EXITED); service_enter_stop(s, SERVICE_SUCCESS); - return 0; + return 1; } static int service_reload(Unit *u) {