X-Git-Url: https://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?a=blobdiff_plain;f=socket.c;h=68a4d812d6f6956b989a762ca36c9b17071084b5;hb=c25fb0edbb8a1d4fc2e466a355e7d3e5ddeacd5e;hp=fb622a667fe34e46ba6b62103f60ffb386f20def;hpb=bd982a8baeabbaf4a09a382a64acc243ef7104c5;p=elogind.git diff --git a/socket.c b/socket.c index fb622a667..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); @@ -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",