/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
# 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]
# 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 \
$(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
$(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
remote_dispatch.h \
lxc_dispatch.h \
qemu_dispatch.h \
- admin_dispatch.h \
$(NULL)
DAEMON_SOURCES = \
remote_dispatch.h \
lxc_dispatch.h \
qemu_dispatch.h \
- admin_dispatch.h \
libvirtd.conf \
libvirtd.init.in \
libvirtd.upstart \
--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
$(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
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 \
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 \
+++ /dev/null
-/*
- * 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, ¶ms, &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,
- ¶ms,
- &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, ¶ms, &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, ¶ms, &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, ¶ms, &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"
+++ /dev/null
-/*
- * 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__ */
+++ /dev/null
-/*
- * 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;
-}
+++ /dev/null
-/*
- * 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__ */
#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"
# 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"
typedef daemonClientStream *daemonClientStreamPtr;
typedef struct daemonClientPrivate daemonClientPrivate;
typedef daemonClientPrivate *daemonClientPrivatePtr;
-typedef struct daemonAdmClientPrivate daemonAdmClientPrivate;
-typedef daemonAdmClientPrivate *daemonAdmClientPrivatePtr;
typedef struct daemonClientEventCallback daemonClientEventCallback;
typedef daemonClientEventCallback *daemonClientEventCallbackPtr;
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;
-daemon/admin.c
-daemon/admin_dispatch.h
-daemon/admin_server.c
daemon/libvirtd-config.c
daemon/libvirtd.c
daemon/qemu_dispatch.h
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
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
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)
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
--- /dev/null
+/*
+ * 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;
+}
--- /dev/null
+/*
+ * 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__ */
--- /dev/null
+/*
+ * 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, ¶ms, &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,
+ ¶ms,
+ &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, ¶ms, &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, ¶ms, &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, ¶ms, &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"
--- /dev/null
+/*
+ * 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__ */