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@xxxxxxxxxx> + */ + +#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 -- libvir-list mailing list libvir-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/libvir-list