X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?p=elogind.git;a=blobdiff_plain;f=src%2Fcore%2Fservice.c;h=20990d2a19bfcd97e0c8dc7f5bfdf612c33f84e7;hp=4451d38eefdbd103b9d54712e902ec4b51fa64f4;hb=af4713396cff773beb56fef23cd8a9a3803670ab;hpb=3f95f83c548d180cddc6b9907f8d8d72ebd5abe9 diff --git a/src/core/service.c b/src/core/service.c index 4451d38ee..20990d2a1 100644 --- a/src/core/service.c +++ b/src/core/service.c @@ -36,7 +36,7 @@ #include "unit-printf.h" #include "dbus-service.h" #include "special.h" -#include "bus-errors.h" +#include "dbus-common.h" #include "exit-status.h" #include "def.h" #include "path-util.h" @@ -235,7 +235,7 @@ static void service_stop_watchdog(Service *s) { s->watchdog_timestamp.monotonic = 0; } -static void service_enter_dead(Service *s, ServiceResult f, bool allow_restart); +static void service_enter_signal(Service *s, ServiceState state, ServiceResult f); static void service_handle_watchdog(Service *s) { usec_t offset; @@ -249,7 +249,7 @@ static void service_handle_watchdog(Service *s) { offset = now(CLOCK_MONOTONIC) - s->watchdog_timestamp.monotonic; if (offset >= s->watchdog_usec) { log_error_unit(UNIT(s)->id, "%s watchdog timeout!", UNIT(s)->id); - service_enter_dead(s, SERVICE_FAILURE_WATCHDOG, true); + service_enter_signal(s, SERVICE_STOP_SIGKILL, SERVICE_FAILURE_WATCHDOG); return; } @@ -762,7 +762,7 @@ static int service_load_sysv_path(Service *s, const char *path) { continue; if (unit_name_to_type(m) == UNIT_SERVICE) - r = unit_add_name(u, m); + r = unit_merge_by_name(u, m); else /* NB: SysV targets * which are provided @@ -1148,6 +1148,16 @@ static int service_add_default_dependencies(Service *s) { SPECIAL_SOCKETS_TARGET, NULL, true); if (r < 0) return r; + + r = unit_add_two_dependencies_by_name(UNIT(s), UNIT_AFTER, UNIT_REQUIRES, + SPECIAL_TIMERS_TARGET, NULL, true); + if (r < 0) + return r; + + r = unit_add_two_dependencies_by_name(UNIT(s), UNIT_AFTER, UNIT_REQUIRES, + SPECIAL_PATHS_TARGET, NULL, true); + if (r < 0) + return r; } /* Second, activate normal shutdown */ @@ -1265,7 +1275,7 @@ static void service_dump(Unit *u, FILE *f, const char *prefix) { ServiceExecCommand c; Service *s = SERVICE(u); const char *prefix2; - char _cleanup_free_ *p2 = NULL; + _cleanup_free_ char *p2 = NULL; assert(s); @@ -1363,7 +1373,7 @@ static void service_dump(Unit *u, FILE *f, const char *prefix) { } static int service_load_pid_file(Service *s, bool may_warn) { - char _cleanup_free_ *k = NULL; + _cleanup_free_ char *k = NULL; int r; pid_t pid; @@ -1456,6 +1466,9 @@ static int service_search_main_pid(Service *s) { r = unit_watch_pid(UNIT(s), pid); if (r < 0) /* FIXME: we need to do something here */ + log_warning_unit(UNIT(s)->id, + "Failed to watch PID %lu from service %s", + (unsigned long) pid, UNIT(s)->id); return r; return 0; @@ -1730,9 +1743,9 @@ static int service_spawn( pid_t pid; int r; int *fds = NULL; - int _cleanup_free_ *fdsbuf = NULL; + _cleanup_free_ int *fdsbuf = NULL; unsigned n_fds = 0, n_env = 0; - char _cleanup_strv_free_ + _cleanup_strv_free_ char **argv = NULL, **final_env = NULL, **our_env = NULL; assert(s); @@ -1865,7 +1878,7 @@ static int main_pid_good(Service *s) { return -EAGAIN; } -static int control_pid_good(Service *s) { +_pure_ static int control_pid_good(Service *s) { assert(s); return s->control_pid > 0; @@ -1926,8 +1939,6 @@ fail: service_enter_dead(s, SERVICE_FAILURE_RESOURCES, false); } -static void service_enter_signal(Service *s, ServiceState state, ServiceResult f); - static void service_enter_stop_post(Service *s, ServiceResult f) { int r; assert(s); @@ -2557,7 +2568,7 @@ static int service_reload(Unit *u) { return 0; } -static bool service_can_reload(Unit *u) { +_pure_ static bool service_can_reload(Unit *u) { Service *s = SERVICE(u); assert(s); @@ -2769,7 +2780,7 @@ static int service_deserialize_item(Unit *u, const char *key, const char *value, return 0; } -static UnitActiveState service_active_state(Unit *u) { +_pure_ static UnitActiveState service_active_state(Unit *u) { const UnitActiveState *table; assert(u); @@ -2805,7 +2816,7 @@ static bool service_check_gc(Unit *u) { return false; } -static bool service_check_snapshot(Unit *u) { +_pure_ static bool service_check_snapshot(Unit *u) { Service *s = SERVICE(u); assert(s); @@ -3434,10 +3445,10 @@ static void service_notify_message(Unit *u, pid_t pid, char **tags) { static int service_enumerate(Manager *m) { char **p; unsigned i; - DIR _cleanup_closedir_ *d = NULL; - char _cleanup_free_ *path = NULL, *fpath = NULL, *name = NULL; - Set *runlevel_services[ELEMENTSOF(rcnd_table)]; - Set _cleanup_set_free_ *shutdown_services = NULL; + _cleanup_closedir_ DIR *d = NULL; + _cleanup_free_ char *path = NULL, *fpath = NULL, *name = NULL; + Set *runlevel_services[ELEMENTSOF(rcnd_table)] = {}; + _cleanup_set_free_ Set *shutdown_services = NULL; Unit *service; Iterator j; int r; @@ -3447,8 +3458,6 @@ static int service_enumerate(Manager *m) { if (m->running_as != SYSTEMD_SYSTEM) return 0; - zero(runlevel_services); - STRV_FOREACH(p, m->lookup_paths.sysvrcnd_path) for (i = 0; i < ELEMENTSOF(rcnd_table); i ++) { struct dirent *de;