[libvirt] [PATCH v2 4/9] admin: Move remote admin API version to a separate module

Erik Skultety eskultet at redhat.com
Fri Oct 16 18:12:21 UTC 2015


By moving the remote version into a separate module, we gain a slightly
better maintainability in the long run than just by leaving it in one
place with the existing libvirt-admin library which can start getting
pretty messy later on.
---
 src/admin/admin_remote.c | 136 +++++++++++++++++++++++++++++++++++++++++++++++
 src/libvirt-admin.c      | 115 +--------------------------------------
 2 files changed, 137 insertions(+), 114 deletions(-)
 create mode 100644 src/admin/admin_remote.c

diff --git a/src/admin/admin_remote.c b/src/admin/admin_remote.c
new file mode 100644
index 0000000..b8e6607
--- /dev/null
+++ b/src/admin/admin_remote.c
@@ -0,0 +1,136 @@
+/*
+ * admin_remote.c
+ *
+ * Copyright (C) 2015 Red Hat, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library.  If not, see
+ * <http://www.gnu.org/licenses/>.
+ *
+ * Author: Erik Skultety <eskultet at redhat.com>
+ */
+
+#include <config.h>
+#include <rpc/rpc.h>
+#include "admin_protocol.h"
+
+typedef struct _remoteAdminPriv remoteAdminPriv;
+typedef remoteAdminPriv *remoteAdminPrivPtr;
+
+struct _remoteAdminPriv {
+    virObjectLockable parent;
+
+    int counter;
+    virNetClientPtr client;
+    virNetClientProgramPtr program;
+};
+
+static virClassPtr remoteAdminPrivClass;
+
+static void
+remoteAdminPrivDispose(void *opaque)
+{
+    remoteAdminPrivPtr priv = opaque;
+
+    virObjectUnref(priv->program);
+    virObjectUnref(priv->client);
+}
+
+
+static int
+callFull(virAdmConnectPtr conn ATTRIBUTE_UNUSED,
+         remoteAdminPrivPtr priv,
+         int *fdin,
+         size_t fdinlen,
+         int **fdout,
+         size_t *fdoutlen,
+         int proc_nr,
+         xdrproc_t args_filter, char *args,
+         xdrproc_t ret_filter, char *ret)
+{
+    int rv;
+    virNetClientProgramPtr prog = priv->program;
+    int counter = priv->counter++;
+    virNetClientPtr client = priv->client;
+
+    /* Unlock, so that if we get any async events/stream data
+     * while processing the RPC, we don't deadlock when our
+     * callbacks for those are invoked
+     */
+    virObjectRef(priv);
+    virObjectUnlock(priv);
+
+    rv = virNetClientProgramCall(prog,
+                                 client,
+                                 counter,
+                                 proc_nr,
+                                 fdinlen, fdin,
+                                 fdoutlen, fdout,
+                                 args_filter, args,
+                                 ret_filter, ret);
+
+    virObjectLock(priv);
+    virObjectUnref(priv);
+
+    return rv;
+}
+
+static int
+call(virAdmConnectPtr conn,
+     unsigned int flags,
+     int proc_nr,
+     xdrproc_t args_filter, char *args,
+     xdrproc_t ret_filter, char *ret)
+{
+    virCheckFlags(0, -1);
+
+    return callFull(conn, conn->privateData,
+                    NULL, 0, NULL, NULL, proc_nr,
+                    args_filter, args, ret_filter, ret);
+}
+
+#include "admin_client.h"
+
+static void
+remoteAdminPrivFree(void *opaque)
+{
+    virAdmConnectPtr conn = opaque;
+
+    remoteAdminConnectClose(conn);
+    virObjectUnref(conn->privateData);
+}
+
+static remoteAdminPrivPtr
+remoteAdminPrivNew(const char *sock_path)
+{
+    remoteAdminPrivPtr priv = NULL;
+
+    if (!(priv = virObjectLockableNew(remoteAdminPrivClass)))
+        goto error;
+
+    if (!(priv->client = virNetClientNewUNIX(sock_path, false, NULL)))
+        goto error;
+
+    if (!(priv->program = virNetClientProgramNew(ADMIN_PROGRAM,
+                                                 ADMIN_PROTOCOL_VERSION,
+                                                 NULL, 0, NULL)))
+        goto error;
+
+    if (virNetClientAddProgram(priv->client, priv->program) < 0)
+        goto error;
+
+    return priv;
+ error:
+    virObjectUnref(priv);
+    return NULL;
+}
diff --git a/src/libvirt-admin.c b/src/libvirt-admin.c
index f0824dd..cdc712c 100644
--- a/src/libvirt-admin.c
+++ b/src/libvirt-admin.c
@@ -22,8 +22,6 @@
 
 #include <config.h>
 
-#include <rpc/rpc.h>
-
 #include "internal.h"
 #include "datatypes.h"
 #include "configmake.h"
@@ -44,121 +42,10 @@
 
 VIR_LOG_INIT("libvirt-admin");
 
-
-typedef struct _remoteAdminPriv remoteAdminPriv;
-typedef remoteAdminPriv *remoteAdminPrivPtr;
-
-struct _remoteAdminPriv {
-    virObjectLockable parent;
-
-    int counter;
-    virNetClientPtr client;
-    virNetClientProgramPtr program;
-};
-
-static virClassPtr remoteAdminPrivClass;
-
-static void
-remoteAdminPrivDispose(void *opaque)
-{
-    remoteAdminPrivPtr priv = opaque;
-
-    virObjectUnref(priv->program);
-    virObjectUnref(priv->client);
-}
-
-
-static int
-callFull(virAdmConnectPtr conn ATTRIBUTE_UNUSED,
-         remoteAdminPrivPtr priv,
-         int *fdin,
-         size_t fdinlen,
-         int **fdout,
-         size_t *fdoutlen,
-         int proc_nr,
-         xdrproc_t args_filter, char *args,
-         xdrproc_t ret_filter, char *ret)
-{
-    int rv;
-    virNetClientProgramPtr prog = priv->program;
-    int counter = priv->counter++;
-    virNetClientPtr client = priv->client;
-
-    /* Unlock, so that if we get any async events/stream data
-     * while processing the RPC, we don't deadlock when our
-     * callbacks for those are invoked
-     */
-    virObjectRef(priv);
-    virObjectUnlock(priv);
-
-    rv = virNetClientProgramCall(prog,
-                                 client,
-                                 counter,
-                                 proc_nr,
-                                 fdinlen, fdin,
-                                 fdoutlen, fdout,
-                                 args_filter, args,
-                                 ret_filter, ret);
-
-    virObjectLock(priv);
-    virObjectUnref(priv);
-
-    return rv;
-}
-
-static int
-call(virAdmConnectPtr conn,
-     unsigned int flags,
-     int proc_nr,
-     xdrproc_t args_filter, char *args,
-     xdrproc_t ret_filter, char *ret)
-{
-    virCheckFlags(0, -1);
-
-    return callFull(conn, conn->privateData,
-                    NULL, 0, NULL, NULL, proc_nr,
-                    args_filter, args, ret_filter, ret);
-}
-
-#include "admin_protocol.h"
-#include "admin_client.h"
-
 static bool virAdmGlobalError;
 static virOnceControl virAdmGlobalOnce = VIR_ONCE_CONTROL_INITIALIZER;
 
-static void
-remoteAdminPrivFree(void *opaque)
-{
-    virAdmConnectPtr conn = opaque;
-
-    remoteAdminConnectClose(conn);
-    virObjectUnref(conn->privateData);
-}
-
-static remoteAdminPrivPtr
-remoteAdminPrivNew(const char *sock_path)
-{
-    remoteAdminPrivPtr priv = NULL;
-
-    if (!(priv = virObjectLockableNew(remoteAdminPrivClass)))
-        goto error;
-
-    if (!(priv->client = virNetClientNewUNIX(sock_path, false, NULL)))
-        goto error;
-
-    if (!(priv->program = virNetClientProgramNew(ADMIN_PROGRAM,
-                                                 ADMIN_PROTOCOL_VERSION,
-                                                 NULL, 0, NULL)))
-        goto error;
-
-    if (virNetClientAddProgram(priv->client, priv->program) < 0)
-        goto error;
-
-    return priv;
- error:
-    virObjectUnref(priv);
-    return NULL;
-}
+#include "admin_remote.c"
 
 static void
 virAdmGlobalInit(void)
-- 
2.4.3




More information about the libvir-list mailing list