[libvirt] [EXAMPLE PATCH 12/13] admin: Add virAdmHello function
Michal Privoznik
mprivozn at redhat.com
Thu May 21 15:46:48 UTC 2015
On 20.05.2015 07:19, Martin Kletzander wrote:
> Just one of the simplest functions that returns string "Clients: X"
> where X is the number of connected clients to daemon's first
> subserver (the original one), so it can be tested using virsh, ipython,
> etc.
>
> The subserver is gathered by incrementing its reference
> counter (similarly to getting qemu capabilities), so there is no
> deadlock with admin subserver in this API.
>
> Here you can see how functions should be named in the client (virAdm*)
> and server (adm*).
>
> There is also a parameter @flags that must be 0, which helps testing
> proper error propagation into the client.
>
> Signed-off-by: Martin Kletzander <mkletzan at redhat.com>
> ---
> daemon/admin_server.c | 23 +++++++++++++++++++++++
> include/libvirt/libvirt-admin.h | 1 +
> po/POTFILES.in | 1 +
> src/admin/admin_protocol.x | 15 ++++++++++++++-
> src/admin_protocol-structs | 9 +++++++++
> src/libvirt-admin.c | 26 ++++++++++++++++++++++++++
> src/libvirt_admin.syms | 1 +
> 7 files changed, 75 insertions(+), 1 deletion(-)
>
> diff --git a/daemon/admin_server.c b/daemon/admin_server.c
> index 810908b..e722757 100644
> --- a/daemon/admin_server.c
> +++ b/daemon/admin_server.c
> @@ -113,4 +113,27 @@ adminDispatchConnectClose(virNetServerPtr server ATTRIBUTE_UNUSED,
> return 0;
> }
>
> +
> +static char *
> +admHello(virNetDaemonPtr dmn,
> + unsigned int flags)
> +{
> + char *ret = NULL;
> + virNetServerPtr srv = NULL;
> + size_t nclients;
> +
> + virCheckFlags(0, NULL);
> +
> + if (!(srv = virNetDaemonGetServer(dmn, 0)))
> + return NULL;
> +
> + nclients = virNetServerGetNClients(srv);
> + if (virAsprintf(&ret, "Clients: %zu", nclients) < 0)
> + goto cleanup;
> +
> + cleanup:
> + virObjectUnref(srv);
> + return ret;
> +}
> +
> #include "admin_dispatch.h"
> diff --git a/include/libvirt/libvirt-admin.h b/include/libvirt/libvirt-admin.h
> index b3cfc93..27178b4 100644
> --- a/include/libvirt/libvirt-admin.h
> +++ b/include/libvirt/libvirt-admin.h
> @@ -54,6 +54,7 @@ virAdmConnectPtr virAdmConnectOpen(const char *name, unsigned int flags);
> int virAdmConnectClose(virAdmConnectPtr conn);
>
> int virAdmConnectRef(virAdmConnectPtr conn);
> +char *virAdmHello(virAdmConnectPtr conn, unsigned int flags);
>
> # ifdef __cplusplus
> }
> diff --git a/po/POTFILES.in b/po/POTFILES.in
> index 189e2cc..31f03d9 100644
> --- a/po/POTFILES.in
> +++ b/po/POTFILES.in
> @@ -1,3 +1,4 @@
> +daemon/admin_dispatch.h
> daemon/admin_server.c
> daemon/libvirtd-config.c
> daemon/libvirtd.c
> diff --git a/src/admin/admin_protocol.x b/src/admin/admin_protocol.x
> index 63f6a53..03b98ec 100644
> --- a/src/admin/admin_protocol.x
> +++ b/src/admin/admin_protocol.x
> @@ -30,6 +30,14 @@ struct admin_connect_open_args {
> unsigned int flags;
> };
>
> +struct admin_hello_args {
> + unsigned int flags;
> +};
> +
> +struct admin_hello_ret {
> + remote_string greeting;
A-ha! Now I see why you wanted to drag in remote_protocol.c (my comment
to 7/13). Well, if you:
const REMOTE_STRING_MAX = 4194304;
/* A long string, which may NOT be NULL. */
typedef string remote_nonnull_string<REMOTE_STRING_MAX>;
/* A long string, which may be NULL. */
typedef remote_nonnull_string *remote_string;
then you don't need anymore.
> +};
> +
>
Michal
More information about the libvir-list
mailing list