]> xenbits.xensource.com Git - libvirt.git/commitdiff
admin: Introduce virAdmClientClose API
authorErik Skultety <eskultet@redhat.com>
Thu, 28 Apr 2016 08:26:25 +0000 (10:26 +0200)
committerErik Skultety <eskultet@redhat.com>
Tue, 10 May 2016 14:05:17 +0000 (16:05 +0200)
Once we're able to list and identify all clients connected to a specific
server, we can then support force-closing a connection. This patch introduces
a simple API calling virNetServerClientClose on a specific client, which
can be later extended easily, e.g. by sending an event once the client is
disconnected successfully.

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_protocol-structs
src/libvirt-admin.c
src/libvirt_admin_private.syms
src/libvirt_admin_public.syms

index dbf49dddc1a6dd76d76313c9b60d093f164b81fc..03774d735dda382675369c95d701a4277bfd8fa4 100644 (file)
@@ -94,6 +94,12 @@ make_nonnull_server(admin_nonnull_server *srv_dst,
     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)
index 41f6e827360498a13e65f1c5bf054bad92567126..9f4068824e9e5fba926b83a6a8f857f4c1303f44 100644 (file)
@@ -302,3 +302,12 @@ adminClientGetInfo(virNetServerClientPtr client,
     virObjectUnref(identity);
     return ret;
 }
+
+int adminClientClose(virNetServerClientPtr client,
+                     unsigned int flags)
+{
+    virCheckFlags(0, -1);
+
+    virNetServerClientClose(client);
+    return 0;
+}
index 95c76b9e0f39640d76a11c8e6a50f7c29d6495fb..2953e108b60bf70720adbb0d456cef51bd02e87f 100644 (file)
@@ -59,4 +59,7 @@ int adminClientGetInfo(virNetServerClientPtr client,
                        int *nparams,
                        unsigned int flags);
 
+int adminClientClose(virNetServerClientPtr client,
+                     unsigned int flags);
+
 #endif /* __LIBVIRTD_ADMIN_SERVER_H__ */
index 0a1ea61e33e04ff18be10d0ab286336ec56a689e..4e6074e6a335232702dac32b072609c7def1bd25 100644 (file)
@@ -349,6 +349,8 @@ int virAdmClientGetInfo(virAdmClientPtr client,
                         int *nparams,
                         unsigned int flags);
 
+int virAdmClientClose(virAdmClientPtr client, unsigned int flags);
+
 # ifdef __cplusplus
 }
 # endif
index 67bdbf30eecba30d41bc87561570986f23ca518f..1da7f901ff242e8c85943ab927acca119594a173 100644 (file)
@@ -160,6 +160,11 @@ struct admin_client_get_info_ret { /* insert@1 */
     admin_typed_param params<ADMIN_CLIENT_INFO_PARAMETERS_MAX>;
 };
 
+struct admin_client_close_args {
+    admin_nonnull_client clnt;
+    unsigned int flags;
+};
+
 /* Define the program number, protocol version and procedure numbers here. */
 const ADMIN_PROGRAM = 0x06900690;
 const ADMIN_PROTOCOL_VERSION = 1;
@@ -230,5 +235,10 @@ enum admin_procedure {
     /**
      * @generate: none
      */
-    ADMIN_PROC_CLIENT_GET_INFO = 10
+    ADMIN_PROC_CLIENT_GET_INFO = 10,
+
+    /**
+     * @generate: both
+     */
+    ADMIN_PROC_CLIENT_CLOSE = 11
 };
index ea9adf6c3c16c8ee22102ef9f7fb071cbcdf62a7..b4db415bdae5b7250199fba6fcd424ab00a828b4 100644 (file)
@@ -105,6 +105,10 @@ struct admin_client_get_info_ret {
                 admin_typed_param * params_val;
         } params;
 };
+struct admin_client_close_args {
+        admin_nonnull_client       clnt;
+        u_int                      flags;
+};
 enum admin_procedure {
         ADMIN_PROC_CONNECT_OPEN = 1,
         ADMIN_PROC_CONNECT_CLOSE = 2,
@@ -116,4 +120,5 @@ enum admin_procedure {
         ADMIN_PROC_SERVER_LIST_CLIENTS = 8,
         ADMIN_PROC_SERVER_LOOKUP_CLIENT = 9,
         ADMIN_PROC_CLIENT_GET_INFO = 10,
+        ADMIN_PROC_CLIENT_CLOSE = 11,
 };
index 140fff37b5dd60ffed122aae4010ec7633f4dbbf..9d5e5b99ff622afd63904567d58d7d0f4f9ec25a 100644 (file)
@@ -971,3 +971,32 @@ virAdmClientGetInfo(virAdmClientPtr client,
     virDispatchError(NULL);
     return -1;
 }
+
+/**
+ * virAdmClientClose:
+ * @client: a valid client object reference
+ * @flags: extra flags; not used yet, so callers should always pass 0
+ *
+ * Close @client's connection to daemon forcefully.
+ *
+ * Returns 0 if the daemon's connection with @client was closed successfully
+ * or -1 in case of an error.
+ */
+int virAdmClientClose(virAdmClientPtr client,
+                      unsigned int flags)
+{
+    int ret = -1;
+
+    VIR_DEBUG("client=%p, flags=%x", client, flags);
+    virResetLastError();
+
+    virCheckAdmClientGoto(client, error);
+
+    if ((ret = remoteAdminClientClose(client, flags)) < 0)
+        goto error;
+
+    return ret;
+ error:
+    virDispatchError(NULL);
+    return -1;
+}
index affe8c113351e623c58ef07cdfe7ffba03b0bb5f..e55b91eafd973bc4f6eb5894cedc7cd1a1e1406a 100644 (file)
@@ -6,6 +6,7 @@
 #
 
 # admin/admin_protocol.x
+xdr_admin_client_close_args;
 xdr_admin_client_get_info_args;
 xdr_admin_client_get_info_ret;
 xdr_admin_connect_get_lib_version_ret;
index 27e4a1deedcb9b4b572120699ed98775bbdeda02..57df1f436b61e8e6181e742c2131917efe7b656a 100644 (file)
@@ -34,4 +34,5 @@ LIBVIRT_ADMIN_1.3.0 {
         virAdmServerSetThreadPoolParameters;
         virAdmServerListClients;
         virAdmClientGetInfo;
+        virAdmClientClose;
 };