From 05d0b98b5c929e0e9519a705e801a603576dc98b Mon Sep 17 00:00:00 2001 From: Thorsten Kukuk Date: Fri, 20 Dec 2024 11:46:01 +0100 Subject: [PATCH] wtmpdbd: enable to start via sockets --- src/wtmpdbd.c | 83 +++++++++++++++++++++++++++++++------ units/wtmpdbd-reader.socket | 4 +- units/wtmpdbd-writer.socket | 2 +- units/wtmpdbd.service | 2 +- 4 files changed, 74 insertions(+), 17 deletions(-) diff --git a/src/wtmpdbd.c b/src/wtmpdbd.c index 8daf7e5..e42491c 100644 --- a/src/wtmpdbd.c +++ b/src/wtmpdbd.c @@ -488,6 +488,47 @@ announce_ready (void) } +static int +varlink_server_listen_name(sd_varlink_server *s, const char *fdname) { + char **names = NULL; + int r, n = 0; + + /* Adds all passed fds marked as "varlink" to our varlink server. These fds can either refer to a + * listening socket or to a connection socket. + * + * See https://varlink.org/#activation for the environment variables this is backed by and the + * recommended "varlink" identifier in $LISTEN_FDNAMES. */ + + r = sd_listen_fds_with_names(/* unset_environment= */ false, &names); + if (r < 0) + return r; + + for (int i = 0; i < r; i++) { + int b, fd; + socklen_t l = sizeof(b); + + if (strcmp(names[i], fdname) != 0) + continue; + + fd = SD_LISTEN_FDS_START + i; + + if (getsockopt(fd, SOL_SOCKET, SO_ACCEPTCONN, &b, &l) < 0) + return -errno; + + if (b) /* Listening socket? */ + r = sd_varlink_server_listen_fd(s, fd); + else /* Otherwise assume connection socket */ + r = sd_varlink_server_add_connection(s, fd, NULL); + if (r < 0) + return r; + + n++; + } + + return n; +} + + static int varlink_server_loop (sd_varlink_server *reader, sd_varlink_server *writer) { @@ -496,25 +537,46 @@ varlink_server_loop (sd_varlink_server *reader, sd_varlink_server *writer) r = sd_event_new (&event); if (r < 0) - return r; + { + log_msg (LOG_ERR, "Failed to create new event: %s", + strerror (-r)); + return r; + } sd_varlink_server_set_userdata (reader, event); sd_varlink_server_set_userdata (writer, event); r = sd_varlink_server_attach_event (reader, event, 0); if (r < 0) - return r; + { + log_msg (LOG_ERR, "Failed to attach varlink reader to event: %s", + strerror (-r)); + return r; + } r = sd_varlink_server_attach_event (writer, event, 0); if (r < 0) - return r; + { + log_msg (LOG_ERR, "Failed to attach varlink writer to event: %s", + strerror (-r)); + return r; + } - r = sd_varlink_server_listen_auto (reader); + r = varlink_server_listen_name (reader, "varlink-reader"); if (r < 0) - return r; - r = sd_varlink_server_listen_auto (writer); + { + log_msg (LOG_ERR, "Failed to listen to varlink reader events: %s", + strerror (-r)); + return r; + } + + r = varlink_server_listen_name (writer, "varlink-writer"); if (r < 0) - return r; + { + log_msg (LOG_ERR, "Failed to listen to varlink writer events: %s", + strerror (-r)); + return r; + } announce_ready(); @@ -623,12 +685,7 @@ run_varlink (void) } r = varlink_server_loop (varlink_reader, varlink_writer); - if (r < 0) - { - log_msg (LOG_ERR, "Failed to run Varlink event loop: %s", - strerror (-r)); - return r; - } + return r; return 0; } diff --git a/units/wtmpdbd-reader.socket b/units/wtmpdbd-reader.socket index a6b5323..44d4240 100644 --- a/units/wtmpdbd-reader.socket +++ b/units/wtmpdbd-reader.socket @@ -4,8 +4,8 @@ Documentation=man:wtmpdbd(8) [Socket] ListenStream=/run/wtmpdb/reader.socket -Service=wtmpdb.service -FileDescriptorName=varlink +Service=wtmpdbd.service +FileDescriptorName=varlink-reader SocketMode=0666 DirectoryMode=0755 diff --git a/units/wtmpdbd-writer.socket b/units/wtmpdbd-writer.socket index 22a2cfe..9545024 100644 --- a/units/wtmpdbd-writer.socket +++ b/units/wtmpdbd-writer.socket @@ -5,7 +5,7 @@ Documentation=man:wtmpdbd(8) [Socket] ListenStream=/run/wtmpdb/writer.socket Service=wtmpdbd.service -FileDescriptorName=varlink +FileDescriptorName=varlink-writer SocketMode=0600 DirectoryMode=0755 diff --git a/units/wtmpdbd.service b/units/wtmpdbd.service index 5a619c4..12d9b42 100644 --- a/units/wtmpdbd.service +++ b/units/wtmpdbd.service @@ -3,5 +3,5 @@ Description=wtmpdb daemon Documentation=man:wtmpdbd(8) [Service] -Type=Notify +Type=notify ExecStart=/usr/libexec/wtmpdbd -s