]> xenbits.xensource.com Git - libvirt.git/commitdiff
Turn virNetSASLContext and virNetSASLSession into virObject instances
authorDaniel P. Berrange <berrange@redhat.com>
Wed, 11 Jul 2012 13:35:49 +0000 (14:35 +0100)
committerDaniel P. Berrange <berrange@redhat.com>
Tue, 7 Aug 2012 10:47:41 +0000 (11:47 +0100)
Make virNetSASLContext and virNetSASLSession use virObject APIs
for reference counting

Signed-off-by: Daniel P. Berrange <berrange@redhat.com>
cfg.mk
daemon/remote.c
src/libvirt_private.syms
src/libvirt_sasl.syms
src/remote/remote_driver.c
src/rpc/virnetclient.c
src/rpc/virnetsaslcontext.c
src/rpc/virnetsaslcontext.h
src/rpc/virnetserverclient.c
src/rpc/virnetsocket.c

diff --git a/cfg.mk b/cfg.mk
index 9ba0d665752ea6b4c243a9beeccc82f35dde9805..dc39646ead213842fa0ad671b591d8eb58920f7b 100644 (file)
--- a/cfg.mk
+++ b/cfg.mk
@@ -156,8 +156,6 @@ useless_free_options =                              \
   --name=virNetServerProgramFree                \
   --name=virNetServerServiceFree                \
   --name=virNetSocketFree                       \
-  --name=virNetSASLContextFree                  \
-  --name=virNetSASLSessionFree                  \
   --name=virNWFilterDefFree                    \
   --name=virNWFilterEntryFree                  \
   --name=virNWFilterHashTableFree              \
index d25717c5ecb468a247b5ae97751cd42482af291b..832307e3565aa35593fc4507e6bad7de98e650c5 100644 (file)
@@ -2325,7 +2325,7 @@ authfail:
     PROBE(RPC_SERVER_CLIENT_AUTH_FAIL,
           "client=%p auth=%d",
           client, REMOTE_AUTH_SASL);
-    virNetSASLSessionFree(sasl);
+    virObjectUnref(sasl);
     virMutexUnlock(&priv->lock);
     return -1;
 }
@@ -2369,7 +2369,7 @@ remoteSASLFinish(virNetServerClientPtr client)
           "client=%p auth=%d identity=%s",
           client, REMOTE_AUTH_SASL, identity);
 
-    virNetSASLSessionFree(priv->sasl);
+    virObjectUnref(priv->sasl);
     priv->sasl = NULL;
 
     return 0;
@@ -2467,7 +2467,7 @@ authdeny:
     goto error;
 
 error:
-    virNetSASLSessionFree(priv->sasl);
+    virObjectUnref(priv->sasl);
     priv->sasl = NULL;
     virResetLastError();
     virReportError(VIR_ERR_AUTH_FAILED, "%s",
@@ -2565,7 +2565,7 @@ authdeny:
     goto error;
 
 error:
-    virNetSASLSessionFree(priv->sasl);
+    virObjectUnref(priv->sasl);
     priv->sasl = NULL;
     virResetLastError();
     virReportError(VIR_ERR_AUTH_FAILED, "%s",
index acaa6f3c336c8b16d8750cd5fdf5844480ad340f..c0bb5a5945f1b6754c0c5dc8f834721a90882ed4 100644 (file)
@@ -1470,27 +1470,13 @@ xdr_virNetMessageError;
 
 
 # virnetsaslcontext.h
-virNetSASLContextCheckIdentity;
-virNetSASLContextFree;
 virNetSASLContextNewClient;
-virNetSASLContextNewServer;
-virNetSASLContextRef;
 virNetSASLSessionClientStart;
 virNetSASLSessionClientStep;
 virNetSASLSessionDecode;
 virNetSASLSessionEncode;
-virNetSASLSessionExtKeySize;
-virNetSASLSessionFree;
-virNetSASLSessionGetIdentity;
-virNetSASLSessionGetKeySize;
 virNetSASLSessionGetMaxBufSize;
-virNetSASLSessionListMechanisms;
 virNetSASLSessionNewClient;
-virNetSASLSessionNewServer;
-virNetSASLSessionRef;
-virNetSASLSessionSecProps;
-virNetSASLSessionServerStart;
-virNetSASLSessionServerStep;
 
 
 # virnetserver.h
@@ -1542,7 +1528,6 @@ virNetServerClientSetCloseHook;
 virNetServerClientSetDispatcher;
 virNetServerClientSetIdentity;
 virNetServerClientSetPrivateData;
-virNetServerClientSetSASLSession;
 virNetServerClientStartKeepAlive;
 virNetServerClientWantClose;
 
index 2c278c8b1326c1a90829043ede5bc23a91232c2c..cc46c0d9db9595536e593692090ced5ddd030761 100644 (file)
@@ -6,7 +6,6 @@
 virNetSASLContextCheckIdentity;
 virNetSASLContextNewServer;
 virNetSASLSessionExtKeySize;
-virNetSASLSessionFree;
 virNetSASLSessionGetIdentity;
 virNetSASLSessionGetKeySize;
 virNetSASLSessionListMechanisms;
index 511608063a51e90db9859afc5b49202c0f3edf17..38b11e1a3798a7a32886e5c444b88798660eb69c 100644 (file)
@@ -3397,8 +3397,8 @@ remoteAuthSASL (virConnectPtr conn, struct private_data *priv,
 
     remoteAuthInteractStateClear(&state, true);
     VIR_FREE(saslcb);
-    virNetSASLSessionFree(sasl);
-    virNetSASLContextFree(saslCtxt);
+    virObjectUnref(sasl);
+    virObjectUnref(saslCtxt);
 
     return ret;
 }
index 72f55a1a0f8ae7f912a0b33c1243b49b783ae496..58c80e2ba07fb61e63347efaeb07261efcf40c33 100644 (file)
@@ -497,7 +497,7 @@ void virNetClientFree(virNetClientPtr client)
     virNetSocketFree(client->sock);
     virObjectUnref(client->tls);
 #if HAVE_SASL
-    virNetSASLSessionFree(client->sasl);
+    virObjectUnref(client->sasl);
 #endif
 
     virNetMessageClear(&client->msg);
@@ -535,7 +535,7 @@ virNetClientCloseLocked(virNetClientPtr client)
     virObjectUnref(client->tls);
     client->tls = NULL;
 #if HAVE_SASL
-    virNetSASLSessionFree(client->sasl);
+    virObjectUnref(client->sasl);
     client->sasl = NULL;
 #endif
     ka = client->keepalive;
@@ -607,8 +607,7 @@ void virNetClientSetSASLSession(virNetClientPtr client,
                                 virNetSASLSessionPtr sasl)
 {
     virNetClientLock(client);
-    client->sasl = sasl;
-    virNetSASLSessionRef(sasl);
+    client->sasl = virObjectRef(sasl);
     virNetSocketSetSASLSession(client->sock, client->sasl);
     virNetClientUnlock(client);
 }
index af6e237064057ce91c4d4a906b29ebf9d727aae7..2feb9a92ecdd421abbe72033aeff1b0fb9c44e34 100644 (file)
 #define VIR_FROM_THIS VIR_FROM_RPC
 
 struct _virNetSASLContext {
+    virObject object;
+
     virMutex lock;
     const char *const*usernameWhitelist;
-    int refs;
 };
 
 struct _virNetSASLSession {
+    virObject object;
+
     virMutex lock;
     sasl_conn_t *conn;
-    int refs;
     size_t maxbufsize;
 };
 
 
+static virClassPtr virNetSASLContextClass;
+static virClassPtr virNetSASLSessionClass;
+static void virNetSASLContextDispose(void *obj);
+static void virNetSASLSessionDispose(void *obj);
+
+static int virNetSASLContextOnceInit(void)
+{
+    if (!(virNetSASLContextClass = virClassNew("virNetSASLContext",
+                                               sizeof(virNetSASLContext),
+                                               virNetSASLContextDispose)))
+        return -1;
+
+    if (!(virNetSASLSessionClass = virClassNew("virNetSASLSession",
+                                               sizeof(virNetSASLSession),
+                                               virNetSASLSessionDispose)))
+        return -1;
+
+    return 0;
+}
+
+VIR_ONCE_GLOBAL_INIT(virNetSASLContext)
+
+
 virNetSASLContextPtr virNetSASLContextNewClient(void)
 {
     virNetSASLContextPtr ctxt;
     int err;
 
+    if (virNetSASLContextInitialize() < 0)
+        return NULL;
+
     err = sasl_client_init(NULL);
     if (err != SASL_OK) {
         virReportError(VIR_ERR_AUTH_FAILED,
@@ -59,10 +87,8 @@ virNetSASLContextPtr virNetSASLContextNewClient(void)
         return NULL;
     }
 
-    if (VIR_ALLOC(ctxt) < 0) {
-        virReportOOMError();
+    if (!(ctxt = virObjectNew(virNetSASLContextClass)))
         return NULL;
-    }
 
     if (virMutexInit(&ctxt->lock) < 0) {
         virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
@@ -71,8 +97,6 @@ virNetSASLContextPtr virNetSASLContextNewClient(void)
         return NULL;
     }
 
-    ctxt->refs = 1;
-
     return ctxt;
 }
 
@@ -81,6 +105,9 @@ virNetSASLContextPtr virNetSASLContextNewServer(const char *const*usernameWhitel
     virNetSASLContextPtr ctxt;
     int err;
 
+    if (virNetSASLContextInitialize() < 0)
+        return NULL;
+
     err = sasl_server_init(NULL, "libvirt");
     if (err != SASL_OK) {
         virReportError(VIR_ERR_AUTH_FAILED,
@@ -89,10 +116,8 @@ virNetSASLContextPtr virNetSASLContextNewServer(const char *const*usernameWhitel
         return NULL;
     }
 
-    if (VIR_ALLOC(ctxt) < 0) {
-        virReportOOMError();
+    if (!(ctxt = virObjectNew(virNetSASLContextClass)))
         return NULL;
-    }
 
     if (virMutexInit(&ctxt->lock) < 0) {
         virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
@@ -102,7 +127,6 @@ virNetSASLContextPtr virNetSASLContextNewServer(const char *const*usernameWhitel
     }
 
     ctxt->usernameWhitelist = usernameWhitelist;
-    ctxt->refs = 1;
 
     return ctxt;
 }
@@ -152,28 +176,11 @@ cleanup:
 }
 
 
-void virNetSASLContextRef(virNetSASLContextPtr ctxt)
-{
-    virMutexLock(&ctxt->lock);
-    ctxt->refs++;
-    virMutexUnlock(&ctxt->lock);
-}
-
-void virNetSASLContextFree(virNetSASLContextPtr ctxt)
+void virNetSASLContextDispose(void *obj)
 {
-    if (!ctxt)
-        return;
-
-    virMutexLock(&ctxt->lock);
-    ctxt->refs--;
-    if (ctxt->refs > 0) {
-        virMutexUnlock(&ctxt->lock);
-        return;
-    }
+    virNetSASLContextPtr ctxt = obj;
 
-    virMutexUnlock(&ctxt->lock);
     virMutexDestroy(&ctxt->lock);
-    VIR_FREE(ctxt);
 }
 
 virNetSASLSessionPtr virNetSASLSessionNewClient(virNetSASLContextPtr ctxt ATTRIBUTE_UNUSED,
@@ -186,10 +193,8 @@ virNetSASLSessionPtr virNetSASLSessionNewClient(virNetSASLContextPtr ctxt ATTRIB
     virNetSASLSessionPtr sasl = NULL;
     int err;
 
-    if (VIR_ALLOC(sasl) < 0) {
-        virReportOOMError();
-        goto cleanup;
-    }
+    if (!(sasl = virObjectNew(virNetSASLSessionClass)))
+        return NULL;
 
     if (virMutexInit(&sasl->lock) < 0) {
         virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
@@ -198,7 +203,6 @@ virNetSASLSessionPtr virNetSASLSessionNewClient(virNetSASLContextPtr ctxt ATTRIB
         return NULL;
     }
 
-    sasl->refs = 1;
     /* Arbitrary size for amount of data we can encode in a single block */
     sasl->maxbufsize = 1 << 16;
 
@@ -219,7 +223,7 @@ virNetSASLSessionPtr virNetSASLSessionNewClient(virNetSASLContextPtr ctxt ATTRIB
     return sasl;
 
 cleanup:
-    virNetSASLSessionFree(sasl);
+    virObjectUnref(sasl);
     return NULL;
 }
 
@@ -231,10 +235,8 @@ virNetSASLSessionPtr virNetSASLSessionNewServer(virNetSASLContextPtr ctxt ATTRIB
     virNetSASLSessionPtr sasl = NULL;
     int err;
 
-    if (VIR_ALLOC(sasl) < 0) {
-        virReportOOMError();
-        goto cleanup;
-    }
+    if (!(sasl = virObjectNew(virNetSASLSessionClass)))
+        return NULL;
 
     if (virMutexInit(&sasl->lock) < 0) {
         virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
@@ -243,7 +245,6 @@ virNetSASLSessionPtr virNetSASLSessionNewServer(virNetSASLContextPtr ctxt ATTRIB
         return NULL;
     }
 
-    sasl->refs = 1;
     /* Arbitrary size for amount of data we can encode in a single block */
     sasl->maxbufsize = 1 << 16;
 
@@ -265,17 +266,10 @@ virNetSASLSessionPtr virNetSASLSessionNewServer(virNetSASLContextPtr ctxt ATTRIB
     return sasl;
 
 cleanup:
-    virNetSASLSessionFree(sasl);
+    virObjectUnref(sasl);
     return NULL;
 }
 
-void virNetSASLSessionRef(virNetSASLSessionPtr sasl)
-{
-    virMutexLock(&sasl->lock);
-    sasl->refs++;
-    virMutexUnlock(&sasl->lock);
-}
-
 int virNetSASLSessionExtKeySize(virNetSASLSessionPtr sasl,
                                 int ssf)
 {
@@ -712,22 +706,12 @@ cleanup:
     return ret;
 }
 
-void virNetSASLSessionFree(virNetSASLSessionPtr sasl)
+void virNetSASLSessionDispose(void *obj)
 {
-    if (!sasl)
-        return;
-
-    virMutexLock(&sasl->lock);
-    sasl->refs--;
-    if (sasl->refs > 0) {
-        virMutexUnlock(&sasl->lock);
-        return;
-    }
+    virNetSASLSessionPtr sasl = obj;
 
     if (sasl->conn)
         sasl_dispose(&sasl->conn);
 
-    virMutexUnlock(&sasl->lock);
     virMutexDestroy(&sasl->lock);
-    VIR_FREE(sasl);
 }
index 914c45cdf2a6f490d7ae45f8423def677e90f7a4..8e322d83fde2769bd9e65302433d72a220808c90 100644 (file)
@@ -24,6 +24,7 @@
 # include <sasl/sasl.h>
 
 # include "internal.h"
+# include "virobject.h"
 
 typedef struct _virNetSASLContext virNetSASLContext;
 typedef virNetSASLContext *virNetSASLContextPtr;
@@ -43,9 +44,6 @@ virNetSASLContextPtr virNetSASLContextNewServer(const char *const*usernameWhitel
 int virNetSASLContextCheckIdentity(virNetSASLContextPtr ctxt,
                                    const char *identity);
 
-void virNetSASLContextRef(virNetSASLContextPtr sasl);
-void virNetSASLContextFree(virNetSASLContextPtr sasl);
-
 virNetSASLSessionPtr virNetSASLSessionNewClient(virNetSASLContextPtr ctxt,
                                                 const char *service,
                                                 const char *hostname,
@@ -59,8 +57,6 @@ virNetSASLSessionPtr virNetSASLSessionNewServer(virNetSASLContextPtr ctxt,
 
 char *virNetSASLSessionListMechanisms(virNetSASLSessionPtr sasl);
 
-void virNetSASLSessionRef(virNetSASLSessionPtr sasl);
-
 int virNetSASLSessionExtKeySize(virNetSASLSessionPtr sasl,
                                 int ssf);
 
@@ -114,6 +110,4 @@ ssize_t virNetSASLSessionDecode(virNetSASLSessionPtr sasl,
                                 const char **output,
                                 size_t *outputlen);
 
-void virNetSASLSessionFree(virNetSASLSessionPtr sasl);
-
 #endif /* __VIR_NET_CLIENT_SASL_CONTEXT_H__ */
index c419e74e7b401129e6a34123ef58160b24296078..471cca0f8ebb178036daa1dd8f39d0abef5a894d 100644 (file)
@@ -474,8 +474,7 @@ void virNetServerClientSetSASLSession(virNetServerClientPtr client,
      * operation do we switch to SASL mode
      */
     virNetServerClientLock(client);
-    client->sasl = sasl;
-    virNetSASLSessionRef(sasl);
+    client->sasl = virObjectRef(sasl);
     virNetServerClientUnlock(client);
 }
 #endif
@@ -591,7 +590,7 @@ void virNetServerClientFree(virNetServerClientPtr client)
 
     VIR_FREE(client->identity);
 #if HAVE_SASL
-    virNetSASLSessionFree(client->sasl);
+    virObjectUnref(client->sasl);
 #endif
     if (client->sockTimer > 0)
         virEventRemoveTimeout(client->sockTimer);
@@ -1009,7 +1008,7 @@ virNetServerClientDispatchWrite(virNetServerClientPtr client)
              */
             if (client->sasl) {
                 virNetSocketSetSASLSession(client->sock, client->sasl);
-                virNetSASLSessionFree(client->sasl);
+                virObjectUnref(client->sasl);
                 client->sasl = NULL;
             }
 #endif
index bca78b5c6d6895307b50ecb4b17d756b1151ee9f..b6bb2116c3cd6e71cbaae4b6b7b5d504377f6563 100644 (file)
@@ -750,7 +750,7 @@ void virNetSocketFree(virNetSocketPtr sock)
         virNetTLSSessionSetIOCallbacks(sock->tlsSession, NULL, NULL, NULL);
     virObjectUnref(sock->tlsSession);
 #if HAVE_SASL
-    virNetSASLSessionFree(sock->saslSession);
+    virObjectUnref(sock->saslSession);
 #endif
 
     VIR_FORCE_CLOSE(sock->fd);
@@ -924,9 +924,8 @@ void virNetSocketSetSASLSession(virNetSocketPtr sock,
                                 virNetSASLSessionPtr sess)
 {
     virMutexLock(&sock->lock);
-    virNetSASLSessionFree(sock->saslSession);
-    sock->saslSession = sess;
-    virNetSASLSessionRef(sess);
+    virObjectUnref(sock->saslSession);
+    sock->saslSession = virObjectRef(sess);
     virMutexUnlock(&sock->lock);
 }
 #endif