]> xenbits.xensource.com Git - libvirt.git/commitdiff
admin: Introduce listing clients
authorErik Skultety <eskultet@redhat.com>
Thu, 14 Apr 2016 22:20:11 +0000 (00:20 +0200)
committerErik Skultety <eskultet@redhat.com>
Tue, 3 May 2016 08:04:54 +0000 (10:04 +0200)
Finally add public method to retrieve the list of currently connected clients
to a given server.

Signed-off-by: Erik Skultety <eskultet@redhat.com>
daemon/admin.c
daemon/admin_server.c
daemon/admin_server.h
include/libvirt/libvirt-admin.h
src/admin/admin_protocol.x
src/admin/admin_remote.c
src/admin_protocol-structs
src/libvirt-admin.c
src/libvirt_admin_private.syms
src/libvirt_admin_public.syms

index 00e7dc3c00acf97a0f538301bf217b0fc0ac7f10..fcbdee5fa3e6229e1d966ce4b77552741ca70252 100644 (file)
@@ -81,6 +81,12 @@ remoteAdmClientInitHook(virNetServerClientPtr client ATTRIBUTE_UNUSED,
 
 /* 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)
@@ -88,6 +94,15 @@ make_nonnull_server(admin_nonnull_server *srv_dst,
     ignore_value(VIR_STRDUP_QUIET(srv_dst->name, virNetServerGetName(srv_src)));
 }
 
+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,
index e39a9bd805e751608c8efc967a1ef9ce8469f15c..0bd142c4350a418250c50518c11e1234841386f1 100644 (file)
@@ -178,3 +178,26 @@ adminServerSetThreadPoolParameters(virNetServerPtr srv,
 
     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)
+        goto cleanup;
+
+    if (clients) {
+        *clients = clts;
+        clts = NULL;
+    }
+
+ cleanup:
+    virObjectListFreeCount(clts, ret);
+    return ret;
+}
index 756e049ff0591d2f5f2270b26058a3ec8af46dba..3e4786ebdadf433ae43eff68d8bf61bf340ce0f0 100644 (file)
@@ -46,4 +46,8 @@ adminServerSetThreadPoolParameters(virNetServerPtr srv,
                                    int nparams,
                                    unsigned int flags);
 
+int adminServerListClients(virNetServerPtr srv,
+                           virNetServerClientPtr **clients,
+                           unsigned int flags);
+
 #endif /* __LIBVIRTD_ADMIN_SERVER_H__ */
index f83ac1c3585a90528131415630e1b68c95f71295..20768e218ae5e1f775dabcafa646b6949d880854 100644 (file)
@@ -215,6 +215,10 @@ typedef enum {
 # endif
 } virClientTransport;
 
+int virAdmServerListClients(virAdmServerPtr srv,
+                            virAdmClientPtr **clients,
+                            unsigned int flags);
+
 # ifdef __cplusplus
 }
 # endif
index 2f302af3ab65ecdf72c32e695123e2d39f8ea777..e77ce9e455bca43f9364e505903c352c55a40c80 100644 (file)
@@ -39,6 +39,9 @@ const ADMIN_SERVER_LIST_MAX = 16384;
 /* Upper limit on number of threadpool parameters */
 const ADMIN_SERVER_THREADPOOL_PARAMETERS_MAX = 32;
 
+/* Upper limit on list of clients */
+const ADMIN_CLIENT_LIST_MAX = 16384;
+
 /* A long string, which may NOT be NULL. */
 typedef string admin_nonnull_string<ADMIN_STRING_MAX>;
 
@@ -124,6 +127,17 @@ struct admin_server_set_threadpool_parameters_args {
     unsigned int flags;
 };
 
+struct admin_server_list_clients_args {
+    admin_nonnull_server srv;
+    unsigned int need_results;
+    unsigned int flags;
+};
+
+struct admin_server_list_clients_ret { /* insert@1 */
+    admin_nonnull_client clients<ADMIN_CLIENT_LIST_MAX>;
+    unsigned int ret;
+};
+
 /* Define the program number, protocol version and procedure numbers here. */
 const ADMIN_PROGRAM = 0x06900690;
 const ADMIN_PROTOCOL_VERSION = 1;
@@ -179,5 +193,10 @@ enum admin_procedure {
     /**
      * @generate: none
      */
-    ADMIN_PROC_SERVER_SET_THREADPOOL_PARAMETERS = 7
+    ADMIN_PROC_SERVER_SET_THREADPOOL_PARAMETERS = 7,
+
+    /**
+     * @generate: both
+     */
+    ADMIN_PROC_SERVER_LIST_CLIENTS = 8
 };
index 2dd692b342abf640098f686d4878838edd6434ca..b833ea4e159fdfc00f3013ff92138d1407863d42 100644 (file)
@@ -55,6 +55,12 @@ get_nonnull_server(virAdmConnectPtr conn, admin_nonnull_server server)
     return virAdmGetServer(conn, server.name);
 }
 
+static virAdmClientPtr
+get_nonnull_client(virAdmServerPtr srv, admin_nonnull_client client)
+{
+    return virAdmGetClient(srv, client.id, client.timestamp, client.transport);
+}
+
 static void
 make_nonnull_server(admin_nonnull_server *srv_dst, virAdmServerPtr srv_src)
 {
index d4ccf9ec4d12006f3f9a15b10260b9f0c74c6900..055ddd591796880aabc625959b6b90d5b0ce8820 100644 (file)
@@ -75,6 +75,18 @@ struct admin_server_set_threadpool_parameters_args {
         } params;
         u_int                      flags;
 };
+struct admin_server_list_clients_args {
+        admin_nonnull_server       srv;
+        u_int                      need_results;
+        u_int                      flags;
+};
+struct admin_server_list_clients_ret {
+        struct {
+                u_int              clients_len;
+                admin_nonnull_client * clients_val;
+        } clients;
+        u_int                      ret;
+};
 enum admin_procedure {
         ADMIN_PROC_CONNECT_OPEN = 1,
         ADMIN_PROC_CONNECT_CLOSE = 2,
@@ -83,4 +95,5 @@ enum admin_procedure {
         ADMIN_PROC_CONNECT_LOOKUP_SERVER = 5,
         ADMIN_PROC_SERVER_GET_THREADPOOL_PARAMETERS = 6,
         ADMIN_PROC_SERVER_SET_THREADPOOL_PARAMETERS = 7,
+        ADMIN_PROC_SERVER_LIST_CLIENTS = 8,
 };
index 0d39a795978f08b1d3e23c5488e14742b84638f4..f8b5bd7df0b24c60af753cee38c786edc4529947 100644 (file)
@@ -848,3 +848,44 @@ virAdmServerSetThreadPoolParameters(virAdmServerPtr srv,
     virDispatchError(NULL);
     return -1;
 }
+
+/**
+ * virAdmServerListClients:
+ * @srv: a valid server object reference
+ * @clients: pointer to a list to store an array containing objects or NULL
+ *           if the list is not required (number of clients only)
+ * @flags: extra flags; not used yet, so callers should always pass 0
+ *
+ * Collect list of all clients connected to daemon on server @srv.
+ *
+ * Returns the number of clients connected to daemon on server @srv -1 in case
+ * of a failure, setting @clients to NULL. There is a guaranteed extra element
+ * set to NULL in the @clients list returned to make the iteration easier,
+ * excluding this extra element from the final count.
+ * Caller is responsible to call virAdmClientFree() on each list element,
+ * followed by freeing @clients.
+ */
+int
+virAdmServerListClients(virAdmServerPtr srv,
+                        virAdmClientPtr **clients,
+                        unsigned int flags)
+{
+    int ret = -1;
+
+    VIR_DEBUG("srv=%p, clients=%p, flags=%x", srv, clients, flags);
+
+    virResetLastError();
+    virCheckFlagsGoto(0, error);
+
+    if (clients)
+        *clients = NULL;
+
+    virCheckAdmServerReturn(srv, -1);
+    if ((ret = remoteAdminServerListClients(srv, clients, flags)) < 0)
+        goto error;
+
+    return ret;
+ error:
+    virDispatchError(NULL);
+    return -1;
+}
index c407e6e5cf982a9517c71285d852b7d4eed2dfe9..621b502ddd92ebd513ac803d8a160c89945ef389 100644 (file)
@@ -14,6 +14,8 @@ xdr_admin_connect_lookup_server_ret;
 xdr_admin_connect_open_args;
 xdr_admin_server_get_threadpool_parameters_args;
 xdr_admin_server_get_threadpool_parameters_ret;
+xdr_admin_server_list_clients_args;
+xdr_admin_server_list_clients_ret;
 xdr_admin_server_set_threadpool_parameters_args;
 
 # datatypes.h
index 7c4626e0c609064aec56a8038c03858ca7253b38..bf6643a19f3dbb425e2d306f94af3b7022635b11 100644 (file)
@@ -31,4 +31,5 @@ LIBVIRT_ADMIN_1.3.0 {
         virAdmServerFree;
         virAdmConnectLookupServer;
         virAdmServerSetThreadPoolParameters;
+        virAdmServerListClients;
 };