X-Git-Url: https://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?a=blobdiff_plain;f=src%2Fservice.c;h=8b5c0b07c4d29efe70b639936389d7b77a2dbdbb;hb=133176702a03e5f6264f35c403dd7720d9e05c3f;hp=e782421389d9878b02ed009b9581ec1fc4732b7e;hpb=4b9397474f2c80957fd1cedf885061052333fb25;p=elogind.git diff --git a/src/service.c b/src/service.c index e78242138..8b5c0b07c 100644 --- a/src/service.c +++ b/src/service.c @@ -39,6 +39,7 @@ #include "exit-status.h" #include "def.h" #include "util.h" +#include "utf8.h" #ifdef HAVE_SYSV_COMPAT @@ -1235,6 +1236,9 @@ static int service_load(Unit *u) { 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->type == SERVICE_DBUS || s->bus_name) if ((r = unit_add_two_dependencies_by_name(u, UNIT_AFTER, UNIT_REQUIRES, SPECIAL_DBUS_SOCKET, NULL, true)) < 0) return r; @@ -1433,7 +1437,7 @@ static int service_search_main_pid(Service *s) { return 0; } -static void service_notify_sockets_dead(Service *s) { +static void service_notify_sockets_dead(Service *s, bool failed_permanent) { Iterator i; Unit *u; @@ -1446,7 +1450,7 @@ static void service_notify_sockets_dead(Service *s) { SET_FOREACH(u, UNIT(s)->dependencies[UNIT_TRIGGERED_BY], i) if (u->type == UNIT_SOCKET) - socket_notify_service_dead(SOCKET(u)); + socket_notify_service_dead(SOCKET(u), failed_permanent); return; } @@ -1508,7 +1512,7 @@ static void service_set_state(Service *s, ServiceState state) { state == SERVICE_FINAL_SIGKILL || state == SERVICE_FAILED || state == SERVICE_AUTO_RESTART) - service_notify_sockets_dead(s); + service_notify_sockets_dead(s, false); if (state != SERVICE_START_PRE && state != SERVICE_START && @@ -2356,7 +2360,7 @@ static int service_start_limit_test(Service *s) { } case SERVICE_START_LIMIT_REBOOT_FORCE: - log_warning("%s start request repeated too quickly, force rebooting.", UNIT(s)->id); + log_warning("%s start request repeated too quickly, forcibly rebooting.", UNIT(s)->id); UNIT(s)->manager->exit_code = MANAGER_REBOOT; break; @@ -2399,8 +2403,10 @@ static int service_start(Unit *u) { /* Make sure we don't enter a busy loop of some kind. */ r = service_start_limit_test(s); - if (r < 0) + if (r < 0) { + service_notify_sockets_dead(s, true); return r; + } s->result = SERVICE_SUCCESS; s->reload_result = SERVICE_SUCCESS; @@ -3195,11 +3201,19 @@ static void service_notify_message(Unit *u, pid_t pid, char **tags) { } /* Interpret STATUS= */ - if ((e = strv_find_prefix(tags, "STATUS="))) { + e = strv_find_prefix(tags, "STATUS="); + if (e) { char *t; if (e[7]) { - if (!(t = strdup(e+7))) { + + if (!utf8_is_valid(e+7)) { + log_warning("Status message in notification is not UTF-8 clean."); + return; + } + + t = strdup(e+7); + if (!t) { log_error("Failed to allocate string."); return; }