From 5792fabb7b712749147e9d03348c798dc1943651 Mon Sep 17 00:00:00 2001 From: Martin Kletzander Date: Wed, 15 Apr 2015 16:35:42 +0200 Subject: [PATCH] admin: Add virAdmHello function 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 --- daemon/admin_server.c | 23 +++++++++++++++++++++++ include/libvirt/libvirt-admin.h | 1 + po/POTFILES.in | 1 + src/admin/admin_protocol.x | 16 +++++++++++++++- src/admin_protocol-structs | 7 +++++++ src/libvirt-admin.c | 26 ++++++++++++++++++++++++++ src/libvirt_admin.syms | 1 + 7 files changed, 74 insertions(+), 1 deletion(-) diff --git a/daemon/admin_server.c b/daemon/admin_server.c index 712a44beca..76d0b28d74 100644 --- a/daemon/admin_server.c +++ b/daemon/admin_server.c @@ -114,4 +114,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 b3cfc93fcb..27178b45ef 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 189e2cc2f4..31f03d9e44 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 1a2e94ee86..70954ccb87 100644 --- a/src/admin/admin_protocol.x +++ b/src/admin/admin_protocol.x @@ -43,6 +43,15 @@ struct admin_connect_open_args { unsigned int flags; }; +struct admin_hello_args { + unsigned int flags; +}; + +struct admin_hello_ret { + admin_string greeting; +}; + + /* Define the program number, protocol version and procedure numbers here. */ const ADMIN_PROGRAM = 0x06900690; const ADMIN_PROTOCOL_VERSION = 1; @@ -73,5 +82,10 @@ enum admin_procedure { /** * @generate: client */ - ADMIN_PROC_CONNECT_CLOSE = 2 + ADMIN_PROC_CONNECT_CLOSE = 2, + + /** + * @generate: both + */ + ADMIN_PROC_HELLO = 3 }; diff --git a/src/admin_protocol-structs b/src/admin_protocol-structs index 3ac31fa253..f91f7013ad 100644 --- a/src/admin_protocol-structs +++ b/src/admin_protocol-structs @@ -2,7 +2,14 @@ struct admin_connect_open_args { u_int flags; }; +struct admin_hello_args { + u_int flags; +}; +struct admin_hello_ret { + admin_string greeting; +}; enum admin_procedure { ADMIN_PROC_CONNECT_OPEN = 1, ADMIN_PROC_CONNECT_CLOSE = 2, + ADMIN_PROC_HELLO = 3, }; diff --git a/src/libvirt-admin.c b/src/libvirt-admin.c index 11b6fe3238..107e27e430 100644 --- a/src/libvirt-admin.c +++ b/src/libvirt-admin.c @@ -384,3 +384,29 @@ virAdmConnectRef(virAdmConnectPtr conn) return 0; } + + +/** + * virAdmHello: + * @conn: a connection object + * @flags: unused, 0 for now + * + * Testing function. + * + * Returns the number of connected clients as a string. Yes, as a + * string. Because it's just for testing. + */ +char * +virAdmHello(virAdmConnectPtr conn, + unsigned int flags) +{ + char *ret = NULL; + + virResetLastError(); + + ret = remoteAdminHello(conn, flags); + if (!ret) + virDispatchError(NULL); + + return ret; +} diff --git a/src/libvirt_admin.syms b/src/libvirt_admin.syms index d9e3c0b1b9..a3c9e5fc3e 100644 --- a/src/libvirt_admin.syms +++ b/src/libvirt_admin.syms @@ -15,4 +15,5 @@ LIBVIRT_ADMIN_1.3.0 { virAdmConnectOpen; virAdmConnectClose; virAdmConnectRef; + virAdmHello; };