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(a)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;
Simple code movement, ACK, although I would just move the include so
that the virAdmGlobal* things are together. I have no idea why I had
them so far apart...
Martin