diff --git a/daemon/admin.c b/daemon/admin.c index dbf49dddc1a6dd76d76313c9b60d093f164b81fc..03774d735dda382675369c95d701a4277bfd8fa4 100644 --- a/daemon/admin.c +++ b/daemon/admin.c @@ -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) diff --git a/daemon/admin_server.c b/daemon/admin_server.c index 41f6e827360498a13e65f1c5bf054bad92567126..9f4068824e9e5fba926b83a6a8f857f4c1303f44 100644 --- a/daemon/admin_server.c +++ b/daemon/admin_server.c @@ -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; +} diff --git a/daemon/admin_server.h b/daemon/admin_server.h index 95c76b9e0f39640d76a11c8e6a50f7c29d6495fb..2953e108b60bf70720adbb0d456cef51bd02e87f 100644 --- a/daemon/admin_server.h +++ b/daemon/admin_server.h @@ -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__ */ diff --git a/include/libvirt/libvirt-admin.h b/include/libvirt/libvirt-admin.h index 0a1ea61e33e04ff18be10d0ab286336ec56a689e..4e6074e6a335232702dac32b072609c7def1bd25 100644 --- a/include/libvirt/libvirt-admin.h +++ b/include/libvirt/libvirt-admin.h @@ -349,6 +349,8 @@ int virAdmClientGetInfo(virAdmClientPtr client, int *nparams, unsigned int flags); +int virAdmClientClose(virAdmClientPtr client, unsigned int flags); + # ifdef __cplusplus } # endif diff --git a/src/admin/admin_protocol.x b/src/admin/admin_protocol.x index 67bdbf30eecba30d41bc87561570986f23ca518f..1da7f901ff242e8c85943ab927acca119594a173 100644 --- a/src/admin/admin_protocol.x +++ b/src/admin/admin_protocol.x @@ -160,6 +160,11 @@ struct admin_client_get_info_ret { /* insert@1 */ admin_typed_param params; }; +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 }; diff --git a/src/admin_protocol-structs b/src/admin_protocol-structs index ea9adf6c3c16c8ee22102ef9f7fb071cbcdf62a7..b4db415bdae5b7250199fba6fcd424ab00a828b4 100644 --- a/src/admin_protocol-structs +++ b/src/admin_protocol-structs @@ -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, }; diff --git a/src/libvirt-admin.c b/src/libvirt-admin.c index 140fff37b5dd60ffed122aae4010ec7633f4dbbf..9d5e5b99ff622afd63904567d58d7d0f4f9ec25a 100644 --- a/src/libvirt-admin.c +++ b/src/libvirt-admin.c @@ -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; +} diff --git a/src/libvirt_admin_private.syms b/src/libvirt_admin_private.syms index affe8c113351e623c58ef07cdfe7ffba03b0bb5f..e55b91eafd973bc4f6eb5894cedc7cd1a1e1406a 100644 --- a/src/libvirt_admin_private.syms +++ b/src/libvirt_admin_private.syms @@ -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; diff --git a/src/libvirt_admin_public.syms b/src/libvirt_admin_public.syms index 27e4a1deedcb9b4b572120699ed98775bbdeda02..57df1f436b61e8e6181e742c2131917efe7b656a 100644 --- a/src/libvirt_admin_public.syms +++ b/src/libvirt_admin_public.syms @@ -34,4 +34,5 @@ LIBVIRT_ADMIN_1.3.0 { virAdmServerSetThreadPoolParameters; virAdmServerListClients; virAdmClientGetInfo; + virAdmClientClose; };