libvirt/examples/admin/list_clients.c
Erik Skultety fbb8205de3 examples: admin: Add some examples for the new admin APIs
Some of the examples make use of asprintf and strtol functions (to keep
things simple) which are prohibited to use within our code (enforced by
syntax-check). Therefore besides adding some examples, this patch also updates
cfg.mk to exclude examples directory from asprintf and strtol rules, as well as
updates .gitignore to exclude all the new admin binaries created in the
'examples' dir.

Signed-off-by: Erik Skultety <eskultet@redhat.com>
2016-06-26 00:21:06 +02:00

112 lines
3.0 KiB
C

#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#include<libvirt/libvirt-admin.h>
static const char *
exampleTransportToString(int transport)
{
const char *str = NULL;
switch ((virClientTransport) transport) {
case VIR_CLIENT_TRANS_UNIX:
str = "unix";
break;
case VIR_CLIENT_TRANS_TCP:
str = "tcp";
break;
case VIR_CLIENT_TRANS_TLS:
str = "tls";
break;
}
return str ? str : "unknown";
}
static char *
exampleGetTimeStr(time_t then)
{
char *ret = NULL;
struct tm timeinfo;
if (!localtime_r(&then, &timeinfo))
return NULL;
if (!(ret = calloc(64, sizeof(char))))
return NULL;
if (strftime(ret, 64, "%Y-%m-%d %H:%M:%S%z",
&timeinfo) == 0) {
free(ret);
return NULL;
}
return ret;
}
int main(int argc, char **argv)
{
int ret = -1;
virAdmConnectPtr conn = NULL;
virAdmServerPtr srv = NULL; /* which server list the clients from */
virAdmClientPtr *clients = NULL; /* where to store the servers */
size_t i = 0;
int count = 0;
if (argc != 2) {
fprintf(stderr, "One argument specifying the server to list connected "
"clients for is expected\n");
return -1;
}
/* first, open a connection to the daemon */
if (!(conn = virAdmConnectOpen(NULL, 0)))
return -1;
/* first a virAdmServerPtr handle is necessary to obtain, that is done by
* doing a lookup for specific server, let's get a handle on "libvirtd"
* server
*/
if (!(srv = virAdmConnectLookupServer(conn, argv[1], 0)))
goto cleanup;
/* now get the currently connected clients to server @srv */
if ((count = virAdmServerListClients(srv, &clients, 0)) < 0)
goto cleanup;
/* let's print the currently connected clients and some basic info about
* them, we have 2 options how to interate over the returned list,
* use @count as the boundary or use the fact that @clients are guaranteed
* to contain 1 extra element NULL;
* this example uses the first option
*/
printf(" %-5s %-15s %-15s\n%s\n", "Id", "Transport", "Connected since",
"--------------------------------------------------");
for (i = 0; i < count; i++) {
virAdmClientPtr client = clients[i];
unsigned long long id = virAdmClientGetID(client);
int transport = virAdmClientGetTransport(client);
char * timestr = NULL;
if (!(timestr =
exampleGetTimeStr(virAdmClientGetTimestamp(client))))
goto cleanup;
printf(" %-5llu %-15s %-15s\n", id,
exampleTransportToString(transport), timestr);
free(timestr);
}
ret = 0;
cleanup:
/* Once finished, free the list of clients, free the server handle and
* close the connection properly, @conn will be deallocated automatically
*/
for (i = 0; i < count; i++)
virAdmClientFree(clients[i]);
free(clients);
virAdmServerFree(srv);
virAdmConnectClose(conn);
return ret;
}