Add generic versions of the open and close functions and call them.
---
src/remote/remote_driver.c | 347 +++++++-------------------------------------
1 files changed, 51 insertions(+), 296 deletions(-)
diff --git a/src/remote/remote_driver.c b/src/remote/remote_driver.c
index 8dc71d6..777a7bf 100644
--- a/src/remote/remote_driver.c
+++ b/src/remote/remote_driver.c
@@ -3049,9 +3049,8 @@ done:
/*----------------------------------------------------------------------*/
static virDrvOpenStatus ATTRIBUTE_NONNULL (1)
-remoteNetworkOpen (virConnectPtr conn,
- virConnectAuthPtr auth,
- int flags)
+remoteGenericOpen(virConnectPtr conn, virConnectAuthPtr auth,
+ int flags, void **genericPrivateData)
{
if (inside_daemon)
return VIR_DRV_OPEN_DECLINED;
@@ -3060,45 +3059,48 @@ remoteNetworkOpen (virConnectPtr conn,
STREQ (conn->driver->name, "remote")) {
struct private_data *priv;
- /* If we're here, the remote driver is already
+ /* If we're here, the remote driver is already
* in use due to a) a QEMU uri, or b) a remote
- * URI. So we can re-use existing connection
- */
+ * URI. So we can re-use existing connection */
priv = conn->privateData;
remoteDriverLock(priv);
priv->localUses++;
- conn->networkPrivateData = priv;
+ *genericPrivateData = priv;
+ remoteDriverUnlock(priv);
+ return VIR_DRV_OPEN_SUCCESS;
+ } else if (conn->networkDriver &&
+ STREQ (conn->networkDriver->name, "remote")) {
+ struct private_data *priv = conn->networkPrivateData;
+ remoteDriverLock(priv);
+ *genericPrivateData = priv;
+ priv->localUses++;
remoteDriverUnlock(priv);
return VIR_DRV_OPEN_SUCCESS;
} else {
/* Using a non-remote driver, so we need to open a
* new connection for network APIs, forcing it to
* use the UNIX transport. This handles Xen driver
- * which doesn't have its own impl of the network APIs.
- */
+ * which doesn't have its own impl of the network APIs. */
struct private_data *priv;
int ret;
- ret = remoteOpenSecondaryDriver(conn,
- auth,
- flags,
- &priv);
+ ret = remoteOpenSecondaryDriver(conn, auth, flags, &priv);
if (ret == VIR_DRV_OPEN_SUCCESS)
- conn->networkPrivateData = priv;
+ *genericPrivateData = priv;
return ret;
}
}
static int
-remoteNetworkClose (virConnectPtr conn)
+remoteGenericClose(virConnectPtr conn, void **genericPrivateData)
{
int rv = 0;
- struct private_data *priv = conn->networkPrivateData;
+ struct private_data *priv = *genericPrivateData;
remoteDriverLock(priv);
priv->localUses--;
if (!priv->localUses) {
rv = doRemoteClose(conn, priv);
- conn->networkPrivateData = NULL;
+ *genericPrivateData = NULL;
remoteDriverUnlock(priv);
virMutexDestroy(&priv->lock);
VIR_FREE(priv);
@@ -3108,6 +3110,18 @@ remoteNetworkClose (virConnectPtr conn)
return rv;
}
+static virDrvOpenStatus ATTRIBUTE_NONNULL (1)
+remoteNetworkOpen(virConnectPtr conn, virConnectAuthPtr auth, int flags)
+{
+ return remoteGenericOpen(conn, auth, flags, &conn->networkPrivateData);
+}
+
+static int
+remoteNetworkClose(virConnectPtr conn)
+{
+ return remoteGenericClose(conn, &conn->networkPrivateData);
+}
+
static int
remoteListNetworks (virConnectPtr conn, char **const names, int maxnames)
{
@@ -3230,63 +3244,15 @@ done:
/*----------------------------------------------------------------------*/
static virDrvOpenStatus ATTRIBUTE_NONNULL (1)
-remoteInterfaceOpen (virConnectPtr conn,
- virConnectAuthPtr auth,
- int flags)
+remoteInterfaceOpen(virConnectPtr conn, virConnectAuthPtr auth, int flags)
{
- if (inside_daemon)
- return VIR_DRV_OPEN_DECLINED;
-
- if (conn->driver &&
- STREQ (conn->driver->name, "remote")) {
- struct private_data *priv;
-
- /* If we're here, the remote driver is already
- * in use due to a) a QEMU uri, or b) a remote
- * URI. So we can re-use existing connection
- */
- priv = conn->privateData;
- remoteDriverLock(priv);
- priv->localUses++;
- conn->interfacePrivateData = priv;
- remoteDriverUnlock(priv);
- return VIR_DRV_OPEN_SUCCESS;
- } else {
- /* Using a non-remote driver, so we need to open a
- * new connection for interface APIs, forcing it to
- * use the UNIX transport. This handles Xen driver
- * which doesn't have its own impl of the interface APIs.
- */
- struct private_data *priv;
- int ret;
- ret = remoteOpenSecondaryDriver(conn,
- auth,
- flags,
- &priv);
- if (ret == VIR_DRV_OPEN_SUCCESS)
- conn->interfacePrivateData = priv;
- return ret;
- }
+ return remoteGenericOpen(conn, auth, flags, &conn->interfacePrivateData);
}
static int
-remoteInterfaceClose (virConnectPtr conn)
+remoteInterfaceClose(virConnectPtr conn)
{
- int rv = 0;
- struct private_data *priv = conn->interfacePrivateData;
-
- remoteDriverLock(priv);
- priv->localUses--;
- if (!priv->localUses) {
- rv = doRemoteClose(conn, priv);
- conn->interfacePrivateData = NULL;
- remoteDriverUnlock(priv);
- virMutexDestroy(&priv->lock);
- VIR_FREE(priv);
- }
- if (priv)
- remoteDriverUnlock(priv);
- return rv;
+ return remoteGenericClose(conn, &conn->interfacePrivateData);
}
static int
@@ -3410,70 +3376,15 @@ done:
/*----------------------------------------------------------------------*/
static virDrvOpenStatus ATTRIBUTE_NONNULL (1)
-remoteStorageOpen (virConnectPtr conn,
- virConnectAuthPtr auth,
- int flags)
+remoteStorageOpen(virConnectPtr conn, virConnectAuthPtr auth, int flags)
{
- if (inside_daemon)
- return VIR_DRV_OPEN_DECLINED;
-
- if (conn->driver &&
- STREQ (conn->driver->name, "remote")) {
- struct private_data *priv = conn->privateData;
- /* If we're here, the remote driver is already
- * in use due to a) a QEMU uri, or b) a remote
- * URI. So we can re-use existing connection
- */
- remoteDriverLock(priv);
- priv->localUses++;
- conn->storagePrivateData = priv;
- remoteDriverUnlock(priv);
- return VIR_DRV_OPEN_SUCCESS;
- } else if (conn->networkDriver &&
- STREQ (conn->networkDriver->name, "remote")) {
- struct private_data *priv = conn->networkPrivateData;
- remoteDriverLock(priv);
- conn->storagePrivateData = priv;
- priv->localUses++;
- remoteDriverUnlock(priv);
- return VIR_DRV_OPEN_SUCCESS;
- } else {
- /* Using a non-remote driver, so we need to open a
- * new connection for network APIs, forcing it to
- * use the UNIX transport. This handles Xen driver
- * which doesn't have its own impl of the network APIs.
- */
- struct private_data *priv;
- int ret;
- ret = remoteOpenSecondaryDriver(conn,
- auth,
- flags,
- &priv);
- if (ret == VIR_DRV_OPEN_SUCCESS)
- conn->storagePrivateData = priv;
- return ret;
- }
+ return remoteGenericOpen(conn, auth, flags, &conn->storagePrivateData);
}
static int
-remoteStorageClose (virConnectPtr conn)
+remoteStorageClose(virConnectPtr conn)
{
- int ret = 0;
- struct private_data *priv = conn->storagePrivateData;
-
- remoteDriverLock(priv);
- priv->localUses--;
- if (!priv->localUses) {
- ret = doRemoteClose(conn, priv);
- conn->storagePrivateData = NULL;
- remoteDriverUnlock(priv);
- virMutexDestroy(&priv->lock);
- VIR_FREE(priv);
- }
- if (priv)
- remoteDriverUnlock(priv);
-
- return ret;
+ return remoteGenericClose(conn, &conn->storagePrivateData);
}
static int
@@ -3691,68 +3602,15 @@ done:
/*----------------------------------------------------------------------*/
static virDrvOpenStatus ATTRIBUTE_NONNULL (1)
-remoteDevMonOpen(virConnectPtr conn,
- virConnectAuthPtr auth ATTRIBUTE_UNUSED,
- int flags ATTRIBUTE_UNUSED)
+remoteDevMonOpen(virConnectPtr conn, virConnectAuthPtr auth, int flags)
{
- if (inside_daemon)
- return VIR_DRV_OPEN_DECLINED;
-
- if (conn->driver &&
- STREQ (conn->driver->name, "remote")) {
- struct private_data *priv = conn->privateData;
- /* If we're here, the remote driver is already
- * in use due to a) a QEMU uri, or b) a remote
- * URI. So we can re-use existing connection
- */
- remoteDriverLock(priv);
- priv->localUses++;
- conn->devMonPrivateData = priv;
- remoteDriverUnlock(priv);
- return VIR_DRV_OPEN_SUCCESS;
- } else if (conn->networkDriver &&
- STREQ (conn->networkDriver->name, "remote")) {
- struct private_data *priv = conn->networkPrivateData;
- remoteDriverLock(priv);
- conn->devMonPrivateData = priv;
- priv->localUses++;
- remoteDriverUnlock(priv);
- return VIR_DRV_OPEN_SUCCESS;
- } else {
- /* Using a non-remote driver, so we need to open a
- * new connection for network APIs, forcing it to
- * use the UNIX transport. This handles Xen driver
- * which doesn't have its own impl of the network APIs.
- */
- struct private_data *priv;
- int ret;
- ret = remoteOpenSecondaryDriver(conn,
- auth,
- flags,
- &priv);
- if (ret == VIR_DRV_OPEN_SUCCESS)
- conn->devMonPrivateData = priv;
- return ret;
- }
+ return remoteGenericOpen(conn, auth, flags, &conn->devMonPrivateData);
}
-static int remoteDevMonClose(virConnectPtr conn)
+static int
+remoteDevMonClose(virConnectPtr conn)
{
- int ret = 0;
- struct private_data *priv = conn->devMonPrivateData;
-
- remoteDriverLock(priv);
- priv->localUses--;
- if (!priv->localUses) {
- ret = doRemoteClose(conn, priv);
- conn->devMonPrivateData = NULL;
- remoteDriverUnlock(priv);
- virMutexDestroy(&priv->lock);
- VIR_FREE(priv);
- }
- if (priv)
- remoteDriverUnlock(priv);
- return ret;
+ return remoteGenericClose(conn, &conn->devMonPrivateData);
}
static int remoteNodeListDevices(virConnectPtr conn,
@@ -3976,63 +3834,15 @@ done:
/* ------------------------------------------------------------- */
static virDrvOpenStatus ATTRIBUTE_NONNULL (1)
-remoteNWFilterOpen (virConnectPtr conn,
- virConnectAuthPtr auth,
- int flags)
+remoteNWFilterOpen(virConnectPtr conn, virConnectAuthPtr auth, int flags)
{
- if (inside_daemon)
- return VIR_DRV_OPEN_DECLINED;
-
- if (conn->driver &&
- STREQ (conn->driver->name, "remote")) {
- struct private_data *priv;
-
- /* If we're here, the remote driver is already
- * in use due to a) a QEMU uri, or b) a remote
- * URI. So we can re-use existing connection
- */
- priv = conn->privateData;
- remoteDriverLock(priv);
- priv->localUses++;
- conn->nwfilterPrivateData = priv;
- remoteDriverUnlock(priv);
- return VIR_DRV_OPEN_SUCCESS;
- } else {
- /* Using a non-remote driver, so we need to open a
- * new connection for network filtering APIs, forcing it to
- * use the UNIX transport. This handles Xen driver
- * which doesn't have its own impl of the network filtering APIs.
- */
- struct private_data *priv;
- int ret;
- ret = remoteOpenSecondaryDriver(conn,
- auth,
- flags,
- &priv);
- if (ret == VIR_DRV_OPEN_SUCCESS)
- conn->nwfilterPrivateData = priv;
- return ret;
- }
+ return remoteGenericOpen(conn, auth, flags, &conn->nwfilterPrivateData);
}
static int
-remoteNWFilterClose (virConnectPtr conn)
+remoteNWFilterClose(virConnectPtr conn)
{
- int rv = 0;
- struct private_data *priv = conn->nwfilterPrivateData;
-
- remoteDriverLock(priv);
- priv->localUses--;
- if (!priv->localUses) {
- rv = doRemoteClose(conn, priv);
- conn->nwfilterPrivateData = NULL;
- remoteDriverUnlock(priv);
- virMutexDestroy(&priv->lock);
- VIR_FREE(priv);
- }
- if (priv)
- remoteDriverUnlock(priv);
- return rv;
+ return remoteGenericClose(conn, &conn->nwfilterPrivateData);
}
static virNWFilterPtr
@@ -5116,70 +4926,15 @@ no_memory:
static virDrvOpenStatus ATTRIBUTE_NONNULL (1)
-remoteSecretOpen (virConnectPtr conn,
- virConnectAuthPtr auth,
- int flags)
+remoteSecretOpen(virConnectPtr conn, virConnectAuthPtr auth, int flags)
{
- if (inside_daemon)
- return VIR_DRV_OPEN_DECLINED;
-
- if (conn->driver &&
- STREQ (conn->driver->name, "remote")) {
- struct private_data *priv;
-
- /* If we're here, the remote driver is already
- * in use due to a) a QEMU uri, or b) a remote
- * URI. So we can re-use existing connection
- */
- priv = conn->privateData;
- remoteDriverLock(priv);
- priv->localUses++;
- conn->secretPrivateData = priv;
- remoteDriverUnlock(priv);
- return VIR_DRV_OPEN_SUCCESS;
- } else if (conn->networkDriver &&
- STREQ (conn->networkDriver->name, "remote")) {
- struct private_data *priv = conn->networkPrivateData;
- remoteDriverLock(priv);
- conn->secretPrivateData = priv;
- priv->localUses++;
- remoteDriverUnlock(priv);
- return VIR_DRV_OPEN_SUCCESS;
- } else {
- /* Using a non-remote driver, so we need to open a
- * new connection for secret APIs, forcing it to
- * use the UNIX transport.
- */
- struct private_data *priv;
- int ret;
- ret = remoteOpenSecondaryDriver(conn,
- auth,
- flags,
- &priv);
- if (ret == VIR_DRV_OPEN_SUCCESS)
- conn->secretPrivateData = priv;
- return ret;
- }
+ return remoteGenericOpen(conn, auth, flags, &conn->secretPrivateData);
}
static int
remoteSecretClose (virConnectPtr conn)
{
- int rv = 0;
- struct private_data *priv = conn->secretPrivateData;
-
- conn->secretPrivateData = NULL;
- remoteDriverLock(priv);
- priv->localUses--;
- if (!priv->localUses) {
- rv = doRemoteClose(conn, priv);
- remoteDriverUnlock(priv);
- virMutexDestroy(&priv->lock);
- VIR_FREE(priv);
- }
- if (priv)
- remoteDriverUnlock(priv);
- return rv;
+ return remoteGenericClose(conn, &conn->secretPrivateData);
}
static int
--
1.7.0.4