From: Erik Skultety Date: Thu, 14 Apr 2016 22:21:05 +0000 (+0200) Subject: rpc: virnetserver: Support retrieval of a list of clients X-Git-Url: http://xenbits.xensource.com/gitweb?a=commitdiff_plain;h=04bab54d05f1850de5f0bae24eb0ac68ec6387d3;p=libvirt.git rpc: virnetserver: Support retrieval of a list of clients For now, the list copy is done simply by locking the whole server, walking the original and increasing the refcount on each object. We may want to change the list to a lockable object (like list of domains) later in the future if we discover some performance issues related to locking the whole server in order to walk the whole list of clients, possibly issuing some 'ForEach' callback. Signed-off-by: Erik Skultety --- diff --git a/src/libvirt_remote.syms b/src/libvirt_remote.syms index c04987447f..ea92043e80 100644 --- a/src/libvirt_remote.syms +++ b/src/libvirt_remote.syms @@ -101,6 +101,7 @@ virNetServerAddClient; virNetServerAddProgram; virNetServerAddService; virNetServerClose; +virNetServerGetClients; virNetServerGetName; virNetServerHasClients; virNetServerNew; diff --git a/src/rpc/virnetserver.c b/src/rpc/virnetserver.c index 8216da6c2b..fcc79f4c1e 100644 --- a/src/rpc/virnetserver.c +++ b/src/rpc/virnetserver.c @@ -943,3 +943,32 @@ virNetServerSetThreadPoolParameters(virNetServerPtr srv, virObjectUnlock(srv); return ret; } + +int +virNetServerGetClients(virNetServerPtr srv, + virNetServerClientPtr **clts) +{ + int ret = -1; + size_t i; + size_t nclients = 0; + virNetServerClientPtr *list = NULL; + + virObjectLock(srv); + + for (i = 0; i < srv->nclients; i++) { + virNetServerClientPtr client = virObjectRef(srv->clients[i]); + if (VIR_APPEND_ELEMENT(list, nclients, client) < 0) { + virObjectUnref(client); + goto cleanup; + } + } + + *clts = list; + list = NULL; + ret = nclients; + + cleanup: + virObjectListFreeCount(list, nclients); + virObjectUnlock(srv); + return ret; +} diff --git a/src/rpc/virnetserver.h b/src/rpc/virnetserver.h index 2ae89cefcc..f5bb20052a 100644 --- a/src/rpc/virnetserver.h +++ b/src/rpc/virnetserver.h @@ -105,4 +105,7 @@ int virNetServerSetThreadPoolParameters(virNetServerPtr srv, unsigned long long virNetServerNextClientID(virNetServerPtr srv); +int virNetServerGetClients(virNetServerPtr srv, + virNetServerClientPtr **clients); + #endif /* __VIR_NET_SERVER_H__ */