chiark / gitweb /
properly implement target unit
[elogind.git] / socket.c
index fb622a667fe34e46ba6b62103f60ffb386f20def..68a4d812d6f6956b989a762ca36c9b17071084b5 100644 (file)
--- 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",