chiark / gitweb /
unit: include peer identity in description of per-connection socket-activated services
[elogind.git] / src / core / service.c
index 4eb3d9e6688d1ff4990dc30a08d424f8001b2135..8097e26b0034bac306813b92d4e26815ad8e7d6d 100644 (file)
@@ -3656,6 +3656,8 @@ static void service_bus_name_owner_change(
 }
 
 int service_set_socket_fd(Service *s, int fd, Socket *sock) {
 }
 
 int service_set_socket_fd(Service *s, int fd, Socket *sock) {
+        _cleanup_free_ char *peer = NULL;
+        int r;
 
         assert(s);
         assert(fd >= 0);
 
         assert(s);
         assert(fd >= 0);
@@ -3673,6 +3675,23 @@ int service_set_socket_fd(Service *s, int fd, Socket *sock) {
         if (s->state != SERVICE_DEAD)
                 return -EAGAIN;
 
         if (s->state != SERVICE_DEAD)
                 return -EAGAIN;
 
+        if (getpeername_pretty(fd, &peer) >= 0) {
+
+                if (UNIT(s)->description) {
+                        _cleanup_free_ char *a;
+
+                        a = strjoin(UNIT(s)->description, " (", peer, ")", NULL);
+                        if (!a)
+                                return -ENOMEM;
+
+                        r = unit_set_description(UNIT(s), a);
+                }  else
+                        r = unit_set_description(UNIT(s), peer);
+
+                if (r < 0)
+                        return r;
+        }
+
         s->socket_fd = fd;
 
         unit_ref_set(&s->accept_socket, UNIT(sock));
         s->socket_fd = fd;
 
         unit_ref_set(&s->accept_socket, UNIT(sock));