]> xenbits.xensource.com Git - libvirt.git/commitdiff
admin: move admins server impl/dispatch into src/admin directory
authorDaniel P. Berrange <berrange@redhat.com>
Fri, 19 Jan 2018 11:30:31 +0000 (11:30 +0000)
committerDaniel P. Berrangé <berrange@redhat.com>
Wed, 31 Jan 2018 15:12:30 +0000 (15:12 +0000)
The admin server functionality is a generic concept that should be wired
up into all libvirt daemons, but is currently integrated with the
libvirtd code. Move it all into the src/admin directory to prepare for
broader reuse.

Signed-off-by: Daniel P. Berrange <berrange@redhat.com>
15 files changed:
.gitignore
cfg.mk
daemon/Makefile.am
daemon/admin.c [deleted file]
daemon/admin.h [deleted file]
daemon/admin_server.c [deleted file]
daemon/admin_server.h [deleted file]
daemon/libvirtd.c
daemon/libvirtd.h
po/POTFILES.in
src/Makefile.am
src/admin/admin_server.c [new file with mode: 0644]
src/admin/admin_server.h [new file with mode: 0644]
src/admin/admin_server_dispatch.c [new file with mode: 0644]
src/admin/admin_server_dispatch.h [new file with mode: 0644]

index e2eaff172499153c89d786b408d971355177c317..189116a3d01317683b524552c5b65f94125cec7d 100644 (file)
 /src/access/viraccessapicheckqemu.h
 /src/admin/admin_client.h
 /src/admin/admin_protocol.[ch]
+/src/admin/admin_server_dispatch_stubs.h
 /src/esx/*.generated.*
 /src/hyperv/*.generated.*
 /src/libvirt*.def
diff --git a/cfg.mk b/cfg.mk
index 5cdeb7c650805bbf822d322922ee6238fb8d169e..6011d9f6072aadc5d7ab087c4cae0b9be327bfc4 100644 (file)
--- a/cfg.mk
+++ b/cfg.mk
@@ -32,8 +32,9 @@ gnulib_dir = $(srcdir)/.gnulib
 # List of additional files that we want to pick up in our POTFILES.in
 # This is all gnulib files, as well as generated files for RPC code.
 generated_files = \
-  $(srcdir)/daemon/*_dispatch.h \
-  $(srcdir)/src/*/*_dispatch.h \
+  $(srcdir)/daemon/{lxc,qemu,remote}_dispatch.h \
+  $(srcdir)/src/*/{admin_server,log_daemon,lock_daemon}_dispatch_stubs.h \
+  $(srcdir)/src/lxc/{lxc_monitor,lxc_controller}_dispatch.h \
   $(srcdir)/src/remote/*_client_bodies.h \
   $(srcdir)/src/*/*_protocol.[ch] \
   $(srcdir)/gnulib/lib/*.[ch]
@@ -768,7 +769,7 @@ sc_prohibit_gettext_markup:
 # lower-level code must not include higher-level headers.
 cross_dirs=$(patsubst $(srcdir)/src/%.,%,$(wildcard $(srcdir)/src/*/.))
 cross_dirs_re=($(subst / ,/|,$(cross_dirs)))
-mid_dirs=access|conf|cpu|locking|logging|network|node_device|rpc|security|storage
+mid_dirs=access|admin|conf|cpu|locking|logging|network|node_device|rpc|security|storage
 sc_prohibit_cross_inclusion:
        @for dir in $(cross_dirs); do \
          case $$dir in \
@@ -1119,7 +1120,7 @@ sc_po_check: \
                $(srcdir)/daemon/remote_dispatch.h \
                $(srcdir)/daemon/qemu_dispatch.h \
                $(srcdir)/src/remote/remote_client_bodies.h \
-               $(srcdir)/daemon/admin_dispatch.h \
+               $(srcdir)/src/admin/admin_server_dispatch_stubs.h \
                $(srcdir)/src/admin/admin_client.h
 $(srcdir)/daemon/remote_dispatch.h: $(srcdir)/src/remote/remote_protocol.x
        $(MAKE) -C daemon remote_dispatch.h
@@ -1127,8 +1128,8 @@ $(srcdir)/daemon/qemu_dispatch.h: $(srcdir)/src/remote/qemu_protocol.x
        $(MAKE) -C daemon qemu_dispatch.h
 $(srcdir)/src/remote/remote_client_bodies.h: $(srcdir)/src/remote/remote_protocol.x
        $(MAKE) -C src remote/remote_client_bodies.h
-$(srcdir)/daemon/admin_dispatch.h: $(srcdir)/src/admin/admin_protocol.x
-       $(MAKE) -C daemon admin_dispatch.h
+$(srcdir)/src/admin/admin_server_dispatch_stubs.h: $(srcdir)/src/admin/admin_protocol.x
+       $(MAKE) -C src admin/admin_server_dispatch_stubs.h
 $(srcdir)/src/admin/admin_client.h: $(srcdir)/src/admin/admin_protocol.x
        $(MAKE) -C src admin/admin_client.h
 
index b0c28d231360c804e34f8816d21b44916cfd838f..efd5ff19f519178052757c1bb25c84cdf3dc1f8c 100644 (file)
@@ -37,7 +37,6 @@ DAEMON_GENERATED = \
                remote_dispatch.h \
                lxc_dispatch.h \
                qemu_dispatch.h \
-               admin_dispatch.h \
                $(NULL)
 
 DAEMON_SOURCES = \
@@ -61,7 +60,6 @@ EXTRA_DIST = \
        remote_dispatch.h \
        lxc_dispatch.h \
        qemu_dispatch.h \
-       admin_dispatch.h \
        libvirtd.conf \
        libvirtd.init.in \
        libvirtd.upstart \
@@ -111,12 +109,6 @@ qemu_dispatch.h: $(top_srcdir)/src/rpc/gendispatch.pl \
          --mode=server qemu QEMU $(QEMU_PROTOCOL) \
          > $(srcdir)/qemu_dispatch.h
 
-admin_dispatch.h: $(top_srcdir)/src/rpc/gendispatch.pl \
-               $(ADMIN_PROTOCOL)
-       $(AM_V_GEN)$(PERL) -w $(top_srcdir)/src/rpc/gendispatch.pl \
-         --mode=server admin ADMIN $(ADMIN_PROTOCOL) \
-         > $(srcdir)/admin_dispatch.h
-
 if WITH_LIBVIRTD
 
 # Build a convenience library, for reuse in tests/libvirtdconftest
@@ -136,27 +128,6 @@ libvirtd_conf_la_LDFLAGS = \
        $(NULL)
 libvirtd_conf_la_LIBADD = $(LIBXML_LIBS)
 
-noinst_LTLIBRARIES += libvirtd_admin.la
-libvirtd_admin_la_SOURCES = \
-               admin.c admin.h admin_server.c admin_server.h
-
-libvirtd_admin_la_CFLAGS = \
-               $(AM_CFLAGS) \
-               $(XDR_CFLAGS) \
-               $(PIE_CFLAGS) \
-               $(WARN_CFLAGS) \
-               $(LIBXML_CFLAGS) \
-               $(COVERAGE_CFLAGS) \
-               $(NULL)
-libvirtd_admin_la_LDFLAGS = \
-               $(PIE_LDFLAGS) \
-               $(RELRO_LDFLAGS) \
-               $(COVERAGE_LDFLAGS) \
-               $(NO_INDIRECT_LDFLAGS) \
-               $(NULL)
-libvirtd_admin_la_LIBADD = \
-               ../src/libvirt-admin.la
-
 man8_MANS = libvirtd.8
 
 sbin_PROGRAMS = libvirtd
@@ -202,7 +173,7 @@ endif WITH_DTRACE_PROBES
 
 libvirtd_LDADD += \
        libvirtd_conf.la \
-       libvirtd_admin.la \
+       ../src/libvirt_driver_admin.la \
        ../src/libvirt-lxc.la \
        ../src/libvirt-qemu.la \
        ../src/libvirt_driver_remote.la \
@@ -269,8 +240,6 @@ endif ! WITH_POLKIT
 
 remote.c: $(DAEMON_GENERATED)
 remote.h: $(DAEMON_GENERATED)
-admin.c: $(DAEMON_GENERATED)
-admin.h: $(DAEMON_GENERATED)
 
 LOGROTATE_CONFS = libvirtd.qemu.logrotate libvirtd.lxc.logrotate \
                  libvirtd.libxl.logrotate libvirtd.uml.logrotate \
diff --git a/daemon/admin.c b/daemon/admin.c
deleted file mode 100644 (file)
index baf310c..0000000
+++ /dev/null
@@ -1,490 +0,0 @@
-/*
- * admin.c: handlers for admin RPC method calls
- *
- * Copyright (C) 2014-2016 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: Martin Kletzander <mkletzan@redhat.com>
- */
-
-#include <config.h>
-
-#include "internal.h"
-#include "libvirtd.h"
-#include "libvirt_internal.h"
-
-#include "admin_protocol.h"
-#include "admin.h"
-#include "admin_server.h"
-#include "datatypes.h"
-#include "viralloc.h"
-#include "virerror.h"
-#include "virlog.h"
-#include "virnetdaemon.h"
-#include "virnetserver.h"
-#include "virstring.h"
-#include "virthreadjob.h"
-#include "virtypedparam.h"
-
-#define VIR_FROM_THIS VIR_FROM_ADMIN
-
-VIR_LOG_INIT("daemon.admin");
-
-
-void
-remoteAdmClientFreeFunc(void *data)
-{
-    struct daemonAdmClientPrivate *priv = data;
-
-    virMutexDestroy(&priv->lock);
-    virObjectUnref(priv->dmn);
-    VIR_FREE(priv);
-}
-
-void *
-remoteAdmClientInitHook(virNetServerClientPtr client ATTRIBUTE_UNUSED,
-                        void *opaque)
-{
-    struct daemonAdmClientPrivate *priv;
-
-    if (VIR_ALLOC(priv) < 0)
-        return NULL;
-
-    if (virMutexInit(&priv->lock) < 0) {
-        VIR_FREE(priv);
-        virReportSystemError(errno, "%s", _("unable to init mutex"));
-        return NULL;
-    }
-
-    /*
-     * We don't necessarily need to ref this object right now as there
-     * must be one ref being held throughout the life of the daemon,
-     * but let's just be safe for future.
-     */
-    priv->dmn = virObjectRef(opaque);
-
-    return priv;
-}
-
-/* Helpers */
-
-static virNetServerPtr
-get_nonnull_server(virNetDaemonPtr dmn, admin_nonnull_server srv)
-{
-    return virNetDaemonGetServer(dmn, srv.name);
-}
-
-static void
-make_nonnull_server(admin_nonnull_server *srv_dst,
-                    virNetServerPtr srv_src)
-{
-    ignore_value(VIR_STRDUP_QUIET(srv_dst->name, virNetServerGetName(srv_src)));
-}
-
-static virNetServerClientPtr
-get_nonnull_client(virNetServerPtr srv, admin_nonnull_client clnt)
-{
-    return virNetServerGetClient(srv, clnt.id);
-}
-
-static void
-make_nonnull_client(admin_nonnull_client *clt_dst,
-                    virNetServerClientPtr clt_src)
-{
-    clt_dst->id = virNetServerClientGetID(clt_src);
-    clt_dst->timestamp = virNetServerClientGetTimestamp(clt_src);
-    clt_dst->transport = virNetServerClientGetTransport(clt_src);
-}
-
-/* Functions */
-static int
-adminDispatchConnectOpen(virNetServerPtr server ATTRIBUTE_UNUSED,
-                         virNetServerClientPtr client,
-                         virNetMessagePtr msg ATTRIBUTE_UNUSED,
-                         virNetMessageErrorPtr rerr,
-                         struct admin_connect_open_args *args)
-{
-    unsigned int flags;
-    struct daemonAdmClientPrivate *priv =
-        virNetServerClientGetPrivateData(client);
-    int ret = -1;
-
-    VIR_DEBUG("priv=%p dmn=%p", priv, priv->dmn);
-    virMutexLock(&priv->lock);
-
-    flags = args->flags;
-    virCheckFlagsGoto(0, cleanup);
-
-    ret = 0;
- cleanup:
-    if (ret < 0)
-        virNetMessageSaveError(rerr);
-    virMutexUnlock(&priv->lock);
-    return ret;
-}
-
-static int
-adminDispatchConnectClose(virNetServerPtr server ATTRIBUTE_UNUSED,
-                          virNetServerClientPtr client,
-                          virNetMessagePtr msg ATTRIBUTE_UNUSED,
-                          virNetMessageErrorPtr rerr ATTRIBUTE_UNUSED)
-{
-    virNetServerClientDelayedClose(client);
-    return 0;
-}
-
-static int
-adminConnectGetLibVersion(virNetDaemonPtr dmn ATTRIBUTE_UNUSED,
-                          unsigned long long *libVer)
-{
-    if (libVer)
-        *libVer = LIBVIR_VERSION_NUMBER;
-    return 0;
-}
-
-static int
-adminDispatchServerGetThreadpoolParameters(virNetServerPtr server ATTRIBUTE_UNUSED,
-                                           virNetServerClientPtr client,
-                                           virNetMessagePtr msg ATTRIBUTE_UNUSED,
-                                           virNetMessageErrorPtr rerr,
-                                           struct admin_server_get_threadpool_parameters_args *args,
-                                           struct admin_server_get_threadpool_parameters_ret *ret)
-{
-    int rv = -1;
-    virNetServerPtr srv = NULL;
-    virTypedParameterPtr params = NULL;
-    int nparams = 0;
-    struct daemonAdmClientPrivate *priv =
-        virNetServerClientGetPrivateData(client);
-
-    if (!(srv = virNetDaemonGetServer(priv->dmn, args->srv.name)))
-        goto cleanup;
-
-    if (adminServerGetThreadPoolParameters(srv, &params, &nparams,
-                                           args->flags) < 0)
-        goto cleanup;
-
-    if (nparams > ADMIN_SERVER_THREADPOOL_PARAMETERS_MAX) {
-        virReportError(VIR_ERR_INTERNAL_ERROR,
-                       _("Number of threadpool parameters %d exceeds max "
-                         "allowed limit: %d"), nparams,
-                       ADMIN_SERVER_THREADPOOL_PARAMETERS_MAX);
-        goto cleanup;
-    }
-
-    if (virTypedParamsSerialize(params, nparams,
-                                (virTypedParameterRemotePtr *) &ret->params.params_val,
-                                &ret->params.params_len, 0) < 0)
-        goto cleanup;
-
-    rv = 0;
- cleanup:
-    if (rv < 0)
-        virNetMessageSaveError(rerr);
-
-    virTypedParamsFree(params, nparams);
-    virObjectUnref(srv);
-    return rv;
-}
-
-static int
-adminDispatchServerSetThreadpoolParameters(virNetServerPtr server ATTRIBUTE_UNUSED,
-                                           virNetServerClientPtr client,
-                                           virNetMessagePtr msg ATTRIBUTE_UNUSED,
-                                           virNetMessageErrorPtr rerr,
-                                           struct admin_server_set_threadpool_parameters_args *args)
-{
-    int rv = -1;
-    virNetServerPtr srv = NULL;
-    virTypedParameterPtr params = NULL;
-    int nparams = 0;
-    struct daemonAdmClientPrivate *priv =
-        virNetServerClientGetPrivateData(client);
-
-    if (!(srv = virNetDaemonGetServer(priv->dmn, args->srv.name))) {
-        virReportError(VIR_ERR_NO_SERVER,
-                       _("no server with matching name '%s' found"),
-                       args->srv.name);
-        goto cleanup;
-    }
-
-    if (virTypedParamsDeserialize((virTypedParameterRemotePtr) args->params.params_val,
-                                  args->params.params_len,
-                                  ADMIN_SERVER_THREADPOOL_PARAMETERS_MAX,
-                                  &params,
-                                  &nparams) < 0)
-        goto cleanup;
-
-
-    if (adminServerSetThreadPoolParameters(srv, params,
-                                           nparams, args->flags) < 0)
-        goto cleanup;
-
-    rv = 0;
- cleanup:
-    if (rv < 0)
-        virNetMessageSaveError(rerr);
-
-    virTypedParamsFree(params, nparams);
-    virObjectUnref(srv);
-    return rv;
-}
-
-static int
-adminDispatchClientGetInfo(virNetServerPtr server ATTRIBUTE_UNUSED,
-                           virNetServerClientPtr client,
-                           virNetMessagePtr msg ATTRIBUTE_UNUSED,
-                           virNetMessageErrorPtr rerr,
-                           struct admin_client_get_info_args *args,
-                           struct admin_client_get_info_ret *ret)
-{
-    int rv = -1;
-    virNetServerPtr srv = NULL;
-    virNetServerClientPtr clnt = NULL;
-    virTypedParameterPtr params = NULL;
-    int nparams = 0;
-    struct daemonAdmClientPrivate *priv =
-        virNetServerClientGetPrivateData(client);
-
-    if (!(srv = virNetDaemonGetServer(priv->dmn, args->clnt.srv.name))) {
-        virReportError(VIR_ERR_NO_SERVER,
-                       _("no server with matching name '%s' found"),
-                       args->clnt.srv.name);
-        goto cleanup;
-    }
-
-    if (!(clnt = virNetServerGetClient(srv, args->clnt.id))) {
-        virReportError(VIR_ERR_NO_CLIENT,
-                       _("no client with matching id '%llu' found"),
-                       (unsigned long long) args->clnt.id);
-        goto cleanup;
-    }
-
-    if (adminClientGetInfo(clnt, &params, &nparams, args->flags) < 0)
-        goto cleanup;
-
-    if (nparams > ADMIN_CLIENT_INFO_PARAMETERS_MAX) {
-        virReportError(VIR_ERR_INTERNAL_ERROR,
-                       _("Number of client info parameters %d exceeds max "
-                         "allowed limit: %d"), nparams,
-                       ADMIN_CLIENT_INFO_PARAMETERS_MAX);
-        goto cleanup;
-    }
-
-    if (virTypedParamsSerialize(params, nparams,
-                                (virTypedParameterRemotePtr *) &ret->params.params_val,
-                                &ret->params.params_len,
-                                VIR_TYPED_PARAM_STRING_OKAY) < 0)
-        goto cleanup;
-
-    rv = 0;
-
- cleanup:
-    if (rv < 0)
-        virNetMessageSaveError(rerr);
-
-    virTypedParamsFree(params, nparams);
-    virObjectUnref(clnt);
-    virObjectUnref(srv);
-    return rv;
-}
-
-static int
-adminDispatchServerGetClientLimits(virNetServerPtr server ATTRIBUTE_UNUSED,
-                                   virNetServerClientPtr client,
-                                   virNetMessagePtr msg ATTRIBUTE_UNUSED,
-                                   virNetMessageErrorPtr rerr ATTRIBUTE_UNUSED,
-                                   admin_server_get_client_limits_args *args,
-                                   admin_server_get_client_limits_ret *ret)
-{
-    int rv = -1;
-    virNetServerPtr srv = NULL;
-    virTypedParameterPtr params = NULL;
-    int nparams = 0;
-    struct daemonAdmClientPrivate *priv =
-        virNetServerClientGetPrivateData(client);
-
-    if (!(srv = virNetDaemonGetServer(priv->dmn, args->srv.name)))
-        goto cleanup;
-
-    if (adminServerGetClientLimits(srv, &params, &nparams, args->flags) < 0)
-        goto cleanup;
-
-    if (nparams > ADMIN_SERVER_CLIENT_LIMITS_MAX) {
-        virReportError(VIR_ERR_INTERNAL_ERROR,
-                       _("Number of client processing parameters %d exceeds "
-                         "max allowed limit: %d"), nparams,
-                       ADMIN_SERVER_CLIENT_LIMITS_MAX);
-        goto cleanup;
-    }
-
-    if (virTypedParamsSerialize(params, nparams,
-                                (virTypedParameterRemotePtr *) &ret->params.params_val,
-                                &ret->params.params_len, 0) < 0)
-        goto cleanup;
-
-    rv = 0;
- cleanup:
-    if (rv < 0)
-        virNetMessageSaveError(rerr);
-
-    virTypedParamsFree(params, nparams);
-    virObjectUnref(srv);
-    return rv;
-}
-
-static int
-adminDispatchServerSetClientLimits(virNetServerPtr server ATTRIBUTE_UNUSED,
-                                   virNetServerClientPtr client,
-                                   virNetMessagePtr msg ATTRIBUTE_UNUSED,
-                                   virNetMessageErrorPtr rerr ATTRIBUTE_UNUSED,
-                                   admin_server_set_client_limits_args *args)
-{
-    int rv = -1;
-    virNetServerPtr srv = NULL;
-    virTypedParameterPtr params = NULL;
-    int nparams = 0;
-    struct daemonAdmClientPrivate *priv =
-        virNetServerClientGetPrivateData(client);
-
-    if (!(srv = virNetDaemonGetServer(priv->dmn, args->srv.name))) {
-        virReportError(VIR_ERR_NO_SERVER,
-                       _("no server with matching name '%s' found"),
-                       args->srv.name);
-        goto cleanup;
-    }
-
-    if (virTypedParamsDeserialize((virTypedParameterRemotePtr) args->params.params_val,
-        args->params.params_len,
-        ADMIN_SERVER_CLIENT_LIMITS_MAX, &params, &nparams) < 0)
-        goto cleanup;
-
-    if (adminServerSetClientLimits(srv, params, nparams, args->flags) < 0)
-        goto cleanup;
-
-    rv = 0;
- cleanup:
-    if (rv < 0)
-        virNetMessageSaveError(rerr);
-    virTypedParamsFree(params, nparams);
-    virObjectUnref(srv);
-    return rv;
-}
-
-/* Returns the number of outputs stored in @outputs */
-static int
-adminConnectGetLoggingOutputs(char **outputs, unsigned int flags)
-{
-    char *tmp = NULL;
-
-    virCheckFlags(0, -1);
-
-    if (!(tmp = virLogGetOutputs()))
-        return -1;
-
-    *outputs = tmp;
-    return virLogGetNbOutputs();
-}
-
-/* Returns the number of defined filters or -1 in case of an error */
-static int
-adminConnectGetLoggingFilters(char **filters, unsigned int flags)
-{
-    char *tmp = NULL;
-    int ret = 0;
-
-    virCheckFlags(0, -1);
-
-    if ((ret = virLogGetNbFilters()) > 0 && !(tmp = virLogGetFilters()))
-        return -1;
-
-    *filters = tmp;
-    return ret;
-}
-
-static int
-adminConnectSetLoggingOutputs(virNetDaemonPtr dmn ATTRIBUTE_UNUSED,
-                              const char *outputs,
-                              unsigned int flags)
-{
-    virCheckFlags(0, -1);
-
-    return virLogSetOutputs(outputs);
-}
-
-static int
-adminConnectSetLoggingFilters(virNetDaemonPtr dmn ATTRIBUTE_UNUSED,
-                              const char *filters,
-                              unsigned int flags)
-{
-    virCheckFlags(0, -1);
-
-    return virLogSetFilters(filters);
-}
-
-static int
-adminDispatchConnectGetLoggingOutputs(virNetServerPtr server ATTRIBUTE_UNUSED,
-                                      virNetServerClientPtr client ATTRIBUTE_UNUSED,
-                                      virNetMessagePtr msg ATTRIBUTE_UNUSED,
-                                      virNetMessageErrorPtr rerr,
-                                      admin_connect_get_logging_outputs_args *args,
-                                      admin_connect_get_logging_outputs_ret *ret)
-{
-    char *outputs = NULL;
-    int noutputs = 0;
-
-    if ((noutputs = adminConnectGetLoggingOutputs(&outputs, args->flags)) < 0) {
-        virNetMessageSaveError(rerr);
-        return -1;
-    }
-
-    VIR_STEAL_PTR(ret->outputs, outputs);
-    ret->noutputs = noutputs;
-
-    return 0;
-}
-
-static int
-adminDispatchConnectGetLoggingFilters(virNetServerPtr server ATTRIBUTE_UNUSED,
-                                      virNetServerClientPtr client ATTRIBUTE_UNUSED,
-                                      virNetMessagePtr msg ATTRIBUTE_UNUSED,
-                                      virNetMessageErrorPtr rerr,
-                                      admin_connect_get_logging_filters_args *args,
-                                      admin_connect_get_logging_filters_ret *ret)
-{
-    char *filters = NULL;
-    int nfilters = 0;
-
-    if ((nfilters = adminConnectGetLoggingFilters(&filters, args->flags)) < 0) {
-        virNetMessageSaveError(rerr);
-        return -1;
-    }
-
-    if (nfilters == 0) {
-        ret->filters = NULL;
-    } else {
-        char **ret_filters = NULL;
-        if (VIR_ALLOC(ret_filters) < 0)
-            return -1;
-
-        *ret_filters = filters;
-        ret->filters = ret_filters;
-    }
-    ret->nfilters = nfilters;
-
-    return 0;
-}
-#include "admin_dispatch.h"
diff --git a/daemon/admin.h b/daemon/admin.h
deleted file mode 100644 (file)
index c869cc7..0000000
+++ /dev/null
@@ -1,36 +0,0 @@
-/*
- * admin.h: handlers for admin RPC method calls
- *
- * Copyright (C) 2014-2016 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: Martin Kletzander <mkletzan@redhat.com>
- */
-
-#ifndef __LIBVIRTD_ADMIN_H__
-# define __LIBVIRTD_ADMIN_H__
-
-# include "rpc/virnetserverprogram.h"
-# include "rpc/virnetserverclient.h"
-
-
-extern virNetServerProgramProc adminProcs[];
-extern size_t adminNProcs;
-
-void remoteAdmClientFreeFunc(void *data);
-void *remoteAdmClientInitHook(virNetServerClientPtr client, void *opaque);
-
-#endif /* __ADMIN_REMOTE_H__ */
diff --git a/daemon/admin_server.c b/daemon/admin_server.c
deleted file mode 100644 (file)
index d8a3323..0000000
+++ /dev/null
@@ -1,390 +0,0 @@
-/*
- * admin_server.c: admin methods to manage daemons and clients
- *
- * Copyright (C) 2016 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/>.
- *
- * Authors: Erik Skultety <eskultet@redhat.com>
- *          Martin Kletzander <mkletzan@redhat.com>
- */
-
-#include <config.h>
-
-#include "admin_server.h"
-#include "datatypes.h"
-#include "viralloc.h"
-#include "virerror.h"
-#include "viridentity.h"
-#include "virlog.h"
-#include "virnetdaemon.h"
-#include "virnetserver.h"
-#include "virstring.h"
-#include "virthreadpool.h"
-#include "virtypedparam.h"
-
-#define VIR_FROM_THIS VIR_FROM_ADMIN
-
-VIR_LOG_INIT("daemon.admin_server");
-
-int
-adminConnectListServers(virNetDaemonPtr dmn,
-                        virNetServerPtr **servers,
-                        unsigned int flags)
-{
-    int ret = -1;
-    virNetServerPtr *srvs = NULL;
-
-    virCheckFlags(0, -1);
-
-    if ((ret = virNetDaemonGetServers(dmn, &srvs)) < 0)
-        goto cleanup;
-
-    if (servers) {
-        *servers = srvs;
-        srvs = NULL;
-    }
- cleanup:
-    if (ret > 0)
-        virObjectListFreeCount(srvs, ret);
-    return ret;
-}
-
-virNetServerPtr
-adminConnectLookupServer(virNetDaemonPtr dmn,
-                         const char *name,
-                         unsigned int flags)
-{
-    virCheckFlags(flags, NULL);
-
-    return virNetDaemonGetServer(dmn, name);
-}
-
-int
-adminServerGetThreadPoolParameters(virNetServerPtr srv,
-                                   virTypedParameterPtr *params,
-                                   int *nparams,
-                                   unsigned int flags)
-{
-    int ret = -1;
-    int maxparams = 0;
-    size_t minWorkers;
-    size_t maxWorkers;
-    size_t nWorkers;
-    size_t freeWorkers;
-    size_t nPrioWorkers;
-    size_t jobQueueDepth;
-    virTypedParameterPtr tmpparams = NULL;
-
-    virCheckFlags(0, -1);
-
-    if (virNetServerGetThreadPoolParameters(srv, &minWorkers, &maxWorkers,
-                                            &nWorkers, &freeWorkers,
-                                            &nPrioWorkers,
-                                            &jobQueueDepth) < 0) {
-        virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
-                       _("Unable to retrieve threadpool parameters"));
-        goto cleanup;
-    }
-
-    if (virTypedParamsAddUInt(&tmpparams, nparams,
-                              &maxparams, VIR_THREADPOOL_WORKERS_MIN,
-                              minWorkers) < 0)
-        goto cleanup;
-
-    if (virTypedParamsAddUInt(&tmpparams, nparams,
-                              &maxparams, VIR_THREADPOOL_WORKERS_MAX,
-                              maxWorkers) < 0)
-        goto cleanup;
-
-    if (virTypedParamsAddUInt(&tmpparams, nparams,
-                              &maxparams, VIR_THREADPOOL_WORKERS_CURRENT,
-                              nWorkers) < 0)
-        goto cleanup;
-
-    if (virTypedParamsAddUInt(&tmpparams, nparams,
-                              &maxparams, VIR_THREADPOOL_WORKERS_FREE,
-                              freeWorkers) < 0)
-        goto cleanup;
-
-    if (virTypedParamsAddUInt(&tmpparams, nparams,
-                              &maxparams, VIR_THREADPOOL_WORKERS_PRIORITY,
-                              nPrioWorkers) < 0)
-        goto cleanup;
-
-    if (virTypedParamsAddUInt(&tmpparams, nparams,
-                              &maxparams, VIR_THREADPOOL_JOB_QUEUE_DEPTH,
-                              jobQueueDepth) < 0)
-        goto cleanup;
-
-    *params = tmpparams;
-    tmpparams = NULL;
-    ret = 0;
-
- cleanup:
-    virTypedParamsFree(tmpparams, *nparams);
-    return ret;
-}
-
-int
-adminServerSetThreadPoolParameters(virNetServerPtr srv,
-                                   virTypedParameterPtr params,
-                                   int nparams,
-                                   unsigned int flags)
-{
-    long long int minWorkers = -1;
-    long long int maxWorkers = -1;
-    long long int prioWorkers = -1;
-    virTypedParameterPtr param = NULL;
-
-    virCheckFlags(0, -1);
-
-    if (virTypedParamsValidate(params, nparams,
-                               VIR_THREADPOOL_WORKERS_MIN,
-                               VIR_TYPED_PARAM_UINT,
-                               VIR_THREADPOOL_WORKERS_MAX,
-                               VIR_TYPED_PARAM_UINT,
-                               VIR_THREADPOOL_WORKERS_PRIORITY,
-                               VIR_TYPED_PARAM_UINT,
-                               NULL) < 0)
-        return -1;
-
-    if ((param = virTypedParamsGet(params, nparams,
-                                   VIR_THREADPOOL_WORKERS_MIN)))
-        minWorkers = param->value.ui;
-
-    if ((param = virTypedParamsGet(params, nparams,
-                                   VIR_THREADPOOL_WORKERS_MAX)))
-        maxWorkers = param->value.ui;
-
-    if ((param = virTypedParamsGet(params, nparams,
-                                   VIR_THREADPOOL_WORKERS_PRIORITY)))
-        prioWorkers = param->value.ui;
-
-    if (virNetServerSetThreadPoolParameters(srv, minWorkers,
-                                            maxWorkers, prioWorkers) < 0)
-        return -1;
-
-    return 0;
-}
-
-int
-adminServerListClients(virNetServerPtr srv,
-                       virNetServerClientPtr **clients,
-                       unsigned int flags)
-{
-    int ret = -1;
-    virNetServerClientPtr *clts;
-
-    virCheckFlags(0, -1);
-
-    if ((ret = virNetServerGetClients(srv, &clts)) < 0)
-        return -1;
-
-    if (clients) {
-        *clients = clts;
-        clts = NULL;
-    }
-
-    virObjectListFreeCount(clts, ret);
-    return ret;
-}
-
-virNetServerClientPtr
-adminServerLookupClient(virNetServerPtr srv,
-                        unsigned long long id,
-                        unsigned int flags)
-{
-    virCheckFlags(0, NULL);
-
-    return virNetServerGetClient(srv, id);
-}
-
-int
-adminClientGetInfo(virNetServerClientPtr client,
-                   virTypedParameterPtr *params,
-                   int *nparams,
-                   unsigned int flags)
-{
-    int ret = -1;
-    int maxparams = 0;
-    bool readonly;
-    char *sock_addr = NULL;
-    const char *attr = NULL;
-    virTypedParameterPtr tmpparams = NULL;
-    virIdentityPtr identity = NULL;
-
-    virCheckFlags(0, -1);
-
-    if (virNetServerClientGetInfo(client, &readonly,
-                                  &sock_addr, &identity) < 0)
-        goto cleanup;
-
-    if (virTypedParamsAddBoolean(&tmpparams, nparams, &maxparams,
-                                 VIR_CLIENT_INFO_READONLY,
-                                 readonly) < 0)
-        goto cleanup;
-
-    if (virIdentityGetSASLUserName(identity, &attr) < 0 ||
-        (attr &&
-         virTypedParamsAddString(&tmpparams, nparams, &maxparams,
-                                 VIR_CLIENT_INFO_SASL_USER_NAME,
-                                 attr) < 0))
-        goto cleanup;
-
-    if (!virNetServerClientIsLocal(client)) {
-        if (virTypedParamsAddString(&tmpparams, nparams, &maxparams,
-                                    VIR_CLIENT_INFO_SOCKET_ADDR,
-                                    sock_addr) < 0)
-            goto cleanup;
-
-        if (virIdentityGetX509DName(identity, &attr) < 0 ||
-            (attr &&
-             virTypedParamsAddString(&tmpparams, nparams, &maxparams,
-                                     VIR_CLIENT_INFO_X509_DISTINGUISHED_NAME,
-                                     attr) < 0))
-            goto cleanup;
-    } else {
-        pid_t pid;
-        uid_t uid;
-        gid_t gid;
-        if (virIdentityGetUNIXUserID(identity, &uid) < 0 ||
-            virTypedParamsAddInt(&tmpparams, nparams, &maxparams,
-                                 VIR_CLIENT_INFO_UNIX_USER_ID, uid) < 0)
-            goto cleanup;
-
-        if (virIdentityGetUNIXUserName(identity, &attr) < 0 ||
-            virTypedParamsAddString(&tmpparams, nparams, &maxparams,
-                                    VIR_CLIENT_INFO_UNIX_USER_NAME,
-                                    attr) < 0)
-            goto cleanup;
-
-        if (virIdentityGetUNIXGroupID(identity, &gid) < 0 ||
-            virTypedParamsAddInt(&tmpparams, nparams, &maxparams,
-                                 VIR_CLIENT_INFO_UNIX_GROUP_ID, gid) < 0)
-            goto cleanup;
-
-        if (virIdentityGetUNIXGroupName(identity, &attr) < 0 ||
-            virTypedParamsAddString(&tmpparams, nparams, &maxparams,
-                                    VIR_CLIENT_INFO_UNIX_GROUP_NAME,
-                                    attr) < 0)
-            goto cleanup;
-
-        if (virIdentityGetUNIXProcessID(identity, &pid) < 0 ||
-            virTypedParamsAddInt(&tmpparams, nparams, &maxparams,
-                                 VIR_CLIENT_INFO_UNIX_PROCESS_ID, pid) < 0)
-            goto cleanup;
-    }
-
-    if (virIdentityGetSELinuxContext(identity, &attr) < 0 ||
-        (attr &&
-         virTypedParamsAddString(&tmpparams, nparams, &maxparams,
-                                VIR_CLIENT_INFO_SELINUX_CONTEXT, attr) < 0))
-        goto cleanup;
-
-    *params = tmpparams;
-    tmpparams = NULL;
-    ret = 0;
-
- cleanup:
-    virObjectUnref(identity);
-    VIR_FREE(sock_addr);
-    return ret;
-}
-
-int adminClientClose(virNetServerClientPtr client,
-                     unsigned int flags)
-{
-    virCheckFlags(0, -1);
-
-    virNetServerClientClose(client);
-    return 0;
-}
-
-int
-adminServerGetClientLimits(virNetServerPtr srv,
-                           virTypedParameterPtr *params,
-                           int *nparams,
-                           unsigned int flags)
-{
-    int ret = -1;
-    int maxparams = 0;
-    virTypedParameterPtr tmpparams = NULL;
-
-    virCheckFlags(0, -1);
-
-    if (virTypedParamsAddUInt(&tmpparams, nparams, &maxparams,
-                              VIR_SERVER_CLIENTS_MAX,
-                              virNetServerGetMaxClients(srv)) < 0)
-        goto cleanup;
-
-    if (virTypedParamsAddUInt(&tmpparams, nparams, &maxparams,
-                              VIR_SERVER_CLIENTS_CURRENT,
-                              virNetServerGetCurrentClients(srv)) < 0)
-        goto cleanup;
-
-    if (virTypedParamsAddUInt(&tmpparams, nparams, &maxparams,
-                              VIR_SERVER_CLIENTS_UNAUTH_MAX,
-                              virNetServerGetMaxUnauthClients(srv)) < 0)
-        goto cleanup;
-
-    if (virTypedParamsAddUInt(&tmpparams, nparams, &maxparams,
-                              VIR_SERVER_CLIENTS_UNAUTH_CURRENT,
-                              virNetServerGetCurrentUnauthClients(srv)) < 0)
-        goto cleanup;
-
-    *params = tmpparams;
-    tmpparams = NULL;
-    ret = 0;
-
- cleanup:
-    virTypedParamsFree(tmpparams, *nparams);
-    return ret;
-}
-
-int
-adminServerSetClientLimits(virNetServerPtr srv,
-                           virTypedParameterPtr params,
-                           int nparams,
-                           unsigned int flags)
-{
-    long long int maxClients = -1;
-    long long int maxClientsUnauth = -1;
-    virTypedParameterPtr param = NULL;
-
-    virCheckFlags(0, -1);
-
-    if (virTypedParamsValidate(params, nparams,
-                               VIR_SERVER_CLIENTS_MAX,
-                               VIR_TYPED_PARAM_UINT,
-                               VIR_SERVER_CLIENTS_UNAUTH_MAX,
-                               VIR_TYPED_PARAM_UINT,
-                               NULL) < 0)
-        return -1;
-
-    if ((param = virTypedParamsGet(params, nparams,
-                                   VIR_SERVER_CLIENTS_MAX)))
-        maxClients = param->value.ui;
-
-    if ((param = virTypedParamsGet(params, nparams,
-                                   VIR_SERVER_CLIENTS_UNAUTH_MAX)))
-        maxClientsUnauth = param->value.ui;
-
-    if (virNetServerSetClientLimits(srv, maxClients,
-                                    maxClientsUnauth) < 0)
-        return -1;
-
-    return 0;
-}
diff --git a/daemon/admin_server.h b/daemon/admin_server.h
deleted file mode 100644 (file)
index 0baffa7..0000000
+++ /dev/null
@@ -1,75 +0,0 @@
-/*
- * admin_server.h: admin methods to manage daemons and clients
- *
- * Copyright (C) 2016 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/>.
- *
- * Authors: Erik Skultety <eskultet@redhat.com>
- *          Martin Kletzander <mkletzan@redhat.com>
- */
-
-#ifndef __LIBVIRTD_ADMIN_SERVER_H__
-# define __LIBVIRTD_ADMIN_SERVER_H__
-
-# include "rpc/virnetdaemon.h"
-# include "rpc/virnetserver.h"
-
-int adminConnectListServers(virNetDaemonPtr dmn,
-                            virNetServerPtr **servers,
-                            unsigned int flags);
-
-virNetServerPtr adminConnectLookupServer(virNetDaemonPtr dmn,
-                                         const char *name,
-                                         unsigned int flags);
-
-int
-adminServerGetThreadPoolParameters(virNetServerPtr srv,
-                                   virTypedParameterPtr *params,
-                                   int *nparams,
-                                   unsigned int flags);
-int
-adminServerSetThreadPoolParameters(virNetServerPtr srv,
-                                   virTypedParameterPtr params,
-                                   int nparams,
-                                   unsigned int flags);
-
-int adminServerListClients(virNetServerPtr srv,
-                           virNetServerClientPtr **clients,
-                           unsigned int flags);
-
-virNetServerClientPtr adminServerLookupClient(virNetServerPtr srv,
-                                              unsigned long long id,
-                                              unsigned int flags);
-
-int adminClientGetInfo(virNetServerClientPtr client,
-                       virTypedParameterPtr *params,
-                       int *nparams,
-                       unsigned int flags);
-
-int adminClientClose(virNetServerClientPtr client,
-                     unsigned int flags);
-
-int adminServerGetClientLimits(virNetServerPtr srv,
-                               virTypedParameterPtr *params,
-                               int *nparams,
-                               unsigned int flags);
-
-int adminServerSetClientLimits(virNetServerPtr srv,
-                               virTypedParameterPtr params,
-                               int nparams,
-                               unsigned int flags);
-
-#endif /* __LIBVIRTD_ADMIN_SERVER_H__ */
index 6d3b83355bcabda0c59672941d8967fe10647607..48bdc27a5f687c1806301e7a701d8e6575716599 100644 (file)
@@ -43,7 +43,7 @@
 #include "libvirtd.h"
 #include "libvirtd-config.h"
 
-#include "admin.h"
+#include "admin/admin_server_dispatch.h"
 #include "viruuid.h"
 #include "remote_driver.h"
 #include "viralloc.h"
index b5707461feec23c888033c668cc05d7cd1010ab7..082c4bc4df42770f0bdfb3e496dd4bc283f8f365 100644 (file)
@@ -30,7 +30,6 @@
 # include <rpc/types.h>
 # include <rpc/xdr.h>
 # include "remote_protocol.h"
-# include "admin_protocol.h"
 # include "lxc_protocol.h"
 # include "qemu_protocol.h"
 # include "virthread.h"
@@ -44,8 +43,6 @@ typedef struct daemonClientStream daemonClientStream;
 typedef daemonClientStream *daemonClientStreamPtr;
 typedef struct daemonClientPrivate daemonClientPrivate;
 typedef daemonClientPrivate *daemonClientPrivatePtr;
-typedef struct daemonAdmClientPrivate daemonAdmClientPrivate;
-typedef daemonAdmClientPrivate *daemonAdmClientPrivatePtr;
 typedef struct daemonClientEventCallback daemonClientEventCallback;
 typedef daemonClientEventCallback *daemonClientEventCallbackPtr;
 
@@ -81,13 +78,6 @@ struct daemonClientPrivate {
     daemonClientStreamPtr streams;
 };
 
-/* Separate private data for admin connection */
-struct daemonAdmClientPrivate {
-    /* Just a placeholder, not that there is anything to be locked */
-    virMutex lock;
-
-    virNetDaemonPtr dmn;
-};
 
 # if WITH_SASL
 extern virNetSASLContextPtr saslCtxt;
index 8382ee633621a472b906c3f54b0425b1d4d0d01c..cbf2accba4ff2ce61534eb4d23945b93a71025e2 100644 (file)
@@ -1,6 +1,3 @@
-daemon/admin.c
-daemon/admin_dispatch.h
-daemon/admin_server.c
 daemon/libvirtd-config.c
 daemon/libvirtd.c
 daemon/qemu_dispatch.h
@@ -12,6 +9,9 @@ gnulib/lib/getopt.c
 gnulib/lib/regcomp.c
 src/access/viraccessdriverpolkit.c
 src/access/viraccessmanager.c
+src/admin/admin_server.c
+src/admin/admin_server_dispatch.c
+src/admin/admin_server_dispatch_stubs.h
 src/bhyve/bhyve_capabilities.c
 src/bhyve/bhyve_command.c
 src/bhyve/bhyve_device.c
index b0ddfdfb750613ee49c191fc5c14e46520ab65fd..35a6d45fbc4b9eeb55dd46783da9a20814feeb98 100644 (file)
@@ -546,7 +546,9 @@ ADMIN_PROTOCOL = $(srcdir)/admin/admin_protocol.x
 ADMIN_PROTOCOL_GENERATED = \
                admin/admin_protocol.c \
                admin/admin_protocol.h \
-               admin/admin_client.h
+               admin/admin_client.h \
+               admin/admin_server_dispatch_stubs.h \
+               $(NULL)
 
 admin/admin_client.h: $(srcdir)/rpc/gendispatch.pl \
                $(ADMIN_PROTOCOL) Makefile.am
@@ -554,6 +556,12 @@ admin/admin_client.h: $(srcdir)/rpc/gendispatch.pl \
          admin ADMIN $(ADMIN_PROTOCOL) \
          > $(srcdir)/admin/admin_client.h
 
+admin/admin_server_dispatch_stubs.h: $(srcdir)/rpc/gendispatch.pl \
+               $(ADMIN_PROTOCOL) Makefile.am
+       $(AM_V_GEN)$(PERL) -w $(srcdir)/rpc/gendispatch.pl --mode=server \
+         admin ADMIN $(ADMIN_PROTOCOL) \
+         > $(srcdir)/admin/admin_server_dispatch_stubs.h
+
 EXTRA_DIST += $(ADMIN_PROTOCOL) $(ADMIN_PROTOCOL_GENERATED)
 BUILT_SOURCES += $(ADMIN_PROTOCOL_GENERATED)
 MAINTAINERCLEANFILES += $(ADMIN_PROTOCOL_GENERATED)
@@ -2312,6 +2320,27 @@ libvirt_admin.syms: libvirt_admin_public.syms $(ADMIN_SYM_FILES) \
        chmod a-w $@-tmp && \
        mv $@-tmp libvirt_admin.syms
 
+
+admin/admin_server_dispatch.c: admin/admin_server_dispatch_stubs.h
+
+noinst_LTLIBRARIES += libvirt_driver_admin.la
+libvirt_driver_admin_la_SOURCES = \
+               admin/admin_protocol.c \
+               admin/admin_protocol.h \
+               admin/admin_server.c \
+               admin/admin_server.h \
+               admin/admin_server_dispatch.c \
+               admin/admin_server_dispatch.h \
+               admin/admin_server_dispatch_stubs.h \
+               $(NULL)
+libvirt_driver_admin_la_CFLAGS = \
+               $(AM_CFLAGS) \
+               -I$(top_srcdir)/src/util \
+               -I$(top_srcdir)/src/admin \
+               $(NULL)
+libvirt_driver_admin_la_LIBADD = ../gnulib/lib/libgnu.la
+libvirt_driver_admin_la_LDFLAGS = -module -avoid-version $(AM_LDFLAGS)
+
 # admin/admin_remote.c is being included in libvirt-admin.c, so we
 # need to include it in the dist
 EXTRA_DIST += admin/admin_remote.c
diff --git a/src/admin/admin_server.c b/src/admin/admin_server.c
new file mode 100644 (file)
index 0000000..f2c1a8f
--- /dev/null
@@ -0,0 +1,390 @@
+/*
+ * admin_server.c: admin methods to manage daemons and clients
+ *
+ * Copyright (C) 2016 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/>.
+ *
+ * Authors: Erik Skultety <eskultet@redhat.com>
+ *          Martin Kletzander <mkletzan@redhat.com>
+ */
+
+#include <config.h>
+
+#include "admin_server.h"
+#include "datatypes.h"
+#include "viralloc.h"
+#include "virerror.h"
+#include "viridentity.h"
+#include "virlog.h"
+#include "rpc/virnetdaemon.h"
+#include "rpc/virnetserver.h"
+#include "virstring.h"
+#include "virthreadpool.h"
+#include "virtypedparam.h"
+
+#define VIR_FROM_THIS VIR_FROM_ADMIN
+
+VIR_LOG_INIT("daemon.admin_server");
+
+int
+adminConnectListServers(virNetDaemonPtr dmn,
+                        virNetServerPtr **servers,
+                        unsigned int flags)
+{
+    int ret = -1;
+    virNetServerPtr *srvs = NULL;
+
+    virCheckFlags(0, -1);
+
+    if ((ret = virNetDaemonGetServers(dmn, &srvs)) < 0)
+        goto cleanup;
+
+    if (servers) {
+        *servers = srvs;
+        srvs = NULL;
+    }
+ cleanup:
+    if (ret > 0)
+        virObjectListFreeCount(srvs, ret);
+    return ret;
+}
+
+virNetServerPtr
+adminConnectLookupServer(virNetDaemonPtr dmn,
+                         const char *name,
+                         unsigned int flags)
+{
+    virCheckFlags(flags, NULL);
+
+    return virNetDaemonGetServer(dmn, name);
+}
+
+int
+adminServerGetThreadPoolParameters(virNetServerPtr srv,
+                                   virTypedParameterPtr *params,
+                                   int *nparams,
+                                   unsigned int flags)
+{
+    int ret = -1;
+    int maxparams = 0;
+    size_t minWorkers;
+    size_t maxWorkers;
+    size_t nWorkers;
+    size_t freeWorkers;
+    size_t nPrioWorkers;
+    size_t jobQueueDepth;
+    virTypedParameterPtr tmpparams = NULL;
+
+    virCheckFlags(0, -1);
+
+    if (virNetServerGetThreadPoolParameters(srv, &minWorkers, &maxWorkers,
+                                            &nWorkers, &freeWorkers,
+                                            &nPrioWorkers,
+                                            &jobQueueDepth) < 0) {
+        virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
+                       _("Unable to retrieve threadpool parameters"));
+        goto cleanup;
+    }
+
+    if (virTypedParamsAddUInt(&tmpparams, nparams,
+                              &maxparams, VIR_THREADPOOL_WORKERS_MIN,
+                              minWorkers) < 0)
+        goto cleanup;
+
+    if (virTypedParamsAddUInt(&tmpparams, nparams,
+                              &maxparams, VIR_THREADPOOL_WORKERS_MAX,
+                              maxWorkers) < 0)
+        goto cleanup;
+
+    if (virTypedParamsAddUInt(&tmpparams, nparams,
+                              &maxparams, VIR_THREADPOOL_WORKERS_CURRENT,
+                              nWorkers) < 0)
+        goto cleanup;
+
+    if (virTypedParamsAddUInt(&tmpparams, nparams,
+                              &maxparams, VIR_THREADPOOL_WORKERS_FREE,
+                              freeWorkers) < 0)
+        goto cleanup;
+
+    if (virTypedParamsAddUInt(&tmpparams, nparams,
+                              &maxparams, VIR_THREADPOOL_WORKERS_PRIORITY,
+                              nPrioWorkers) < 0)
+        goto cleanup;
+
+    if (virTypedParamsAddUInt(&tmpparams, nparams,
+                              &maxparams, VIR_THREADPOOL_JOB_QUEUE_DEPTH,
+                              jobQueueDepth) < 0)
+        goto cleanup;
+
+    *params = tmpparams;
+    tmpparams = NULL;
+    ret = 0;
+
+ cleanup:
+    virTypedParamsFree(tmpparams, *nparams);
+    return ret;
+}
+
+int
+adminServerSetThreadPoolParameters(virNetServerPtr srv,
+                                   virTypedParameterPtr params,
+                                   int nparams,
+                                   unsigned int flags)
+{
+    long long int minWorkers = -1;
+    long long int maxWorkers = -1;
+    long long int prioWorkers = -1;
+    virTypedParameterPtr param = NULL;
+
+    virCheckFlags(0, -1);
+
+    if (virTypedParamsValidate(params, nparams,
+                               VIR_THREADPOOL_WORKERS_MIN,
+                               VIR_TYPED_PARAM_UINT,
+                               VIR_THREADPOOL_WORKERS_MAX,
+                               VIR_TYPED_PARAM_UINT,
+                               VIR_THREADPOOL_WORKERS_PRIORITY,
+                               VIR_TYPED_PARAM_UINT,
+                               NULL) < 0)
+        return -1;
+
+    if ((param = virTypedParamsGet(params, nparams,
+                                   VIR_THREADPOOL_WORKERS_MIN)))
+        minWorkers = param->value.ui;
+
+    if ((param = virTypedParamsGet(params, nparams,
+                                   VIR_THREADPOOL_WORKERS_MAX)))
+        maxWorkers = param->value.ui;
+
+    if ((param = virTypedParamsGet(params, nparams,
+                                   VIR_THREADPOOL_WORKERS_PRIORITY)))
+        prioWorkers = param->value.ui;
+
+    if (virNetServerSetThreadPoolParameters(srv, minWorkers,
+                                            maxWorkers, prioWorkers) < 0)
+        return -1;
+
+    return 0;
+}
+
+int
+adminServerListClients(virNetServerPtr srv,
+                       virNetServerClientPtr **clients,
+                       unsigned int flags)
+{
+    int ret = -1;
+    virNetServerClientPtr *clts;
+
+    virCheckFlags(0, -1);
+
+    if ((ret = virNetServerGetClients(srv, &clts)) < 0)
+        return -1;
+
+    if (clients) {
+        *clients = clts;
+        clts = NULL;
+    }
+
+    virObjectListFreeCount(clts, ret);
+    return ret;
+}
+
+virNetServerClientPtr
+adminServerLookupClient(virNetServerPtr srv,
+                        unsigned long long id,
+                        unsigned int flags)
+{
+    virCheckFlags(0, NULL);
+
+    return virNetServerGetClient(srv, id);
+}
+
+int
+adminClientGetInfo(virNetServerClientPtr client,
+                   virTypedParameterPtr *params,
+                   int *nparams,
+                   unsigned int flags)
+{
+    int ret = -1;
+    int maxparams = 0;
+    bool readonly;
+    char *sock_addr = NULL;
+    const char *attr = NULL;
+    virTypedParameterPtr tmpparams = NULL;
+    virIdentityPtr identity = NULL;
+
+    virCheckFlags(0, -1);
+
+    if (virNetServerClientGetInfo(client, &readonly,
+                                  &sock_addr, &identity) < 0)
+        goto cleanup;
+
+    if (virTypedParamsAddBoolean(&tmpparams, nparams, &maxparams,
+                                 VIR_CLIENT_INFO_READONLY,
+                                 readonly) < 0)
+        goto cleanup;
+
+    if (virIdentityGetSASLUserName(identity, &attr) < 0 ||
+        (attr &&
+         virTypedParamsAddString(&tmpparams, nparams, &maxparams,
+                                 VIR_CLIENT_INFO_SASL_USER_NAME,
+                                 attr) < 0))
+        goto cleanup;
+
+    if (!virNetServerClientIsLocal(client)) {
+        if (virTypedParamsAddString(&tmpparams, nparams, &maxparams,
+                                    VIR_CLIENT_INFO_SOCKET_ADDR,
+                                    sock_addr) < 0)
+            goto cleanup;
+
+        if (virIdentityGetX509DName(identity, &attr) < 0 ||
+            (attr &&
+             virTypedParamsAddString(&tmpparams, nparams, &maxparams,
+                                     VIR_CLIENT_INFO_X509_DISTINGUISHED_NAME,
+                                     attr) < 0))
+            goto cleanup;
+    } else {
+        pid_t pid;
+        uid_t uid;
+        gid_t gid;
+        if (virIdentityGetUNIXUserID(identity, &uid) < 0 ||
+            virTypedParamsAddInt(&tmpparams, nparams, &maxparams,
+                                 VIR_CLIENT_INFO_UNIX_USER_ID, uid) < 0)
+            goto cleanup;
+
+        if (virIdentityGetUNIXUserName(identity, &attr) < 0 ||
+            virTypedParamsAddString(&tmpparams, nparams, &maxparams,
+                                    VIR_CLIENT_INFO_UNIX_USER_NAME,
+                                    attr) < 0)
+            goto cleanup;
+
+        if (virIdentityGetUNIXGroupID(identity, &gid) < 0 ||
+            virTypedParamsAddInt(&tmpparams, nparams, &maxparams,
+                                 VIR_CLIENT_INFO_UNIX_GROUP_ID, gid) < 0)
+            goto cleanup;
+
+        if (virIdentityGetUNIXGroupName(identity, &attr) < 0 ||
+            virTypedParamsAddString(&tmpparams, nparams, &maxparams,
+                                    VIR_CLIENT_INFO_UNIX_GROUP_NAME,
+                                    attr) < 0)
+            goto cleanup;
+
+        if (virIdentityGetUNIXProcessID(identity, &pid) < 0 ||
+            virTypedParamsAddInt(&tmpparams, nparams, &maxparams,
+                                 VIR_CLIENT_INFO_UNIX_PROCESS_ID, pid) < 0)
+            goto cleanup;
+    }
+
+    if (virIdentityGetSELinuxContext(identity, &attr) < 0 ||
+        (attr &&
+         virTypedParamsAddString(&tmpparams, nparams, &maxparams,
+                                VIR_CLIENT_INFO_SELINUX_CONTEXT, attr) < 0))
+        goto cleanup;
+
+    *params = tmpparams;
+    tmpparams = NULL;
+    ret = 0;
+
+ cleanup:
+    virObjectUnref(identity);
+    VIR_FREE(sock_addr);
+    return ret;
+}
+
+int adminClientClose(virNetServerClientPtr client,
+                     unsigned int flags)
+{
+    virCheckFlags(0, -1);
+
+    virNetServerClientClose(client);
+    return 0;
+}
+
+int
+adminServerGetClientLimits(virNetServerPtr srv,
+                           virTypedParameterPtr *params,
+                           int *nparams,
+                           unsigned int flags)
+{
+    int ret = -1;
+    int maxparams = 0;
+    virTypedParameterPtr tmpparams = NULL;
+
+    virCheckFlags(0, -1);
+
+    if (virTypedParamsAddUInt(&tmpparams, nparams, &maxparams,
+                              VIR_SERVER_CLIENTS_MAX,
+                              virNetServerGetMaxClients(srv)) < 0)
+        goto cleanup;
+
+    if (virTypedParamsAddUInt(&tmpparams, nparams, &maxparams,
+                              VIR_SERVER_CLIENTS_CURRENT,
+                              virNetServerGetCurrentClients(srv)) < 0)
+        goto cleanup;
+
+    if (virTypedParamsAddUInt(&tmpparams, nparams, &maxparams,
+                              VIR_SERVER_CLIENTS_UNAUTH_MAX,
+                              virNetServerGetMaxUnauthClients(srv)) < 0)
+        goto cleanup;
+
+    if (virTypedParamsAddUInt(&tmpparams, nparams, &maxparams,
+                              VIR_SERVER_CLIENTS_UNAUTH_CURRENT,
+                              virNetServerGetCurrentUnauthClients(srv)) < 0)
+        goto cleanup;
+
+    *params = tmpparams;
+    tmpparams = NULL;
+    ret = 0;
+
+ cleanup:
+    virTypedParamsFree(tmpparams, *nparams);
+    return ret;
+}
+
+int
+adminServerSetClientLimits(virNetServerPtr srv,
+                           virTypedParameterPtr params,
+                           int nparams,
+                           unsigned int flags)
+{
+    long long int maxClients = -1;
+    long long int maxClientsUnauth = -1;
+    virTypedParameterPtr param = NULL;
+
+    virCheckFlags(0, -1);
+
+    if (virTypedParamsValidate(params, nparams,
+                               VIR_SERVER_CLIENTS_MAX,
+                               VIR_TYPED_PARAM_UINT,
+                               VIR_SERVER_CLIENTS_UNAUTH_MAX,
+                               VIR_TYPED_PARAM_UINT,
+                               NULL) < 0)
+        return -1;
+
+    if ((param = virTypedParamsGet(params, nparams,
+                                   VIR_SERVER_CLIENTS_MAX)))
+        maxClients = param->value.ui;
+
+    if ((param = virTypedParamsGet(params, nparams,
+                                   VIR_SERVER_CLIENTS_UNAUTH_MAX)))
+        maxClientsUnauth = param->value.ui;
+
+    if (virNetServerSetClientLimits(srv, maxClients,
+                                    maxClientsUnauth) < 0)
+        return -1;
+
+    return 0;
+}
diff --git a/src/admin/admin_server.h b/src/admin/admin_server.h
new file mode 100644 (file)
index 0000000..3e0c35f
--- /dev/null
@@ -0,0 +1,75 @@
+/*
+ * admin_server.h: admin methods to manage daemons and clients
+ *
+ * Copyright (C) 2016 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/>.
+ *
+ * Authors: Erik Skultety <eskultet@redhat.com>
+ *          Martin Kletzander <mkletzan@redhat.com>
+ */
+
+#ifndef __ADMIN_SERVER_H__
+# define __ADMIN_SERVER_H__
+
+# include "rpc/virnetdaemon.h"
+# include "rpc/virnetserver.h"
+
+int adminConnectListServers(virNetDaemonPtr dmn,
+                            virNetServerPtr **servers,
+                            unsigned int flags);
+
+virNetServerPtr adminConnectLookupServer(virNetDaemonPtr dmn,
+                                         const char *name,
+                                         unsigned int flags);
+
+int
+adminServerGetThreadPoolParameters(virNetServerPtr srv,
+                                   virTypedParameterPtr *params,
+                                   int *nparams,
+                                   unsigned int flags);
+int
+adminServerSetThreadPoolParameters(virNetServerPtr srv,
+                                   virTypedParameterPtr params,
+                                   int nparams,
+                                   unsigned int flags);
+
+int adminServerListClients(virNetServerPtr srv,
+                           virNetServerClientPtr **clients,
+                           unsigned int flags);
+
+virNetServerClientPtr adminServerLookupClient(virNetServerPtr srv,
+                                              unsigned long long id,
+                                              unsigned int flags);
+
+int adminClientGetInfo(virNetServerClientPtr client,
+                       virTypedParameterPtr *params,
+                       int *nparams,
+                       unsigned int flags);
+
+int adminClientClose(virNetServerClientPtr client,
+                     unsigned int flags);
+
+int adminServerGetClientLimits(virNetServerPtr srv,
+                               virTypedParameterPtr *params,
+                               int *nparams,
+                               unsigned int flags);
+
+int adminServerSetClientLimits(virNetServerPtr srv,
+                               virTypedParameterPtr params,
+                               int nparams,
+                               unsigned int flags);
+
+#endif /* __ADMIN_SERVER_H__ */
diff --git a/src/admin/admin_server_dispatch.c b/src/admin/admin_server_dispatch.c
new file mode 100644 (file)
index 0000000..068358b
--- /dev/null
@@ -0,0 +1,497 @@
+/*
+ * admin_server_dispatch.c: handlers for admin RPC method calls
+ *
+ * Copyright (C) 2014-2016 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: Martin Kletzander <mkletzan@redhat.com>
+ */
+
+#include <config.h>
+
+#include "internal.h"
+#include "libvirt_internal.h"
+
+#include "admin_server_dispatch.h"
+#include "admin_server.h"
+#include "datatypes.h"
+#include "viralloc.h"
+#include "virerror.h"
+#include "virlog.h"
+#include "rpc/virnetdaemon.h"
+#include "rpc/virnetserver.h"
+#include "virstring.h"
+#include "virthreadjob.h"
+#include "virtypedparam.h"
+
+#define VIR_FROM_THIS VIR_FROM_ADMIN
+
+VIR_LOG_INIT("daemon.admin");
+
+typedef struct daemonAdmClientPrivate daemonAdmClientPrivate;
+typedef daemonAdmClientPrivate *daemonAdmClientPrivatePtr;
+/* Separate private data for admin connection */
+struct daemonAdmClientPrivate {
+    /* Just a placeholder, not that there is anything to be locked */
+    virMutex lock;
+
+    virNetDaemonPtr dmn;
+};
+
+void
+remoteAdmClientFreeFunc(void *data)
+{
+    struct daemonAdmClientPrivate *priv = data;
+
+    virMutexDestroy(&priv->lock);
+    virObjectUnref(priv->dmn);
+    VIR_FREE(priv);
+}
+
+void *
+remoteAdmClientInitHook(virNetServerClientPtr client ATTRIBUTE_UNUSED,
+                        void *opaque)
+{
+    struct daemonAdmClientPrivate *priv;
+
+    if (VIR_ALLOC(priv) < 0)
+        return NULL;
+
+    if (virMutexInit(&priv->lock) < 0) {
+        VIR_FREE(priv);
+        virReportSystemError(errno, "%s", _("unable to init mutex"));
+        return NULL;
+    }
+
+    /*
+     * We don't necessarily need to ref this object right now as there
+     * must be one ref being held throughout the life of the daemon,
+     * but let's just be safe for future.
+     */
+    priv->dmn = virObjectRef(opaque);
+
+    return priv;
+}
+
+/* Helpers */
+
+static virNetServerPtr
+get_nonnull_server(virNetDaemonPtr dmn, admin_nonnull_server srv)
+{
+    return virNetDaemonGetServer(dmn, srv.name);
+}
+
+static void
+make_nonnull_server(admin_nonnull_server *srv_dst,
+                    virNetServerPtr srv_src)
+{
+    ignore_value(VIR_STRDUP_QUIET(srv_dst->name, virNetServerGetName(srv_src)));
+}
+
+static virNetServerClientPtr
+get_nonnull_client(virNetServerPtr srv, admin_nonnull_client clnt)
+{
+    return virNetServerGetClient(srv, clnt.id);
+}
+
+static void
+make_nonnull_client(admin_nonnull_client *clt_dst,
+                    virNetServerClientPtr clt_src)
+{
+    clt_dst->id = virNetServerClientGetID(clt_src);
+    clt_dst->timestamp = virNetServerClientGetTimestamp(clt_src);
+    clt_dst->transport = virNetServerClientGetTransport(clt_src);
+}
+
+/* Functions */
+static int
+adminDispatchConnectOpen(virNetServerPtr server ATTRIBUTE_UNUSED,
+                         virNetServerClientPtr client,
+                         virNetMessagePtr msg ATTRIBUTE_UNUSED,
+                         virNetMessageErrorPtr rerr,
+                         struct admin_connect_open_args *args)
+{
+    unsigned int flags;
+    struct daemonAdmClientPrivate *priv =
+        virNetServerClientGetPrivateData(client);
+    int ret = -1;
+
+    VIR_DEBUG("priv=%p dmn=%p", priv, priv->dmn);
+    virMutexLock(&priv->lock);
+
+    flags = args->flags;
+    virCheckFlagsGoto(0, cleanup);
+
+    ret = 0;
+ cleanup:
+    if (ret < 0)
+        virNetMessageSaveError(rerr);
+    virMutexUnlock(&priv->lock);
+    return ret;
+}
+
+static int
+adminDispatchConnectClose(virNetServerPtr server ATTRIBUTE_UNUSED,
+                          virNetServerClientPtr client,
+                          virNetMessagePtr msg ATTRIBUTE_UNUSED,
+                          virNetMessageErrorPtr rerr ATTRIBUTE_UNUSED)
+{
+    virNetServerClientDelayedClose(client);
+    return 0;
+}
+
+static int
+adminConnectGetLibVersion(virNetDaemonPtr dmn ATTRIBUTE_UNUSED,
+                          unsigned long long *libVer)
+{
+    if (libVer)
+        *libVer = LIBVIR_VERSION_NUMBER;
+    return 0;
+}
+
+static int
+adminDispatchServerGetThreadpoolParameters(virNetServerPtr server ATTRIBUTE_UNUSED,
+                                           virNetServerClientPtr client,
+                                           virNetMessagePtr msg ATTRIBUTE_UNUSED,
+                                           virNetMessageErrorPtr rerr,
+                                           struct admin_server_get_threadpool_parameters_args *args,
+                                           struct admin_server_get_threadpool_parameters_ret *ret)
+{
+    int rv = -1;
+    virNetServerPtr srv = NULL;
+    virTypedParameterPtr params = NULL;
+    int nparams = 0;
+    struct daemonAdmClientPrivate *priv =
+        virNetServerClientGetPrivateData(client);
+
+    if (!(srv = virNetDaemonGetServer(priv->dmn, args->srv.name)))
+        goto cleanup;
+
+    if (adminServerGetThreadPoolParameters(srv, &params, &nparams,
+                                           args->flags) < 0)
+        goto cleanup;
+
+    if (nparams > ADMIN_SERVER_THREADPOOL_PARAMETERS_MAX) {
+        virReportError(VIR_ERR_INTERNAL_ERROR,
+                       _("Number of threadpool parameters %d exceeds max "
+                         "allowed limit: %d"), nparams,
+                       ADMIN_SERVER_THREADPOOL_PARAMETERS_MAX);
+        goto cleanup;
+    }
+
+    if (virTypedParamsSerialize(params, nparams,
+                                (virTypedParameterRemotePtr *) &ret->params.params_val,
+                                &ret->params.params_len, 0) < 0)
+        goto cleanup;
+
+    rv = 0;
+ cleanup:
+    if (rv < 0)
+        virNetMessageSaveError(rerr);
+
+    virTypedParamsFree(params, nparams);
+    virObjectUnref(srv);
+    return rv;
+}
+
+static int
+adminDispatchServerSetThreadpoolParameters(virNetServerPtr server ATTRIBUTE_UNUSED,
+                                           virNetServerClientPtr client,
+                                           virNetMessagePtr msg ATTRIBUTE_UNUSED,
+                                           virNetMessageErrorPtr rerr,
+                                           struct admin_server_set_threadpool_parameters_args *args)
+{
+    int rv = -1;
+    virNetServerPtr srv = NULL;
+    virTypedParameterPtr params = NULL;
+    int nparams = 0;
+    struct daemonAdmClientPrivate *priv =
+        virNetServerClientGetPrivateData(client);
+
+    if (!(srv = virNetDaemonGetServer(priv->dmn, args->srv.name))) {
+        virReportError(VIR_ERR_NO_SERVER,
+                       _("no server with matching name '%s' found"),
+                       args->srv.name);
+        goto cleanup;
+    }
+
+    if (virTypedParamsDeserialize((virTypedParameterRemotePtr) args->params.params_val,
+                                  args->params.params_len,
+                                  ADMIN_SERVER_THREADPOOL_PARAMETERS_MAX,
+                                  &params,
+                                  &nparams) < 0)
+        goto cleanup;
+
+
+    if (adminServerSetThreadPoolParameters(srv, params,
+                                           nparams, args->flags) < 0)
+        goto cleanup;
+
+    rv = 0;
+ cleanup:
+    if (rv < 0)
+        virNetMessageSaveError(rerr);
+
+    virTypedParamsFree(params, nparams);
+    virObjectUnref(srv);
+    return rv;
+}
+
+static int
+adminDispatchClientGetInfo(virNetServerPtr server ATTRIBUTE_UNUSED,
+                           virNetServerClientPtr client,
+                           virNetMessagePtr msg ATTRIBUTE_UNUSED,
+                           virNetMessageErrorPtr rerr,
+                           struct admin_client_get_info_args *args,
+                           struct admin_client_get_info_ret *ret)
+{
+    int rv = -1;
+    virNetServerPtr srv = NULL;
+    virNetServerClientPtr clnt = NULL;
+    virTypedParameterPtr params = NULL;
+    int nparams = 0;
+    struct daemonAdmClientPrivate *priv =
+        virNetServerClientGetPrivateData(client);
+
+    if (!(srv = virNetDaemonGetServer(priv->dmn, args->clnt.srv.name))) {
+        virReportError(VIR_ERR_NO_SERVER,
+                       _("no server with matching name '%s' found"),
+                       args->clnt.srv.name);
+        goto cleanup;
+    }
+
+    if (!(clnt = virNetServerGetClient(srv, args->clnt.id))) {
+        virReportError(VIR_ERR_NO_CLIENT,
+                       _("no client with matching id '%llu' found"),
+                       (unsigned long long) args->clnt.id);
+        goto cleanup;
+    }
+
+    if (adminClientGetInfo(clnt, &params, &nparams, args->flags) < 0)
+        goto cleanup;
+
+    if (nparams > ADMIN_CLIENT_INFO_PARAMETERS_MAX) {
+        virReportError(VIR_ERR_INTERNAL_ERROR,
+                       _("Number of client info parameters %d exceeds max "
+                         "allowed limit: %d"), nparams,
+                       ADMIN_CLIENT_INFO_PARAMETERS_MAX);
+        goto cleanup;
+    }
+
+    if (virTypedParamsSerialize(params, nparams,
+                                (virTypedParameterRemotePtr *) &ret->params.params_val,
+                                &ret->params.params_len,
+                                VIR_TYPED_PARAM_STRING_OKAY) < 0)
+        goto cleanup;
+
+    rv = 0;
+
+ cleanup:
+    if (rv < 0)
+        virNetMessageSaveError(rerr);
+
+    virTypedParamsFree(params, nparams);
+    virObjectUnref(clnt);
+    virObjectUnref(srv);
+    return rv;
+}
+
+static int
+adminDispatchServerGetClientLimits(virNetServerPtr server ATTRIBUTE_UNUSED,
+                                   virNetServerClientPtr client,
+                                   virNetMessagePtr msg ATTRIBUTE_UNUSED,
+                                   virNetMessageErrorPtr rerr ATTRIBUTE_UNUSED,
+                                   admin_server_get_client_limits_args *args,
+                                   admin_server_get_client_limits_ret *ret)
+{
+    int rv = -1;
+    virNetServerPtr srv = NULL;
+    virTypedParameterPtr params = NULL;
+    int nparams = 0;
+    struct daemonAdmClientPrivate *priv =
+        virNetServerClientGetPrivateData(client);
+
+    if (!(srv = virNetDaemonGetServer(priv->dmn, args->srv.name)))
+        goto cleanup;
+
+    if (adminServerGetClientLimits(srv, &params, &nparams, args->flags) < 0)
+        goto cleanup;
+
+    if (nparams > ADMIN_SERVER_CLIENT_LIMITS_MAX) {
+        virReportError(VIR_ERR_INTERNAL_ERROR,
+                       _("Number of client processing parameters %d exceeds "
+                         "max allowed limit: %d"), nparams,
+                       ADMIN_SERVER_CLIENT_LIMITS_MAX);
+        goto cleanup;
+    }
+
+    if (virTypedParamsSerialize(params, nparams,
+                                (virTypedParameterRemotePtr *) &ret->params.params_val,
+                                &ret->params.params_len, 0) < 0)
+        goto cleanup;
+
+    rv = 0;
+ cleanup:
+    if (rv < 0)
+        virNetMessageSaveError(rerr);
+
+    virTypedParamsFree(params, nparams);
+    virObjectUnref(srv);
+    return rv;
+}
+
+static int
+adminDispatchServerSetClientLimits(virNetServerPtr server ATTRIBUTE_UNUSED,
+                                   virNetServerClientPtr client,
+                                   virNetMessagePtr msg ATTRIBUTE_UNUSED,
+                                   virNetMessageErrorPtr rerr ATTRIBUTE_UNUSED,
+                                   admin_server_set_client_limits_args *args)
+{
+    int rv = -1;
+    virNetServerPtr srv = NULL;
+    virTypedParameterPtr params = NULL;
+    int nparams = 0;
+    struct daemonAdmClientPrivate *priv =
+        virNetServerClientGetPrivateData(client);
+
+    if (!(srv = virNetDaemonGetServer(priv->dmn, args->srv.name))) {
+        virReportError(VIR_ERR_NO_SERVER,
+                       _("no server with matching name '%s' found"),
+                       args->srv.name);
+        goto cleanup;
+    }
+
+    if (virTypedParamsDeserialize((virTypedParameterRemotePtr) args->params.params_val,
+        args->params.params_len,
+        ADMIN_SERVER_CLIENT_LIMITS_MAX, &params, &nparams) < 0)
+        goto cleanup;
+
+    if (adminServerSetClientLimits(srv, params, nparams, args->flags) < 0)
+        goto cleanup;
+
+    rv = 0;
+ cleanup:
+    if (rv < 0)
+        virNetMessageSaveError(rerr);
+    virTypedParamsFree(params, nparams);
+    virObjectUnref(srv);
+    return rv;
+}
+
+/* Returns the number of outputs stored in @outputs */
+static int
+adminConnectGetLoggingOutputs(char **outputs, unsigned int flags)
+{
+    char *tmp = NULL;
+
+    virCheckFlags(0, -1);
+
+    if (!(tmp = virLogGetOutputs()))
+        return -1;
+
+    *outputs = tmp;
+    return virLogGetNbOutputs();
+}
+
+/* Returns the number of defined filters or -1 in case of an error */
+static int
+adminConnectGetLoggingFilters(char **filters, unsigned int flags)
+{
+    char *tmp = NULL;
+    int ret = 0;
+
+    virCheckFlags(0, -1);
+
+    if ((ret = virLogGetNbFilters()) > 0 && !(tmp = virLogGetFilters()))
+        return -1;
+
+    *filters = tmp;
+    return ret;
+}
+
+static int
+adminConnectSetLoggingOutputs(virNetDaemonPtr dmn ATTRIBUTE_UNUSED,
+                              const char *outputs,
+                              unsigned int flags)
+{
+    virCheckFlags(0, -1);
+
+    return virLogSetOutputs(outputs);
+}
+
+static int
+adminConnectSetLoggingFilters(virNetDaemonPtr dmn ATTRIBUTE_UNUSED,
+                              const char *filters,
+                              unsigned int flags)
+{
+    virCheckFlags(0, -1);
+
+    return virLogSetFilters(filters);
+}
+
+static int
+adminDispatchConnectGetLoggingOutputs(virNetServerPtr server ATTRIBUTE_UNUSED,
+                                      virNetServerClientPtr client ATTRIBUTE_UNUSED,
+                                      virNetMessagePtr msg ATTRIBUTE_UNUSED,
+                                      virNetMessageErrorPtr rerr,
+                                      admin_connect_get_logging_outputs_args *args,
+                                      admin_connect_get_logging_outputs_ret *ret)
+{
+    char *outputs = NULL;
+    int noutputs = 0;
+
+    if ((noutputs = adminConnectGetLoggingOutputs(&outputs, args->flags)) < 0) {
+        virNetMessageSaveError(rerr);
+        return -1;
+    }
+
+    VIR_STEAL_PTR(ret->outputs, outputs);
+    ret->noutputs = noutputs;
+
+    return 0;
+}
+
+static int
+adminDispatchConnectGetLoggingFilters(virNetServerPtr server ATTRIBUTE_UNUSED,
+                                      virNetServerClientPtr client ATTRIBUTE_UNUSED,
+                                      virNetMessagePtr msg ATTRIBUTE_UNUSED,
+                                      virNetMessageErrorPtr rerr,
+                                      admin_connect_get_logging_filters_args *args,
+                                      admin_connect_get_logging_filters_ret *ret)
+{
+    char *filters = NULL;
+    int nfilters = 0;
+
+    if ((nfilters = adminConnectGetLoggingFilters(&filters, args->flags)) < 0) {
+        virNetMessageSaveError(rerr);
+        return -1;
+    }
+
+    if (nfilters == 0) {
+        ret->filters = NULL;
+    } else {
+        char **ret_filters = NULL;
+        if (VIR_ALLOC(ret_filters) < 0)
+            return -1;
+
+        *ret_filters = filters;
+        ret->filters = ret_filters;
+    }
+    ret->nfilters = nfilters;
+
+    return 0;
+}
+#include "admin_server_dispatch_stubs.h"
diff --git a/src/admin/admin_server_dispatch.h b/src/admin/admin_server_dispatch.h
new file mode 100644 (file)
index 0000000..01723e5
--- /dev/null
@@ -0,0 +1,37 @@
+/*
+ * admin_server_dispatch.h: handlers for admin RPC method calls
+ *
+ * Copyright (C) 2014-2016 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: Martin Kletzander <mkletzan@redhat.com>
+ */
+
+#ifndef __ADMIN_SERVER_DISPATCH_H__
+# define __ADMIN_SERVER_DISPATCH_H__
+
+# include "rpc/virnetserverprogram.h"
+# include "rpc/virnetserverclient.h"
+# include "admin/admin_protocol.h"
+
+
+extern virNetServerProgramProc adminProcs[];
+extern size_t adminNProcs;
+
+void remoteAdmClientFreeFunc(void *data);
+void *remoteAdmClientInitHook(virNetServerClientPtr client, void *opaque);
+
+#endif /* __ADMIN_SERVER_DISPATCH_H__ */