X-Git-Url: https://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?p=elogind.git;a=blobdiff_plain;f=service.c;h=2c3c0b233be3203aee90f6190d7546254f9c0c92;hp=ae7fc36a5c4bedd54ac35516443316139e139c0f;hb=ceee3d82853a198884795e5d815b895468212b24;hpb=2a987ee8c94ac29545e3c94d47b5d493daea0b5e diff --git a/service.c b/service.c index ae7fc36a5..2c3c0b233 100644 --- a/service.c +++ b/service.c @@ -198,6 +198,34 @@ static int service_load_pid_file(Service *s) { return 0; } +static int service_notify_sockets(Service *s) { + Iterator i; + char *t; + + assert(s); + + SET_FOREACH(t, UNIT(s)->meta.names, i) { + char *k; + Unit *p; + + /* Look for all socket objects that go by any of our + * units and collect their fds */ + + if (!(k = unit_name_change_suffix(t, ".socket"))) + return -ENOMEM; + + p = manager_get_unit(UNIT(s)->meta.manager, k); + free(k); + + if (!p) + continue; + + socket_notify_service_dead(SOCKET(p)); + } + + return 0; +} + static void service_set_state(Service *s, ServiceState state) { ServiceState old_state; assert(s); @@ -252,6 +280,17 @@ static void service_set_state(Service *s, ServiceState state) { state != SERVICE_STOP_POST) s->control_command = NULL; + if (state == SERVICE_DEAD || + state == SERVICE_STOP || + state == SERVICE_STOP_SIGTERM || + state == SERVICE_STOP_SIGKILL || + state == SERVICE_STOP_POST || + state == SERVICE_FINAL_SIGTERM || + state == SERVICE_FINAL_SIGKILL || + state == SERVICE_MAINTAINANCE || + state == SERVICE_AUTO_RESTART) + service_notify_sockets(s); + log_debug("%s changing %s → %s", unit_id(UNIT(s)), state_string_table[old_state], state_string_table[state]); unit_notify(UNIT(s), state_translation_table[old_state], state_translation_table[state]);