X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?a=blobdiff_plain;f=socket.c;h=68a4d812d6f6956b989a762ca36c9b17071084b5;hb=ab6e5f147eb9fa303653ef664f79048110d4a12b;hp=cbddcaa77d880adc43acedbda9bd3fc999df05c0;hpb=acbb02252a38214ecba3aa8a5c9b3669f9c9317e;p=elogind.git diff --git a/socket.c b/socket.c index cbddcaa77..68a4d812d 100644 --- a/socket.c +++ b/socket.c @@ -140,6 +140,7 @@ static void socket_dump(Unit *u, FILE *f, const char *prefix) { char *prefix2; assert(s); + assert(f); prefix2 = strappend(prefix, "\t"); if (!prefix2) @@ -464,12 +465,27 @@ fail: socket_enter_stop_post(s, false); } +static void socket_enter_listening(Socket *s) { + int r; + assert(s); + + if ((r = socket_watch_fds(s)) < 0) { + log_warning("%s failed to watch sockets: %s", unit_id(UNIT(s)), strerror(-r)); + goto fail; + } + + socket_set_state(s, SOCKET_LISTENING); + return; + +fail: + socket_enter_stop_pre(s, false); +} + static void socket_enter_start_post(Socket *s) { int r; assert(s); - if ((r = socket_open_fds(s)) < 0 || - (r = socket_watch_fds(s)) < 0) { + if ((r = socket_open_fds(s)) < 0) { log_warning("%s failed to listen on sockets: %s", unit_id(UNIT(s)), strerror(-r)); goto fail; } @@ -483,7 +499,7 @@ static void socket_enter_start_post(Socket *s) { socket_set_state(s, SOCKET_START_POST); } else - socket_set_state(s, SOCKET_LISTENING); + socket_enter_listening(s); return; @@ -611,7 +627,7 @@ static void socket_fd_event(Unit *u, int fd, uint32_t events, Watch *w) { assert(s); - log_info("Incoming traffic on %s", unit_id(u)); + log_debug("Incoming traffic on %s", unit_id(u)); if (events != POLLIN) socket_enter_stop_pre(s, false); @@ -626,7 +642,7 @@ static void socket_sigchld_event(Unit *u, pid_t pid, int code, int status) { assert(s); assert(pid >= 0); - success = code == CLD_EXITED || status == 0; + success = code == CLD_EXITED && status == 0; s->failure = s->failure || !success; assert(s->control_pid == pid); @@ -645,7 +661,7 @@ static void socket_sigchld_event(Unit *u, pid_t pid, int code, int status) { /* No further commands for this step, so let's figure * out what to do next */ - log_debug("%s finished with state %s", unit_id(u), state_string_table[s->state]); + log_debug("%s got final SIGCHLD for state %s", unit_id(u), state_string_table[s->state]); switch (s->state) { @@ -658,7 +674,7 @@ static void socket_sigchld_event(Unit *u, pid_t pid, int code, int status) { case SOCKET_START_POST: if (success) - socket_set_state(s, SOCKET_LISTENING); + socket_enter_listening(s); else socket_enter_stop_pre(s, false); break; @@ -764,6 +780,17 @@ int socket_collect_fds(Socket *s, int **fds, unsigned *n_fds) { return 0; } +void socket_notify_service_dead(Socket *s) { + assert(s); + + /* The service is dead. Dang. */ + + if (s->state == SOCKET_RUNNING) { + log_debug("%s got notified about service death.", unit_id(UNIT(s))); + socket_enter_listening(s); + } +} + const UnitVTable socket_vtable = { .suffix = ".socket",