[libvirt] [PATCH v2 16/19] logging: convert log daemon to use systemd activation APIs

Daniel P. Berrangé berrange at redhat.com
Thu Jul 11 14:07:39 UTC 2019


Using the new system activation APIs allows for simpler code setting up
the network services.

Signed-off-by: Daniel P. Berrangé <berrange at redhat.com>
---
 src/logging/log_daemon.c | 125 ++++++++++++---------------------------
 1 file changed, 37 insertions(+), 88 deletions(-)

diff --git a/src/logging/log_daemon.c b/src/logging/log_daemon.c
index 30c70a20dd..8df04dbab1 100644
--- a/src/logging/log_daemon.c
+++ b/src/logging/log_daemon.c
@@ -517,78 +517,6 @@ virLogDaemonSetupSignals(virNetDaemonPtr dmn)
 }
 
 
-static int
-virLogDaemonSetupNetworkingSystemD(virNetServerPtr logSrv, virNetServerPtr adminSrv)
-{
-    unsigned int nfds;
-    size_t i;
-
-    if ((nfds = virGetListenFDs()) == 0)
-        return 0;
-    if (nfds > 2)
-        VIR_DEBUG("Too many (%d) file descriptors from systemd", nfds);
-
-    for (i = 0; i < nfds && i < 2; i++) {
-        virNetServerServicePtr svc;
-        char *path = virGetUNIXSocketPath(3 + i);
-        virNetServerPtr srv;
-        int fds[] = { 3 + i };
-
-        if (!path)
-            return -1;
-
-        if (strstr(path, "virtlogd-admin-sock")) {
-            srv = adminSrv;
-        } else if (strstr(path, "virtlogd-sock")) {
-            srv = logSrv;
-        } else {
-            virReportError(VIR_ERR_INTERNAL_ERROR,
-                           _("Unknown UNIX socket %s passed in"),
-                           path);
-            VIR_FREE(path);
-            return -1;
-        }
-        VIR_FREE(path);
-
-        /* Systemd passes FDs, starting immediately after stderr,
-         * so the first FD we'll get is '3'. */
-        if (!(svc = virNetServerServiceNewFDs(fds,
-                                              ARRAY_CARDINALITY(fds),
-                                              false,
-                                              0,
-                                              NULL,
-                                              false, 0, 1)))
-            return -1;
-
-        if (virNetServerAddService(srv, svc) < 0) {
-            virObjectUnref(svc);
-            return -1;
-        }
-    }
-    return 1;
-}
-
-
-static int
-virLogDaemonSetupNetworkingNative(virNetServerPtr srv, const char *sock_path)
-{
-    virNetServerServicePtr svc;
-
-    VIR_DEBUG("Setting up networking natively");
-
-    if (!(svc = virNetServerServiceNewUNIX(sock_path, 0700, 0, 0,
-                                           NULL,
-                                           false, 0, 1)))
-        return -1;
-
-    if (virNetServerAddService(srv, svc) < 0) {
-        virObjectUnref(svc);
-        return -1;
-    }
-    return 0;
-}
-
-
 static void
 virLogDaemonClientFree(void *opaque)
 {
@@ -1129,6 +1057,12 @@ int main(int argc, char **argv) {
      * scratch if rv == 0
      */
     if (rv == 0) {
+        VIR_AUTOPTR(virSystemdActivation) act = NULL;
+        virSystemdActivationMap actmap[] = {
+            { .name = "virtlogd.socket", .family = AF_UNIX, .path = sock_file },
+            { .name = "virtlogd-admin.socket", .family = AF_UNIX, .path = admin_sock_file },
+        };
+
         if (godaemon) {
             char ebuf[1024];
 
@@ -1156,31 +1090,46 @@ int main(int argc, char **argv) {
             goto cleanup;
         }
 
+        if (virSystemdGetActivation(actmap,
+                                    ARRAY_CARDINALITY(actmap),
+                                    &act) < 0) {
+            ret = VIR_LOG_DAEMON_ERR_NETWORK;
+            goto cleanup;
+        }
+
         logSrv = virNetDaemonGetServer(logDaemon->dmn, "virtlogd");
         adminSrv = virNetDaemonGetServer(logDaemon->dmn, "admin");
-        if ((rv = virLogDaemonSetupNetworkingSystemD(logSrv, adminSrv)) < 0) {
+
+        if (virNetServerAddServiceUNIX(logSrv,
+                                       act, "virtlogd.socket",
+                                       sock_file, 0700, 0, 0,
+                                       NULL,
+                                       false, 0, 1) < 0) {
+            ret = VIR_LOG_DAEMON_ERR_NETWORK;
+            goto cleanup;
+        }
+        if (virNetServerAddServiceUNIX(adminSrv,
+                                       act, "virtlogd-admin.socket",
+                                       admin_sock_file, 0700, 0, 0,
+                                       NULL,
+                                       false, 0, 1) < 0) {
             ret = VIR_LOG_DAEMON_ERR_NETWORK;
             goto cleanup;
         }
 
-        /* Only do this, if systemd did not pass a FD */
-        if (rv == 0) {
-            if (virLogDaemonSetupNetworkingNative(logSrv, sock_file) < 0 ||
-                virLogDaemonSetupNetworkingNative(adminSrv, admin_sock_file) < 0) {
-                ret = VIR_LOG_DAEMON_ERR_NETWORK;
-                goto cleanup;
-            }
+        if (act &&
+            virSystemdActivationComplete(act) < 0) {
+            ret = VIR_LOG_DAEMON_ERR_NETWORK;
+            goto cleanup;
         }
-        virObjectUnref(logSrv);
-        virObjectUnref(adminSrv);
+    } else {
+        logSrv = virNetDaemonGetServer(logDaemon->dmn, "virtlogd");
+        /* If exec-restarting from old virtlogd, we won't have an
+         * admin server present */
+        if (virNetDaemonHasServer(logDaemon->dmn, "admin"))
+            adminSrv = virNetDaemonGetServer(logDaemon->dmn, "admin");
     }
 
-    logSrv = virNetDaemonGetServer(logDaemon->dmn, "virtlogd");
-    /* If exec-restarting from old virtlogd, we won't have an
-     * admin server present */
-    if (virNetDaemonHasServer(logDaemon->dmn, "admin"))
-        adminSrv = virNetDaemonGetServer(logDaemon->dmn, "admin");
-
     if (timeout != -1) {
         VIR_DEBUG("Registering shutdown timeout %d", timeout);
         virNetDaemonAutoShutdown(logDaemon->dmn,
-- 
2.21.0




More information about the libvir-list mailing list