On 04.05.2016 16:46, Erik Skultety wrote: > 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@xxxxxxxxxx> > --- > daemon/admin.c | 6 ++++++ > daemon/admin_server.c | 9 +++++++++ > daemon/admin_server.h | 3 +++ > include/libvirt/libvirt-admin.h | 2 ++ > src/admin/admin_protocol.x | 12 +++++++++++- > src/admin_protocol-structs | 5 +++++ > src/libvirt-admin.c | 30 ++++++++++++++++++++++++++++++ > src/libvirt_admin_private.syms | 1 + > src/libvirt_admin_public.syms | 1 + > 9 files changed, 68 insertions(+), 1 deletion(-) > > diff --git a/daemon/admin.c b/daemon/admin.c > index 3de09ca..5fa906f 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 2fc4675..93a463a 100644 > --- a/daemon/admin_server.c > +++ b/daemon/admin_server.c > @@ -303,3 +303,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 95c76b9..2953e10 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 0a1ea61..4e6074e 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 67bdbf3..1da7f90 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<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 > }; > diff --git a/src/admin_protocol-structs b/src/admin_protocol-structs > index ea9adf6..b4db415 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 4ad816b..4c86dd7 100644 > --- a/src/libvirt-admin.c > +++ b/src/libvirt-admin.c > @@ -976,3 +976,33 @@ 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); > + virCheckFlagsGoto(0, error); Ewww. No. This should be checked on the server side. Not client. > + > + 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 affe8c1..e55b91e 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 27e4a1d..57df1f4 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; > }; > Michal -- libvir-list mailing list libvir-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/libvir-list