]> git.ipfire.org Git - thirdparty/libvirt.git/commitdiff
rpc: allow creating RPC service from an array of FDs
authorDaniel P. Berrangé <berrange@redhat.com>
Tue, 25 Jun 2019 14:54:48 +0000 (15:54 +0100)
committerDaniel P. Berrangé <berrange@redhat.com>
Fri, 12 Jul 2019 15:55:39 +0000 (16:55 +0100)
The virNetServerServiceNewFD API only accepts a single FD, but it is
easily changed to allow for an array of FDs to be passed in.

Reviewed-by: Michal Privoznik <mprivozn@redhat.com>
Signed-off-by: Daniel P. Berrangé <berrange@redhat.com>
src/libvirt_remote.syms
src/locking/lock_daemon.c
src/logging/log_daemon.c
src/rpc/virnetserverservice.c
src/rpc/virnetserverservice.h

index 99fe3dd07c03d7875dee919a50eb4aec1abd87fa..f05f1827f03414a35a60ea2c7e004e5a68fa19e3 100644 (file)
@@ -202,8 +202,8 @@ virNetServerServiceGetMaxRequests;
 virNetServerServiceGetPort;
 virNetServerServiceGetTLSContext;
 virNetServerServiceIsReadonly;
-virNetServerServiceNewFD;
 virNetServerServiceNewFDOrUNIX;
+virNetServerServiceNewFDs;
 virNetServerServiceNewPostExecRestart;
 virNetServerServiceNewTCP;
 virNetServerServiceNewUNIX;
index bc2fb4a7fb1510bb96db11e2e42f7f7266adbc61..c10b2d383c6ffb8c8509c91fc6cb77d60bbc1c61 100644 (file)
@@ -597,6 +597,7 @@ virLockDaemonSetupNetworkingSystemD(virNetServerPtr lockSrv, virNetServerPtr adm
         virNetServerServicePtr svc;
         char *path = virGetUNIXSocketPath(3 + i);
         virNetServerPtr srv;
+        int fds[] = { 3 + i };
 
         if (!path)
             return -1;
@@ -616,9 +617,11 @@ virLockDaemonSetupNetworkingSystemD(virNetServerPtr lockSrv, virNetServerPtr adm
 
         /* Systemd passes FDs, starting immediately after stderr,
          * so the first FD we'll get is '3'. */
-        if (!(svc = virNetServerServiceNewFD(3 + i, 0,
-                                             NULL,
-                                             false, 0, 1)))
+        if (!(svc = virNetServerServiceNewFDs(fds,
+                                              ARRAY_CARDINALITY(fds),
+                                              0,
+                                              NULL,
+                                              false, 0, 1)))
             return -1;
 
         if (virNetServerAddService(srv, svc) < 0) {
index 014596b280c92195045a3bb7a1b0c842033d9403..65319993813df81274272598bd373ca5ea2fcf08 100644 (file)
@@ -532,6 +532,7 @@ virLogDaemonSetupNetworkingSystemD(virNetServerPtr logSrv, virNetServerPtr admin
         virNetServerServicePtr svc;
         char *path = virGetUNIXSocketPath(3 + i);
         virNetServerPtr srv;
+        int fds[] = { 3 + i };
 
         if (!path)
             return -1;
@@ -551,9 +552,11 @@ virLogDaemonSetupNetworkingSystemD(virNetServerPtr logSrv, virNetServerPtr admin
 
         /* Systemd passes FDs, starting immediately after stderr,
          * so the first FD we'll get is '3'. */
-        if (!(svc = virNetServerServiceNewFD(3 + i, 0,
-                                             NULL,
-                                             false, 0, 1)))
+        if (!(svc = virNetServerServiceNewFDs(fds,
+                                              ARRAY_CARDINALITY(fds),
+                                              0,
+                                              NULL,
+                                              false, 0, 1)))
             return -1;
 
         if (virNetServerAddService(srv, svc) < 0) {
index 69043ccc0e2056d69a83c4eb118cba28a49af7da..0d2f264696f169115da3026563cdaa9915725703 100644 (file)
@@ -112,18 +112,20 @@ virNetServerServiceNewFDOrUNIX(const char *path,
                                           nrequests_client_max);
 
     } else {
+        int fds[] = {(*cur_fd)++};
         /*
          * There's still enough file descriptors.  In this case we'll
          * use the current one and increment it afterwards. Take care
          * with order of operation for pointer arithmetic and auto
          * increment on cur_fd - the parentheses are necessary.
          */
-        return virNetServerServiceNewFD((*cur_fd)++,
-                                        auth,
-                                        tls,
-                                        readonly,
-                                        max_queued_clients,
-                                        nrequests_client_max);
+        return virNetServerServiceNewFDs(fds,
+                                         ARRAY_CARDINALITY(fds),
+                                         auth,
+                                         tls,
+                                         readonly,
+                                         max_queued_clients,
+                                         nrequests_client_max);
     }
 }
 
@@ -253,30 +255,39 @@ virNetServerServicePtr virNetServerServiceNewUNIX(const char *path,
     return svc;
 }
 
-virNetServerServicePtr virNetServerServiceNewFD(int fd,
-                                                int auth,
-                                                virNetTLSContextPtr tls,
-                                                bool readonly,
-                                                size_t max_queued_clients,
-                                                size_t nrequests_client_max)
+virNetServerServicePtr virNetServerServiceNewFDs(int *fds,
+                                                 size_t nfds,
+                                                 int auth,
+                                                 virNetTLSContextPtr tls,
+                                                 bool readonly,
+                                                 size_t max_queued_clients,
+                                                 size_t nrequests_client_max)
 {
-    virNetServerServicePtr svc;
-    virNetSocketPtr sock;
+    virNetServerServicePtr svc = NULL;
+    virNetSocketPtr *socks;
+    size_t i;
 
-    if (virNetSocketNewListenFD(fd,
-                                &sock) < 0)
-        return NULL;
+    if (VIR_ALLOC_N(socks, nfds) < 0)
+        goto cleanup;
 
-    svc = virNetServerServiceNewSocket(&sock,
-                                       1,
+    for (i = 0; i < nfds; i++) {
+        if (virNetSocketNewListenFD(fds[i],
+                                    &socks[i]) < 0)
+            goto cleanup;
+    }
+
+    svc = virNetServerServiceNewSocket(socks,
+                                       nfds,
                                        auth,
                                        tls,
                                        readonly,
                                        max_queued_clients,
                                        nrequests_client_max);
 
-    virObjectUnref(sock);
-
+ cleanup:
+    for (i = 0; i < nfds && socks; i++)
+        virObjectUnref(socks[i]);
+    VIR_FREE(socks);
     return svc;
 }
 
index 5dd22bd929f5862608a3a4513b2feca49a96b890..59ee51e5eebc2f2ab2e9265ea70e21b905d95dc7 100644 (file)
@@ -60,12 +60,13 @@ virNetServerServicePtr virNetServerServiceNewUNIX(const char *path,
                                                   bool readonly,
                                                   size_t max_queued_clients,
                                                   size_t nrequests_client_max);
-virNetServerServicePtr virNetServerServiceNewFD(int fd,
-                                                int auth,
-                                                virNetTLSContextPtr tls,
-                                                bool readonly,
-                                                size_t max_queued_clients,
-                                                size_t nrequests_client_max);
+virNetServerServicePtr virNetServerServiceNewFDs(int *fd,
+                                                 size_t nfds,
+                                                 int auth,
+                                                 virNetTLSContextPtr tls,
+                                                 bool readonly,
+                                                 size_t max_queued_clients,
+                                                 size_t nrequests_client_max);
 
 virNetServerServicePtr virNetServerServiceNewPostExecRestart(virJSONValuePtr object);