[libvirt] [PATCH 04/23] Change interaction when accepting new RPC client connections

Daniel P. Berrange berrange at redhat.com
Thu Aug 9 15:20:09 UTC 2012


From: "Daniel P. Berrange" <berrange at redhat.com>

Currently the virNetServerServicePtr is responsible for
creating the virNetServerClientPtr instance when accepting
a new connection. Change this so that the virNetServerServicePtr
merely gives virNetServerPtr a virNetSocketPtr instance. The
virNetServerPtr can then create the virNetServerClientPtr
as it desires

Signed-off-by: Daniel P. Berrange <berrange at redhat.com>
---
 src/libvirt_private.syms      |  4 ++--
 src/rpc/virnetserver.c        | 14 ++++++++++++--
 src/rpc/virnetserverclient.c  |  4 +---
 src/rpc/virnetserverservice.c | 38 +++++++++++++++-----------------------
 src/rpc/virnetserverservice.h |  4 +++-
 5 files changed, 33 insertions(+), 31 deletions(-)

diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms
index 3a23fe6..e3d31dc 100644
--- a/src/libvirt_private.syms
+++ b/src/libvirt_private.syms
@@ -1487,8 +1487,6 @@ virNetServerKeepAliveRequired;
 virNetServerNew;
 virNetServerQuit;
 virNetServerRun;
-virNetServerServiceNewTCP;
-virNetServerServiceNewUNIX;
 virNetServerSetTLSContext;
 virNetServerUpdateServices;
 
@@ -1553,7 +1551,9 @@ virNetServerProgramUnknownError;
 # virnetserverservice.h
 virNetServerServiceClose;
 virNetServerServiceGetAuth;
+virNetServerServiceGetMaxRequests;
 virNetServerServiceGetPort;
+virNetServerServiceGetTLSContext;
 virNetServerServiceIsReadonly;
 virNetServerServiceNewTCP;
 virNetServerServiceNewUNIX;
diff --git a/src/rpc/virnetserver.c b/src/rpc/virnetserver.c
index 15abb56..c3eb2e5 100644
--- a/src/rpc/virnetserver.c
+++ b/src/rpc/virnetserver.c
@@ -261,11 +261,12 @@ cleanup:
 }
 
 
-static int virNetServerDispatchNewClient(virNetServerServicePtr svc ATTRIBUTE_UNUSED,
-                                         virNetServerClientPtr client,
+static int virNetServerDispatchNewClient(virNetServerServicePtr svc,
+                                         virNetSocketPtr clientsock,
                                          void *opaque)
 {
     virNetServerPtr srv = opaque;
+    virNetServerClientPtr client = NULL;
 
     virNetServerLock(srv);
 
@@ -276,6 +277,13 @@ static int virNetServerDispatchNewClient(virNetServerServicePtr svc ATTRIBUTE_UN
         goto error;
     }
 
+    if (!(client = virNetServerClientNew(clientsock,
+                                         virNetServerServiceGetAuth(svc),
+                                         virNetServerServiceIsReadonly(svc),
+                                         virNetServerServiceGetMaxRequests(svc),
+                                         virNetServerServiceGetTLSContext(svc))))
+        goto error;
+
     if (virNetServerClientInit(client) < 0)
         goto error;
 
@@ -301,6 +309,8 @@ static int virNetServerDispatchNewClient(virNetServerServicePtr svc ATTRIBUTE_UN
     return 0;
 
 error:
+    virNetServerClientClose(client);
+    virObjectUnref(client);
     virNetServerUnlock(srv);
     return -1;
 }
diff --git a/src/rpc/virnetserverclient.c b/src/rpc/virnetserverclient.c
index d135b0f..9f033c8 100644
--- a/src/rpc/virnetserverclient.c
+++ b/src/rpc/virnetserverclient.c
@@ -357,7 +357,7 @@ virNetServerClientPtr virNetServerClientNew(virNetSocketPtr sock,
         return NULL;
     }
 
-    client->sock = sock;
+    client->sock = virObjectRef(sock);
     client->auth = auth;
     client->readonly = readonly;
     client->tlsCtxt = virObjectRef(tls);
@@ -385,8 +385,6 @@ virNetServerClientPtr virNetServerClientNew(virNetSocketPtr sock,
     return client;
 
 error:
-    /* XXX ref counting is better than this */
-    client->sock = NULL; /* Caller owns 'sock' upon failure */
     virObjectUnref(client);
     return NULL;
 }
diff --git a/src/rpc/virnetserverservice.c b/src/rpc/virnetserverservice.c
index 000b5b6..eda5ef9 100644
--- a/src/rpc/virnetserverservice.c
+++ b/src/rpc/virnetserverservice.c
@@ -69,40 +69,21 @@ static void virNetServerServiceAccept(virNetSocketPtr sock,
                                       void *opaque)
 {
     virNetServerServicePtr svc = opaque;
-    virNetServerClientPtr client = NULL;
     virNetSocketPtr clientsock = NULL;
 
     if (virNetSocketAccept(sock, &clientsock) < 0)
-        goto error;
+        goto cleanup;
 
     if (!clientsock) /* Connection already went away */
         goto cleanup;
 
-    if (!(client = virNetServerClientNew(clientsock,
-                                         svc->auth,
-                                         svc->readonly,
-                                         svc->nrequests_client_max,
-                                         svc->tls)))
-        goto error;
-
     if (!svc->dispatchFunc)
-        goto error;
-
-    if (svc->dispatchFunc(svc, client, svc->dispatchOpaque) < 0)
-        virNetServerClientClose(client);
+        goto cleanup;
 
-    virObjectUnref(client);
+    svc->dispatchFunc(svc, clientsock, svc->dispatchOpaque);
 
 cleanup:
-    return;
-
-error:
-    if (client) {
-        virNetServerClientClose(client);
-        virObjectUnref(client);
-    } else {
-        virObjectUnref(clientsock);
-    }
+    virObjectUnref(clientsock);
 }
 
 
@@ -240,6 +221,17 @@ bool virNetServerServiceIsReadonly(virNetServerServicePtr svc)
 }
 
 
+size_t virNetServerServiceGetMaxRequests(virNetServerServicePtr svc)
+{
+    return svc->nrequests_client_max;
+}
+
+virNetTLSContextPtr virNetServerServiceGetTLSContext(virNetServerServicePtr svc)
+{
+    return svc->tls;
+}
+
+
 void virNetServerServiceSetDispatcher(virNetServerServicePtr svc,
                                       virNetServerServiceDispatchFunc func,
                                       void *opaque)
diff --git a/src/rpc/virnetserverservice.h b/src/rpc/virnetserverservice.h
index 98fd396..cb18e2d 100644
--- a/src/rpc/virnetserverservice.h
+++ b/src/rpc/virnetserverservice.h
@@ -34,7 +34,7 @@ enum {
 };
 
 typedef int (*virNetServerServiceDispatchFunc)(virNetServerServicePtr svc,
-                                               virNetServerClientPtr client,
+                                               virNetSocketPtr sock,
                                                void *opaque);
 
 virNetServerServicePtr virNetServerServiceNewTCP(const char *nodename,
@@ -55,6 +55,8 @@ int virNetServerServiceGetPort(virNetServerServicePtr svc);
 
 int virNetServerServiceGetAuth(virNetServerServicePtr svc);
 bool virNetServerServiceIsReadonly(virNetServerServicePtr svc);
+size_t virNetServerServiceGetMaxRequests(virNetServerServicePtr svc);
+virNetTLSContextPtr virNetServerServiceGetTLSContext(virNetServerServicePtr svc);
 
 void virNetServerServiceSetDispatcher(virNetServerServicePtr svc,
                                       virNetServerServiceDispatchFunc func,
-- 
1.7.11.2




More information about the libvir-list mailing list