|
Packit |
a07778 |
#include <config.h>
|
|
Packit |
a07778 |
#include <stdio.h>
|
|
Packit |
a07778 |
#include <string.h>
|
|
Packit |
a07778 |
|
|
Packit |
a07778 |
#include <glib.h>
|
|
Packit |
a07778 |
#include <libvirt/libvirt.h>
|
|
Packit |
a07778 |
#include <libvirt-glib/libvirt-glib.h>
|
|
Packit |
a07778 |
|
|
Packit |
a07778 |
#define STREQ(a,b) (strcmp((a),(b)) == 0)
|
|
Packit |
a07778 |
|
|
Packit |
a07778 |
#ifndef ATTRIBUTE_UNUSED
|
|
Packit |
a07778 |
#define ATTRIBUTE_UNUSED __attribute__((__unused__))
|
|
Packit |
a07778 |
#endif
|
|
Packit |
a07778 |
|
|
Packit |
a07778 |
/* Prototypes */
|
|
Packit |
a07778 |
const char *eventToString(int event);
|
|
Packit |
a07778 |
int myDomainEventCallback1 (virConnectPtr conn, virDomainPtr dom, int event, int detail, void *opaque);
|
|
Packit |
a07778 |
int myDomainEventCallback2 (virConnectPtr conn, virDomainPtr dom, int event, int detail, void *opaque);
|
|
Packit |
a07778 |
|
|
Packit |
a07778 |
void usage(const char *pname);
|
|
Packit |
a07778 |
|
|
Packit |
a07778 |
/* Callback functions */
|
|
Packit |
a07778 |
|
|
Packit |
a07778 |
const char *eventToString(int event) {
|
|
Packit |
a07778 |
const char *ret = NULL;
|
|
Packit |
a07778 |
switch(event) {
|
|
Packit |
a07778 |
case VIR_DOMAIN_EVENT_DEFINED:
|
|
Packit |
a07778 |
ret ="Defined";
|
|
Packit |
a07778 |
break;
|
|
Packit |
a07778 |
case VIR_DOMAIN_EVENT_UNDEFINED:
|
|
Packit |
a07778 |
ret ="Undefined";
|
|
Packit |
a07778 |
break;
|
|
Packit |
a07778 |
case VIR_DOMAIN_EVENT_STARTED:
|
|
Packit |
a07778 |
ret ="Started";
|
|
Packit |
a07778 |
break;
|
|
Packit |
a07778 |
case VIR_DOMAIN_EVENT_SUSPENDED:
|
|
Packit |
a07778 |
ret ="Suspended";
|
|
Packit |
a07778 |
break;
|
|
Packit |
a07778 |
case VIR_DOMAIN_EVENT_RESUMED:
|
|
Packit |
a07778 |
ret ="Resumed";
|
|
Packit |
a07778 |
break;
|
|
Packit |
a07778 |
case VIR_DOMAIN_EVENT_STOPPED:
|
|
Packit |
a07778 |
ret ="Stopped";
|
|
Packit |
a07778 |
break;
|
|
Packit |
a07778 |
default:
|
|
Packit |
a07778 |
ret ="Unknown Event";
|
|
Packit |
a07778 |
}
|
|
Packit |
a07778 |
return ret;
|
|
Packit |
a07778 |
}
|
|
Packit |
a07778 |
|
|
Packit |
a07778 |
static const char *eventDetailToString(int event, int detail) {
|
|
Packit |
a07778 |
const char *ret = "";
|
|
Packit |
a07778 |
switch(event) {
|
|
Packit |
a07778 |
case VIR_DOMAIN_EVENT_DEFINED:
|
|
Packit |
a07778 |
if (detail == VIR_DOMAIN_EVENT_DEFINED_ADDED)
|
|
Packit |
a07778 |
ret = "Added";
|
|
Packit |
a07778 |
else if (detail == VIR_DOMAIN_EVENT_DEFINED_UPDATED)
|
|
Packit |
a07778 |
ret = "Updated";
|
|
Packit |
a07778 |
break;
|
|
Packit |
a07778 |
case VIR_DOMAIN_EVENT_UNDEFINED:
|
|
Packit |
a07778 |
if (detail == VIR_DOMAIN_EVENT_UNDEFINED_REMOVED)
|
|
Packit |
a07778 |
ret = "Removed";
|
|
Packit |
a07778 |
break;
|
|
Packit |
a07778 |
case VIR_DOMAIN_EVENT_STARTED:
|
|
Packit |
a07778 |
switch (detail) {
|
|
Packit |
a07778 |
case VIR_DOMAIN_EVENT_STARTED_BOOTED:
|
|
Packit |
a07778 |
ret = "Booted";
|
|
Packit |
a07778 |
break;
|
|
Packit |
a07778 |
case VIR_DOMAIN_EVENT_STARTED_MIGRATED:
|
|
Packit |
a07778 |
ret = "Migrated";
|
|
Packit |
a07778 |
break;
|
|
Packit |
a07778 |
case VIR_DOMAIN_EVENT_STARTED_RESTORED:
|
|
Packit |
a07778 |
ret = "Restored";
|
|
Packit |
a07778 |
break;
|
|
Packit |
a07778 |
default:
|
|
Packit |
a07778 |
break;
|
|
Packit |
a07778 |
}
|
|
Packit |
a07778 |
break;
|
|
Packit |
a07778 |
case VIR_DOMAIN_EVENT_SUSPENDED:
|
|
Packit |
a07778 |
if (detail == VIR_DOMAIN_EVENT_SUSPENDED_PAUSED)
|
|
Packit |
a07778 |
ret = "Paused";
|
|
Packit |
a07778 |
else if (detail == VIR_DOMAIN_EVENT_SUSPENDED_MIGRATED)
|
|
Packit |
a07778 |
ret = "Migrated";
|
|
Packit |
a07778 |
break;
|
|
Packit |
a07778 |
case VIR_DOMAIN_EVENT_RESUMED:
|
|
Packit |
a07778 |
if (detail == VIR_DOMAIN_EVENT_RESUMED_UNPAUSED)
|
|
Packit |
a07778 |
ret = "Unpaused";
|
|
Packit |
a07778 |
else if (detail == VIR_DOMAIN_EVENT_RESUMED_MIGRATED)
|
|
Packit |
a07778 |
ret = "Migrated";
|
|
Packit |
a07778 |
break;
|
|
Packit |
a07778 |
case VIR_DOMAIN_EVENT_STOPPED:
|
|
Packit |
a07778 |
switch (detail) {
|
|
Packit |
a07778 |
case VIR_DOMAIN_EVENT_STOPPED_SHUTDOWN:
|
|
Packit |
a07778 |
ret = "Shutdown";
|
|
Packit |
a07778 |
break;
|
|
Packit |
a07778 |
case VIR_DOMAIN_EVENT_STOPPED_DESTROYED:
|
|
Packit |
a07778 |
ret = "Destroyed";
|
|
Packit |
a07778 |
break;
|
|
Packit |
a07778 |
case VIR_DOMAIN_EVENT_STOPPED_CRASHED:
|
|
Packit |
a07778 |
ret = "Crashed";
|
|
Packit |
a07778 |
break;
|
|
Packit |
a07778 |
case VIR_DOMAIN_EVENT_STOPPED_MIGRATED:
|
|
Packit |
a07778 |
ret = "Migrated";
|
|
Packit |
a07778 |
break;
|
|
Packit |
a07778 |
case VIR_DOMAIN_EVENT_STOPPED_SAVED:
|
|
Packit |
a07778 |
ret = "Saved";
|
|
Packit |
a07778 |
break;
|
|
Packit |
a07778 |
case VIR_DOMAIN_EVENT_STOPPED_FAILED:
|
|
Packit |
a07778 |
ret = "Failed";
|
|
Packit |
a07778 |
break;
|
|
Packit |
a07778 |
default:
|
|
Packit |
a07778 |
break;
|
|
Packit |
a07778 |
}
|
|
Packit |
a07778 |
break;
|
|
Packit |
a07778 |
default:
|
|
Packit |
a07778 |
break;
|
|
Packit |
a07778 |
}
|
|
Packit |
a07778 |
return ret;
|
|
Packit |
a07778 |
}
|
|
Packit |
a07778 |
|
|
Packit |
a07778 |
|
|
Packit |
a07778 |
int myDomainEventCallback1 (virConnectPtr conn ATTRIBUTE_UNUSED,
|
|
Packit |
a07778 |
virDomainPtr dom,
|
|
Packit |
a07778 |
int event,
|
|
Packit |
a07778 |
int detail,
|
|
Packit |
a07778 |
void *opaque ATTRIBUTE_UNUSED)
|
|
Packit |
a07778 |
{
|
|
Packit |
a07778 |
printf("%s EVENT: Domain %s(%d) %s: %s\n", __FUNCTION__,
|
|
Packit |
a07778 |
virDomainGetName(dom), virDomainGetID(dom),
|
|
Packit |
a07778 |
eventToString(event),
|
|
Packit |
a07778 |
eventDetailToString(event, detail));
|
|
Packit |
a07778 |
|
|
Packit |
a07778 |
return 0;
|
|
Packit |
a07778 |
}
|
|
Packit |
a07778 |
|
|
Packit |
a07778 |
int myDomainEventCallback2 (virConnectPtr conn ATTRIBUTE_UNUSED,
|
|
Packit |
a07778 |
virDomainPtr dom,
|
|
Packit |
a07778 |
int event,
|
|
Packit |
a07778 |
int detail,
|
|
Packit |
a07778 |
void *opaque ATTRIBUTE_UNUSED)
|
|
Packit |
a07778 |
{
|
|
Packit |
a07778 |
printf("%s EVENT: Domain %s(%d) %s: %s\n", __FUNCTION__,
|
|
Packit |
a07778 |
virDomainGetName(dom), virDomainGetID(dom),
|
|
Packit |
a07778 |
eventToString(event),
|
|
Packit |
a07778 |
eventDetailToString(event, detail));
|
|
Packit |
a07778 |
|
|
Packit |
a07778 |
return 0;
|
|
Packit |
a07778 |
}
|
|
Packit |
a07778 |
|
|
Packit |
a07778 |
/* main test functions */
|
|
Packit |
a07778 |
|
|
Packit |
a07778 |
void usage(const char *pname)
|
|
Packit |
a07778 |
{
|
|
Packit |
a07778 |
printf("%s uri\n", pname);
|
|
Packit |
a07778 |
}
|
|
Packit |
a07778 |
|
|
Packit |
a07778 |
int main(int argc, char **argv)
|
|
Packit |
a07778 |
{
|
|
Packit |
a07778 |
GMainLoop *loop;
|
|
Packit |
a07778 |
|
|
Packit |
a07778 |
gvir_init(&argc, &argv);
|
|
Packit |
a07778 |
|
|
Packit |
a07778 |
if(argc > 1 && STREQ(argv[1],"--help")) {
|
|
Packit |
a07778 |
usage(argv[0]);
|
|
Packit |
a07778 |
return -1;
|
|
Packit |
a07778 |
}
|
|
Packit |
a07778 |
loop = g_main_loop_new(g_main_context_default(), 1);
|
|
Packit |
a07778 |
|
|
Packit |
a07778 |
gvir_event_register();
|
|
Packit |
a07778 |
|
|
Packit |
a07778 |
virConnectPtr dconn = NULL;
|
|
Packit |
a07778 |
dconn = virConnectOpen (argv[1] ? argv[1] : NULL);
|
|
Packit |
a07778 |
if (!dconn) {
|
|
Packit |
a07778 |
printf("error opening\n");
|
|
Packit |
a07778 |
return -1;
|
|
Packit |
a07778 |
}
|
|
Packit |
a07778 |
|
|
Packit |
a07778 |
g_debug("Registering domain event cbs");
|
|
Packit |
a07778 |
|
|
Packit |
a07778 |
/* Add 2 callbacks to prove this works with more than just one */
|
|
Packit |
a07778 |
virConnectDomainEventRegister(dconn, myDomainEventCallback1, NULL, NULL);
|
|
Packit |
a07778 |
virConnectDomainEventRegister(dconn, myDomainEventCallback2, NULL, NULL);
|
|
Packit |
a07778 |
|
|
Packit |
a07778 |
g_main_loop_run(loop);
|
|
Packit |
a07778 |
|
|
Packit |
a07778 |
if (virConnectClose(dconn) < 0)
|
|
Packit |
a07778 |
printf("error closing\n");
|
|
Packit |
a07778 |
|
|
Packit |
a07778 |
printf("done\n");
|
|
Packit |
a07778 |
return 0;
|
|
Packit |
a07778 |
}
|