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; };