[libvirt] [PATCH 1/6] Move examples/domain-events/event-c to examples/object-events

Daniel P. Berrange berrange at redhat.com
Wed Dec 11 15:28:21 UTC 2013


From: "Daniel P. Berrange" <berrange at redhat.com>

The domain events demo program isn't really tied to domain
events anymore, so rename it to object events.

Signed-off-by: Daniel P. Berrange <berrange at redhat.com>
---
 Makefile.am                                  |   2 +-
 configure.ac                                 |   2 +-
 examples/domain-events/events-c/Makefile.am  |  24 -
 examples/domain-events/events-c/event-test.c | 644 ---------------------------
 examples/object-events/Makefile.am           |  24 +
 examples/object-events/event-test.c          | 644 +++++++++++++++++++++++++++
 6 files changed, 670 insertions(+), 670 deletions(-)
 delete mode 100644 examples/domain-events/events-c/Makefile.am
 delete mode 100644 examples/domain-events/events-c/event-test.c
 create mode 100644 examples/object-events/Makefile.am
 create mode 100644 examples/object-events/event-test.c

diff --git a/Makefile.am b/Makefile.am
index 2cbf71a..88c7073 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -20,7 +20,7 @@ LCOV = lcov
 GENHTML = genhtml
 
 SUBDIRS = . gnulib/lib include src daemon tools docs gnulib/tests \
-  tests po examples/domain-events/events-c examples/hellolibvirt \
+  tests po examples/object-events examples/hellolibvirt \
   examples/dominfo examples/apparmor examples/xml/nwfilter \
   examples/openauth examples/systemtap
 
diff --git a/configure.ac b/configure.ac
index 4465e01..d99e0df 100644
--- a/configure.ac
+++ b/configure.ac
@@ -2554,7 +2554,7 @@ AC_CONFIG_FILES([\
         tools/Makefile \
         tests/Makefile \
         examples/apparmor/Makefile \
-        examples/domain-events/events-c/Makefile \
+        examples/object-events/Makefile \
         examples/dominfo/Makefile \
         examples/openauth/Makefile \
         examples/hellolibvirt/Makefile \
diff --git a/examples/domain-events/events-c/Makefile.am b/examples/domain-events/events-c/Makefile.am
deleted file mode 100644
index 86500a0..0000000
--- a/examples/domain-events/events-c/Makefile.am
+++ /dev/null
@@ -1,24 +0,0 @@
-## Copyright (C) 2005-2011, 2013 Red Hat, Inc.
-##
-## This library is free software; you can redistribute it and/or
-## modify it under the terms of the GNU Lesser General Public
-## License as published by the Free Software Foundation; either
-## version 2.1 of the License, or (at your option) any later version.
-##
-## This library is distributed in the hope that it will be useful,
-## but WITHOUT ANY WARRANTY; without even the implied warranty of
-## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-## Lesser General Public License for more details.
-##
-## You should have received a copy of the GNU Lesser General Public
-## License along with this library.  If not, see
-## <http://www.gnu.org/licenses/>.
-
-INCLUDES = -I$(top_builddir)/include -I$(top_srcdir)/include \
-	   -I$(top_builddir)/gnulib/lib -I$(top_srcdir)/gnulib/lib \
-	   -I$(top_srcdir)
-noinst_PROGRAMS = event-test
-event_test_CFLAGS = $(WARN_CFLAGS)
-event_test_SOURCES = event-test.c
-event_test_LDADD = $(top_builddir)/src/libvirt.la \
-		 $(top_builddir)/gnulib/lib/libgnu.la
diff --git a/examples/domain-events/events-c/event-test.c b/examples/domain-events/events-c/event-test.c
deleted file mode 100644
index 52aa3d0..0000000
--- a/examples/domain-events/events-c/event-test.c
+++ /dev/null
@@ -1,644 +0,0 @@
-#include <config.h>
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <signal.h>
-#include <inttypes.h>
-
-#include <libvirt/libvirt.h>
-#include <libvirt/virterror.h>
-
-#define VIR_DEBUG(fmt) printf("%s:%d: " fmt "\n", __func__, __LINE__)
-#define STREQ(a,b) (strcmp(a,b) == 0)
-
-#ifndef ATTRIBUTE_UNUSED
-# define ATTRIBUTE_UNUSED __attribute__((__unused__))
-#endif
-
-int run = 1;
-
-/* Prototypes */
-const char *eventToString(int event);
-int myEventAddHandleFunc  (int fd, int event,
-                           virEventHandleCallback cb,
-                           void *opaque,
-                           virFreeCallback ff);
-void myEventUpdateHandleFunc(int watch, int event);
-int  myEventRemoveHandleFunc(int watch);
-
-int myEventAddTimeoutFunc(int timeout,
-                          virEventTimeoutCallback cb,
-                          void *opaque,
-                          virFreeCallback ff);
-void myEventUpdateTimeoutFunc(int timer, int timout);
-int myEventRemoveTimeoutFunc(int timer);
-
-int myEventHandleTypeToPollEvent(virEventHandleType events);
-virEventHandleType myPollEventToEventHandleType(int events);
-
-void usage(const char *pname);
-
-/* Callback functions */
-
-
-static void connectClose(virConnectPtr conn ATTRIBUTE_UNUSED,
-                         int reason,
-                         void *opaque ATTRIBUTE_UNUSED)
-{
-    switch (reason) {
-    case VIR_CONNECT_CLOSE_REASON_ERROR:
-        fprintf(stderr, "Connection closed due to I/O error\n");
-        break;
-    case VIR_CONNECT_CLOSE_REASON_EOF:
-        fprintf(stderr, "Connection closed due to end of file\n");
-        break;
-    case VIR_CONNECT_CLOSE_REASON_KEEPALIVE:
-        fprintf(stderr, "Connection closed due to keepalive timeout\n");
-        break;
-    case VIR_CONNECT_CLOSE_REASON_CLIENT:
-        fprintf(stderr, "Connection closed due to client request\n");
-        break;
-    default:
-        fprintf(stderr, "Connection closed due to unknown reason\n");
-        break;
-    };
-    run = 0;
-}
-
-const char *eventToString(int event) {
-    const char *ret = "";
-    switch ((virDomainEventType) event) {
-        case VIR_DOMAIN_EVENT_DEFINED:
-            ret ="Defined";
-            break;
-        case VIR_DOMAIN_EVENT_UNDEFINED:
-            ret ="Undefined";
-            break;
-        case VIR_DOMAIN_EVENT_STARTED:
-            ret ="Started";
-            break;
-        case VIR_DOMAIN_EVENT_SUSPENDED:
-            ret ="Suspended";
-            break;
-        case VIR_DOMAIN_EVENT_RESUMED:
-            ret ="Resumed";
-            break;
-        case VIR_DOMAIN_EVENT_STOPPED:
-            ret ="Stopped";
-            break;
-        case VIR_DOMAIN_EVENT_SHUTDOWN:
-            ret = "Shutdown";
-            break;
-        case VIR_DOMAIN_EVENT_PMSUSPENDED:
-            ret = "PMSuspended";
-            break;
-        case VIR_DOMAIN_EVENT_CRASHED:
-            ret = "Crashed";
-            break;
-    }
-    return ret;
-}
-
-static const char *eventDetailToString(int event, int detail) {
-    const char *ret = "";
-    switch ((virDomainEventType) event) {
-        case VIR_DOMAIN_EVENT_DEFINED:
-            if (detail == VIR_DOMAIN_EVENT_DEFINED_ADDED)
-                ret = "Added";
-            else if (detail == VIR_DOMAIN_EVENT_DEFINED_UPDATED)
-                ret = "Updated";
-            break;
-        case VIR_DOMAIN_EVENT_UNDEFINED:
-            if (detail == VIR_DOMAIN_EVENT_UNDEFINED_REMOVED)
-                ret = "Removed";
-            break;
-        case VIR_DOMAIN_EVENT_STARTED:
-            switch ((virDomainEventStartedDetailType) detail) {
-            case VIR_DOMAIN_EVENT_STARTED_BOOTED:
-                ret = "Booted";
-                break;
-            case VIR_DOMAIN_EVENT_STARTED_MIGRATED:
-                ret = "Migrated";
-                break;
-            case VIR_DOMAIN_EVENT_STARTED_RESTORED:
-                ret = "Restored";
-                break;
-            case VIR_DOMAIN_EVENT_STARTED_FROM_SNAPSHOT:
-                ret = "Snapshot";
-                break;
-            case VIR_DOMAIN_EVENT_STARTED_WAKEUP:
-                ret = "Event wakeup";
-                break;
-            }
-            break;
-        case VIR_DOMAIN_EVENT_SUSPENDED:
-            switch ((virDomainEventSuspendedDetailType) detail) {
-            case VIR_DOMAIN_EVENT_SUSPENDED_PAUSED:
-                ret = "Paused";
-                break;
-            case VIR_DOMAIN_EVENT_SUSPENDED_MIGRATED:
-                ret = "Migrated";
-                break;
-            case VIR_DOMAIN_EVENT_SUSPENDED_IOERROR:
-                ret = "I/O Error";
-                break;
-            case VIR_DOMAIN_EVENT_SUSPENDED_WATCHDOG:
-                ret = "Watchdog";
-                break;
-            case VIR_DOMAIN_EVENT_SUSPENDED_RESTORED:
-                ret = "Restored";
-                break;
-            case VIR_DOMAIN_EVENT_SUSPENDED_FROM_SNAPSHOT:
-                ret = "Snapshot";
-                break;
-            case VIR_DOMAIN_EVENT_SUSPENDED_API_ERROR:
-                ret = "API error";
-                break;
-            }
-            break;
-        case VIR_DOMAIN_EVENT_RESUMED:
-            switch ((virDomainEventResumedDetailType) detail) {
-            case VIR_DOMAIN_EVENT_RESUMED_UNPAUSED:
-                ret = "Unpaused";
-                break;
-            case VIR_DOMAIN_EVENT_RESUMED_MIGRATED:
-                ret = "Migrated";
-                break;
-            case VIR_DOMAIN_EVENT_RESUMED_FROM_SNAPSHOT:
-                ret = "Snapshot";
-                break;
-            }
-            break;
-        case VIR_DOMAIN_EVENT_STOPPED:
-            switch ((virDomainEventStoppedDetailType) detail) {
-            case VIR_DOMAIN_EVENT_STOPPED_SHUTDOWN:
-                ret = "Shutdown";
-                break;
-            case VIR_DOMAIN_EVENT_STOPPED_DESTROYED:
-                ret = "Destroyed";
-                break;
-            case VIR_DOMAIN_EVENT_STOPPED_CRASHED:
-                ret = "Crashed";
-                break;
-            case VIR_DOMAIN_EVENT_STOPPED_MIGRATED:
-                ret = "Migrated";
-                break;
-            case VIR_DOMAIN_EVENT_STOPPED_SAVED:
-                ret = "Saved";
-                break;
-            case VIR_DOMAIN_EVENT_STOPPED_FAILED:
-                ret = "Failed";
-                break;
-            case VIR_DOMAIN_EVENT_STOPPED_FROM_SNAPSHOT:
-                ret = "Snapshot";
-                break;
-            }
-            break;
-        case VIR_DOMAIN_EVENT_SHUTDOWN:
-            switch ((virDomainEventShutdownDetailType) detail) {
-            case VIR_DOMAIN_EVENT_SHUTDOWN_FINISHED:
-                ret = "Finished";
-                break;
-            }
-            break;
-        case VIR_DOMAIN_EVENT_PMSUSPENDED:
-            switch ((virDomainEventPMSuspendedDetailType) detail) {
-            case VIR_DOMAIN_EVENT_PMSUSPENDED_MEMORY:
-                ret = "Memory";
-                break;
-            case VIR_DOMAIN_EVENT_PMSUSPENDED_DISK:
-                ret = "Disk";
-                break;
-            }
-            break;
-        case VIR_DOMAIN_EVENT_CRASHED:
-           switch ((virDomainEventCrashedDetailType) detail) {
-           case VIR_DOMAIN_EVENT_CRASHED_PANICKED:
-               ret = "Panicked";
-               break;
-           }
-           break;
-    }
-    return ret;
-}
-
-static int myDomainEventCallback1(virConnectPtr conn ATTRIBUTE_UNUSED,
-                                  virDomainPtr dom,
-                                  int event,
-                                  int detail,
-                                  void *opaque ATTRIBUTE_UNUSED)
-{
-    printf("%s EVENT: Domain %s(%d) %s %s\n", __func__, virDomainGetName(dom),
-           virDomainGetID(dom), eventToString(event),
-           eventDetailToString(event, detail));
-    return 0;
-}
-
-static int myDomainEventCallback2(virConnectPtr conn ATTRIBUTE_UNUSED,
-                                  virDomainPtr dom,
-                                  int event,
-                                  int detail,
-                                  void *opaque ATTRIBUTE_UNUSED)
-{
-    printf("%s EVENT: Domain %s(%d) %s %s\n", __func__, virDomainGetName(dom),
-           virDomainGetID(dom), eventToString(event),
-           eventDetailToString(event, detail));
-    return 0;
-}
-
-static int myDomainEventRebootCallback(virConnectPtr conn ATTRIBUTE_UNUSED,
-                                       virDomainPtr dom,
-                                       void *opaque ATTRIBUTE_UNUSED)
-{
-    printf("%s EVENT: Domain %s(%d) rebooted\n", __func__, virDomainGetName(dom),
-           virDomainGetID(dom));
-
-    return 0;
-}
-
-static int myDomainEventRTCChangeCallback(virConnectPtr conn ATTRIBUTE_UNUSED,
-                                          virDomainPtr dom,
-                                          long long offset,
-                                          void *opaque ATTRIBUTE_UNUSED)
-{
-    printf("%s EVENT: Domain %s(%d) rtc change %" PRIdMAX "\n",
-           __func__, virDomainGetName(dom), virDomainGetID(dom),
-           (intmax_t)offset);
-
-    return 0;
-}
-
-static int myDomainEventBalloonChangeCallback(virConnectPtr conn ATTRIBUTE_UNUSED,
-                                              virDomainPtr dom,
-                                              unsigned long long actual,
-                                              void *opaque ATTRIBUTE_UNUSED)
-{
-    printf("%s EVENT: Domain %s(%d) balloon change %" PRIuMAX "KB\n",
-           __func__, virDomainGetName(dom), virDomainGetID(dom), (uintmax_t)actual);
-
-    return 0;
-}
-
-static int myDomainEventWatchdogCallback(virConnectPtr conn ATTRIBUTE_UNUSED,
-                                         virDomainPtr dom,
-                                         int action,
-                                         void *opaque ATTRIBUTE_UNUSED)
-{
-    printf("%s EVENT: Domain %s(%d) watchdog action=%d\n", __func__, virDomainGetName(dom),
-           virDomainGetID(dom), action);
-
-    return 0;
-}
-
-static int myDomainEventIOErrorCallback(virConnectPtr conn ATTRIBUTE_UNUSED,
-                                        virDomainPtr dom,
-                                        const char *srcPath,
-                                        const char *devAlias,
-                                        int action,
-                                        void *opaque ATTRIBUTE_UNUSED)
-{
-    printf("%s EVENT: Domain %s(%d) io error path=%s alias=%s action=%d\n", __func__, virDomainGetName(dom),
-           virDomainGetID(dom), srcPath, devAlias, action);
-
-    return 0;
-}
-
-static int myDomainEventGraphicsCallback(virConnectPtr conn ATTRIBUTE_UNUSED,
-                                         virDomainPtr dom,
-                                         int phase,
-                                         virDomainEventGraphicsAddressPtr local,
-                                         virDomainEventGraphicsAddressPtr remote,
-                                         const char *authScheme,
-                                         virDomainEventGraphicsSubjectPtr subject,
-                                         void *opaque ATTRIBUTE_UNUSED)
-{
-    size_t i;
-    printf("%s EVENT: Domain %s(%d) graphics ", __func__, virDomainGetName(dom),
-           virDomainGetID(dom));
-
-    switch (phase) {
-    case VIR_DOMAIN_EVENT_GRAPHICS_CONNECT:
-        printf("connected ");
-        break;
-    case VIR_DOMAIN_EVENT_GRAPHICS_INITIALIZE:
-        printf("initialized ");
-        break;
-    case VIR_DOMAIN_EVENT_GRAPHICS_DISCONNECT:
-        printf("disconnected ");
-        break;
-    }
-
-    printf("local: family=%d node=%s service=%s ",
-           local->family, local->node, local->service);
-    printf("remote: family=%d node=%s service=%s ",
-           remote->family, remote->node, remote->service);
-
-    printf("auth: %s ", authScheme);
-    for (i = 0; i < subject->nidentity; i++) {
-        printf(" identity: %s=%s",
-               subject->identities[i].type,
-               subject->identities[i].name);
-    }
-    printf("\n");
-
-    return 0;
-}
-
-static int myDomainEventControlErrorCallback(virConnectPtr conn ATTRIBUTE_UNUSED,
-                                             virDomainPtr dom,
-                                             void *opaque ATTRIBUTE_UNUSED)
-{
-    printf("%s EVENT: Domain %s(%d) control error\n", __func__, virDomainGetName(dom),
-           virDomainGetID(dom));
-
-    return 0;
-}
-
-
-const char *diskChangeReasonStrings[] = {
-    "startupPolicy", /* 0 */
-    /* add new reason here */
-};
-static int myDomainEventDiskChangeCallback(virConnectPtr conn ATTRIBUTE_UNUSED,
-                                           virDomainPtr dom,
-                                           const char *oldSrcPath,
-                                           const char *newSrcPath,
-                                           const char *devAlias,
-                                           int reason,
-                                           void *opaque ATTRIBUTE_UNUSED)
-{
-    printf("%s EVENT: Domain %s(%d) disk change oldSrcPath: %s newSrcPath: %s devAlias: %s reason: %s\n",
-           __func__, virDomainGetName(dom), virDomainGetID(dom),
-           oldSrcPath, newSrcPath, devAlias, diskChangeReasonStrings[reason]);
-    return 0;
-}
-
-const char *trayChangeReasonStrings[] = {
-    "open",
-    "close",
-};
-
-static int myDomainEventTrayChangeCallback(virConnectPtr conn ATTRIBUTE_UNUSED,
-                                           virDomainPtr dom,
-                                           const char *devAlias,
-                                           int reason,
-                                           void *opaque ATTRIBUTE_UNUSED)
-{
-    printf("%s EVENT: Domain %s(%d) removable disk's tray change devAlias: %s reason: %s\n",
-           __func__, virDomainGetName(dom), virDomainGetID(dom),
-           devAlias, trayChangeReasonStrings[reason]);
-    return 0;
-}
-
-static int myDomainEventPMWakeupCallback(virConnectPtr conn ATTRIBUTE_UNUSED,
-                                         virDomainPtr dom,
-                                         int reason ATTRIBUTE_UNUSED,
-                                         void *opaque ATTRIBUTE_UNUSED)
-{
-    printf("%s EVENT: Domain %s(%d) system pmwakeup\n",
-           __func__, virDomainGetName(dom), virDomainGetID(dom));
-    return 0;
-}
-
-static int myDomainEventPMSuspendCallback(virConnectPtr conn ATTRIBUTE_UNUSED,
-                                          virDomainPtr dom,
-                                          int reason ATTRIBUTE_UNUSED,
-                                          void *opaque ATTRIBUTE_UNUSED)
-{
-    printf("%s EVENT: Domain %s(%d) system pmsuspend\n",
-           __func__, virDomainGetName(dom), virDomainGetID(dom));
-    return 0;
-}
-
-static int myDomainEventPMSuspendDiskCallback(virConnectPtr conn ATTRIBUTE_UNUSED,
-                                              virDomainPtr dom,
-                                              int reason ATTRIBUTE_UNUSED,
-                                              void *opaque ATTRIBUTE_UNUSED)
-{
-    printf("%s EVENT: Domain %s(%d) system pmsuspend-disk\n",
-           __func__, virDomainGetName(dom), virDomainGetID(dom));
-    return 0;
-}
-
-static int
-myDomainEventDeviceRemovedCallback(virConnectPtr conn ATTRIBUTE_UNUSED,
-                                   virDomainPtr dom,
-                                   const char *devAlias,
-                                   void *opaque ATTRIBUTE_UNUSED)
-{
-    printf("%s EVENT: Domain %s(%d) device removed: %s\n",
-           __func__, virDomainGetName(dom), virDomainGetID(dom), devAlias);
-    return 0;
-}
-
-static void myFreeFunc(void *opaque)
-{
-    char *str = opaque;
-    printf("%s: Freeing [%s]\n", __func__, str);
-    free(str);
-}
-
-
-/* main test functions */
-
-void usage(const char *pname)
-{
-    printf("%s uri\n", pname);
-}
-
-
-static void stop(int sig)
-{
-    printf("Exiting on signal %d\n", sig);
-    run = 0;
-}
-
-
-int main(int argc, char **argv)
-{
-    int callback1ret = -1;
-    int callback2ret = -1;
-    int callback3ret = -1;
-    int callback4ret = -1;
-    int callback5ret = -1;
-    int callback6ret = -1;
-    int callback7ret = -1;
-    int callback8ret = -1;
-    int callback9ret = -1;
-    int callback10ret = -1;
-    int callback11ret = -1;
-    int callback12ret = -1;
-    int callback13ret = -1;
-    int callback14ret = -1;
-    int callback15ret = -1;
-    struct sigaction action_stop;
-
-    memset(&action_stop, 0, sizeof(action_stop));
-
-    action_stop.sa_handler = stop;
-
-    if (argc > 1 && STREQ(argv[1], "--help")) {
-        usage(argv[0]);
-        return -1;
-    }
-
-    if (virInitialize() < 0) {
-        fprintf(stderr, "Failed to initialize libvirt");
-        return -1;
-    }
-
-    if (virEventRegisterDefaultImpl() < 0) {
-        virErrorPtr err = virGetLastError();
-        fprintf(stderr, "Failed to register event implementation: %s\n",
-                err && err->message ? err->message: "Unknown error");
-        return -1;
-    }
-
-    virConnectPtr dconn = NULL;
-    dconn = virConnectOpenAuth(argc > 1 ? argv[1] : NULL,
-                               virConnectAuthPtrDefault,
-                               VIR_CONNECT_RO);
-    if (!dconn) {
-        printf("error opening\n");
-        return -1;
-    }
-
-    virConnectRegisterCloseCallback(dconn,
-                                    connectClose, NULL, NULL);
-
-    sigaction(SIGTERM, &action_stop, NULL);
-    sigaction(SIGINT, &action_stop, NULL);
-
-    VIR_DEBUG("Registering domain event cbs");
-
-    /* Add 2 callbacks to prove this works with more than just one */
-    callback1ret = virConnectDomainEventRegister(dconn, myDomainEventCallback1,
-                                                 strdup("callback 1"), myFreeFunc);
-    callback2ret = virConnectDomainEventRegisterAny(dconn,
-                                                    NULL,
-                                                    VIR_DOMAIN_EVENT_ID_LIFECYCLE,
-                                                    VIR_DOMAIN_EVENT_CALLBACK(myDomainEventCallback2),
-                                                    strdup("callback 2"), myFreeFunc);
-    callback3ret = virConnectDomainEventRegisterAny(dconn,
-                                                    NULL,
-                                                    VIR_DOMAIN_EVENT_ID_REBOOT,
-                                                    VIR_DOMAIN_EVENT_CALLBACK(myDomainEventRebootCallback),
-                                                    strdup("callback reboot"), myFreeFunc);
-    callback4ret = virConnectDomainEventRegisterAny(dconn,
-                                                    NULL,
-                                                    VIR_DOMAIN_EVENT_ID_RTC_CHANGE,
-                                                    VIR_DOMAIN_EVENT_CALLBACK(myDomainEventRTCChangeCallback),
-                                                    strdup("callback rtcchange"), myFreeFunc);
-    callback5ret = virConnectDomainEventRegisterAny(dconn,
-                                                    NULL,
-                                                    VIR_DOMAIN_EVENT_ID_WATCHDOG,
-                                                    VIR_DOMAIN_EVENT_CALLBACK(myDomainEventWatchdogCallback),
-                                                    strdup("callback watchdog"), myFreeFunc);
-    callback6ret = virConnectDomainEventRegisterAny(dconn,
-                                                    NULL,
-                                                    VIR_DOMAIN_EVENT_ID_IO_ERROR,
-                                                    VIR_DOMAIN_EVENT_CALLBACK(myDomainEventIOErrorCallback),
-                                                    strdup("callback io error"), myFreeFunc);
-    callback7ret = virConnectDomainEventRegisterAny(dconn,
-                                                    NULL,
-                                                    VIR_DOMAIN_EVENT_ID_GRAPHICS,
-                                                    VIR_DOMAIN_EVENT_CALLBACK(myDomainEventGraphicsCallback),
-                                                    strdup("callback graphics"), myFreeFunc);
-    callback8ret = virConnectDomainEventRegisterAny(dconn,
-                                                    NULL,
-                                                    VIR_DOMAIN_EVENT_ID_CONTROL_ERROR,
-                                                    VIR_DOMAIN_EVENT_CALLBACK(myDomainEventControlErrorCallback),
-                                                    strdup("callback control error"), myFreeFunc);
-    callback9ret = virConnectDomainEventRegisterAny(dconn,
-                                                    NULL,
-                                                    VIR_DOMAIN_EVENT_ID_DISK_CHANGE,
-                                                    VIR_DOMAIN_EVENT_CALLBACK(myDomainEventDiskChangeCallback),
-                                                    strdup("disk change"), myFreeFunc);
-    callback10ret = virConnectDomainEventRegisterAny(dconn,
-                                                     NULL,
-                                                     VIR_DOMAIN_EVENT_ID_TRAY_CHANGE,
-                                                     VIR_DOMAIN_EVENT_CALLBACK(myDomainEventTrayChangeCallback),
-                                                     strdup("tray change"), myFreeFunc);
-    callback11ret = virConnectDomainEventRegisterAny(dconn,
-                                                     NULL,
-                                                     VIR_DOMAIN_EVENT_ID_PMWAKEUP,
-                                                     VIR_DOMAIN_EVENT_CALLBACK(myDomainEventPMWakeupCallback),
-                                                     strdup("pmwakeup"), myFreeFunc);
-    callback12ret = virConnectDomainEventRegisterAny(dconn,
-                                                     NULL,
-                                                     VIR_DOMAIN_EVENT_ID_PMSUSPEND,
-                                                     VIR_DOMAIN_EVENT_CALLBACK(myDomainEventPMSuspendCallback),
-                                                     strdup("pmsuspend"), myFreeFunc);
-    callback13ret = virConnectDomainEventRegisterAny(dconn,
-                                                     NULL,
-                                                     VIR_DOMAIN_EVENT_ID_BALLOON_CHANGE,
-                                                     VIR_DOMAIN_EVENT_CALLBACK(myDomainEventBalloonChangeCallback),
-                                                     strdup("callback balloonchange"), myFreeFunc);
-    callback14ret = virConnectDomainEventRegisterAny(dconn,
-                                                     NULL,
-                                                     VIR_DOMAIN_EVENT_ID_PMSUSPEND_DISK,
-                                                     VIR_DOMAIN_EVENT_CALLBACK(myDomainEventPMSuspendDiskCallback),
-                                                     strdup("pmsuspend-disk"), myFreeFunc);
-    callback15ret = virConnectDomainEventRegisterAny(dconn,
-                                                     NULL,
-                                                     VIR_DOMAIN_EVENT_ID_DEVICE_REMOVED,
-                                                     VIR_DOMAIN_EVENT_CALLBACK(myDomainEventDeviceRemovedCallback),
-                                                     strdup("device removed"), myFreeFunc);
-
-    if ((callback1ret != -1) &&
-        (callback2ret != -1) &&
-        (callback3ret != -1) &&
-        (callback4ret != -1) &&
-        (callback5ret != -1) &&
-        (callback6ret != -1) &&
-        (callback7ret != -1) &&
-        (callback9ret != -1) &&
-        (callback10ret != -1) &&
-        (callback11ret != -1) &&
-        (callback12ret != -1) &&
-        (callback13ret != -1) &&
-        (callback14ret != -1) &&
-        (callback15ret != -1)) {
-        if (virConnectSetKeepAlive(dconn, 5, 3) < 0) {
-            virErrorPtr err = virGetLastError();
-            fprintf(stderr, "Failed to start keepalive protocol: %s\n",
-                    err && err->message ? err->message : "Unknown error");
-            run = 0;
-        }
-
-        while (run) {
-            if (virEventRunDefaultImpl() < 0) {
-                virErrorPtr err = virGetLastError();
-                fprintf(stderr, "Failed to run event loop: %s\n",
-                        err && err->message ? err->message : "Unknown error");
-            }
-        }
-
-        VIR_DEBUG("Deregistering event handlers");
-        virConnectDomainEventDeregister(dconn, myDomainEventCallback1);
-        virConnectDomainEventDeregisterAny(dconn, callback2ret);
-        virConnectDomainEventDeregisterAny(dconn, callback3ret);
-        virConnectDomainEventDeregisterAny(dconn, callback4ret);
-        virConnectDomainEventDeregisterAny(dconn, callback5ret);
-        virConnectDomainEventDeregisterAny(dconn, callback6ret);
-        virConnectDomainEventDeregisterAny(dconn, callback7ret);
-        virConnectDomainEventDeregisterAny(dconn, callback9ret);
-        virConnectDomainEventDeregisterAny(dconn, callback10ret);
-        virConnectDomainEventDeregisterAny(dconn, callback11ret);
-        virConnectDomainEventDeregisterAny(dconn, callback12ret);
-        virConnectDomainEventDeregisterAny(dconn, callback13ret);
-        virConnectDomainEventDeregisterAny(dconn, callback14ret);
-        virConnectDomainEventDeregisterAny(dconn, callback15ret);
-        if (callback8ret != -1)
-            virConnectDomainEventDeregisterAny(dconn, callback8ret);
-    }
-
-    VIR_DEBUG("Closing connection");
-    if (dconn && virConnectClose(dconn) < 0) {
-        printf("error closing\n");
-    }
-
-    printf("done\n");
-    return 0;
-}
diff --git a/examples/object-events/Makefile.am b/examples/object-events/Makefile.am
new file mode 100644
index 0000000..86500a0
--- /dev/null
+++ b/examples/object-events/Makefile.am
@@ -0,0 +1,24 @@
+## Copyright (C) 2005-2011, 2013 Red Hat, Inc.
+##
+## This library is free software; you can redistribute it and/or
+## modify it under the terms of the GNU Lesser General Public
+## License as published by the Free Software Foundation; either
+## version 2.1 of the License, or (at your option) any later version.
+##
+## This library is distributed in the hope that it will be useful,
+## but WITHOUT ANY WARRANTY; without even the implied warranty of
+## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+## Lesser General Public License for more details.
+##
+## You should have received a copy of the GNU Lesser General Public
+## License along with this library.  If not, see
+## <http://www.gnu.org/licenses/>.
+
+INCLUDES = -I$(top_builddir)/include -I$(top_srcdir)/include \
+	   -I$(top_builddir)/gnulib/lib -I$(top_srcdir)/gnulib/lib \
+	   -I$(top_srcdir)
+noinst_PROGRAMS = event-test
+event_test_CFLAGS = $(WARN_CFLAGS)
+event_test_SOURCES = event-test.c
+event_test_LDADD = $(top_builddir)/src/libvirt.la \
+		 $(top_builddir)/gnulib/lib/libgnu.la
diff --git a/examples/object-events/event-test.c b/examples/object-events/event-test.c
new file mode 100644
index 0000000..52aa3d0
--- /dev/null
+++ b/examples/object-events/event-test.c
@@ -0,0 +1,644 @@
+#include <config.h>
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <signal.h>
+#include <inttypes.h>
+
+#include <libvirt/libvirt.h>
+#include <libvirt/virterror.h>
+
+#define VIR_DEBUG(fmt) printf("%s:%d: " fmt "\n", __func__, __LINE__)
+#define STREQ(a,b) (strcmp(a,b) == 0)
+
+#ifndef ATTRIBUTE_UNUSED
+# define ATTRIBUTE_UNUSED __attribute__((__unused__))
+#endif
+
+int run = 1;
+
+/* Prototypes */
+const char *eventToString(int event);
+int myEventAddHandleFunc  (int fd, int event,
+                           virEventHandleCallback cb,
+                           void *opaque,
+                           virFreeCallback ff);
+void myEventUpdateHandleFunc(int watch, int event);
+int  myEventRemoveHandleFunc(int watch);
+
+int myEventAddTimeoutFunc(int timeout,
+                          virEventTimeoutCallback cb,
+                          void *opaque,
+                          virFreeCallback ff);
+void myEventUpdateTimeoutFunc(int timer, int timout);
+int myEventRemoveTimeoutFunc(int timer);
+
+int myEventHandleTypeToPollEvent(virEventHandleType events);
+virEventHandleType myPollEventToEventHandleType(int events);
+
+void usage(const char *pname);
+
+/* Callback functions */
+
+
+static void connectClose(virConnectPtr conn ATTRIBUTE_UNUSED,
+                         int reason,
+                         void *opaque ATTRIBUTE_UNUSED)
+{
+    switch (reason) {
+    case VIR_CONNECT_CLOSE_REASON_ERROR:
+        fprintf(stderr, "Connection closed due to I/O error\n");
+        break;
+    case VIR_CONNECT_CLOSE_REASON_EOF:
+        fprintf(stderr, "Connection closed due to end of file\n");
+        break;
+    case VIR_CONNECT_CLOSE_REASON_KEEPALIVE:
+        fprintf(stderr, "Connection closed due to keepalive timeout\n");
+        break;
+    case VIR_CONNECT_CLOSE_REASON_CLIENT:
+        fprintf(stderr, "Connection closed due to client request\n");
+        break;
+    default:
+        fprintf(stderr, "Connection closed due to unknown reason\n");
+        break;
+    };
+    run = 0;
+}
+
+const char *eventToString(int event) {
+    const char *ret = "";
+    switch ((virDomainEventType) event) {
+        case VIR_DOMAIN_EVENT_DEFINED:
+            ret ="Defined";
+            break;
+        case VIR_DOMAIN_EVENT_UNDEFINED:
+            ret ="Undefined";
+            break;
+        case VIR_DOMAIN_EVENT_STARTED:
+            ret ="Started";
+            break;
+        case VIR_DOMAIN_EVENT_SUSPENDED:
+            ret ="Suspended";
+            break;
+        case VIR_DOMAIN_EVENT_RESUMED:
+            ret ="Resumed";
+            break;
+        case VIR_DOMAIN_EVENT_STOPPED:
+            ret ="Stopped";
+            break;
+        case VIR_DOMAIN_EVENT_SHUTDOWN:
+            ret = "Shutdown";
+            break;
+        case VIR_DOMAIN_EVENT_PMSUSPENDED:
+            ret = "PMSuspended";
+            break;
+        case VIR_DOMAIN_EVENT_CRASHED:
+            ret = "Crashed";
+            break;
+    }
+    return ret;
+}
+
+static const char *eventDetailToString(int event, int detail) {
+    const char *ret = "";
+    switch ((virDomainEventType) event) {
+        case VIR_DOMAIN_EVENT_DEFINED:
+            if (detail == VIR_DOMAIN_EVENT_DEFINED_ADDED)
+                ret = "Added";
+            else if (detail == VIR_DOMAIN_EVENT_DEFINED_UPDATED)
+                ret = "Updated";
+            break;
+        case VIR_DOMAIN_EVENT_UNDEFINED:
+            if (detail == VIR_DOMAIN_EVENT_UNDEFINED_REMOVED)
+                ret = "Removed";
+            break;
+        case VIR_DOMAIN_EVENT_STARTED:
+            switch ((virDomainEventStartedDetailType) detail) {
+            case VIR_DOMAIN_EVENT_STARTED_BOOTED:
+                ret = "Booted";
+                break;
+            case VIR_DOMAIN_EVENT_STARTED_MIGRATED:
+                ret = "Migrated";
+                break;
+            case VIR_DOMAIN_EVENT_STARTED_RESTORED:
+                ret = "Restored";
+                break;
+            case VIR_DOMAIN_EVENT_STARTED_FROM_SNAPSHOT:
+                ret = "Snapshot";
+                break;
+            case VIR_DOMAIN_EVENT_STARTED_WAKEUP:
+                ret = "Event wakeup";
+                break;
+            }
+            break;
+        case VIR_DOMAIN_EVENT_SUSPENDED:
+            switch ((virDomainEventSuspendedDetailType) detail) {
+            case VIR_DOMAIN_EVENT_SUSPENDED_PAUSED:
+                ret = "Paused";
+                break;
+            case VIR_DOMAIN_EVENT_SUSPENDED_MIGRATED:
+                ret = "Migrated";
+                break;
+            case VIR_DOMAIN_EVENT_SUSPENDED_IOERROR:
+                ret = "I/O Error";
+                break;
+            case VIR_DOMAIN_EVENT_SUSPENDED_WATCHDOG:
+                ret = "Watchdog";
+                break;
+            case VIR_DOMAIN_EVENT_SUSPENDED_RESTORED:
+                ret = "Restored";
+                break;
+            case VIR_DOMAIN_EVENT_SUSPENDED_FROM_SNAPSHOT:
+                ret = "Snapshot";
+                break;
+            case VIR_DOMAIN_EVENT_SUSPENDED_API_ERROR:
+                ret = "API error";
+                break;
+            }
+            break;
+        case VIR_DOMAIN_EVENT_RESUMED:
+            switch ((virDomainEventResumedDetailType) detail) {
+            case VIR_DOMAIN_EVENT_RESUMED_UNPAUSED:
+                ret = "Unpaused";
+                break;
+            case VIR_DOMAIN_EVENT_RESUMED_MIGRATED:
+                ret = "Migrated";
+                break;
+            case VIR_DOMAIN_EVENT_RESUMED_FROM_SNAPSHOT:
+                ret = "Snapshot";
+                break;
+            }
+            break;
+        case VIR_DOMAIN_EVENT_STOPPED:
+            switch ((virDomainEventStoppedDetailType) detail) {
+            case VIR_DOMAIN_EVENT_STOPPED_SHUTDOWN:
+                ret = "Shutdown";
+                break;
+            case VIR_DOMAIN_EVENT_STOPPED_DESTROYED:
+                ret = "Destroyed";
+                break;
+            case VIR_DOMAIN_EVENT_STOPPED_CRASHED:
+                ret = "Crashed";
+                break;
+            case VIR_DOMAIN_EVENT_STOPPED_MIGRATED:
+                ret = "Migrated";
+                break;
+            case VIR_DOMAIN_EVENT_STOPPED_SAVED:
+                ret = "Saved";
+                break;
+            case VIR_DOMAIN_EVENT_STOPPED_FAILED:
+                ret = "Failed";
+                break;
+            case VIR_DOMAIN_EVENT_STOPPED_FROM_SNAPSHOT:
+                ret = "Snapshot";
+                break;
+            }
+            break;
+        case VIR_DOMAIN_EVENT_SHUTDOWN:
+            switch ((virDomainEventShutdownDetailType) detail) {
+            case VIR_DOMAIN_EVENT_SHUTDOWN_FINISHED:
+                ret = "Finished";
+                break;
+            }
+            break;
+        case VIR_DOMAIN_EVENT_PMSUSPENDED:
+            switch ((virDomainEventPMSuspendedDetailType) detail) {
+            case VIR_DOMAIN_EVENT_PMSUSPENDED_MEMORY:
+                ret = "Memory";
+                break;
+            case VIR_DOMAIN_EVENT_PMSUSPENDED_DISK:
+                ret = "Disk";
+                break;
+            }
+            break;
+        case VIR_DOMAIN_EVENT_CRASHED:
+           switch ((virDomainEventCrashedDetailType) detail) {
+           case VIR_DOMAIN_EVENT_CRASHED_PANICKED:
+               ret = "Panicked";
+               break;
+           }
+           break;
+    }
+    return ret;
+}
+
+static int myDomainEventCallback1(virConnectPtr conn ATTRIBUTE_UNUSED,
+                                  virDomainPtr dom,
+                                  int event,
+                                  int detail,
+                                  void *opaque ATTRIBUTE_UNUSED)
+{
+    printf("%s EVENT: Domain %s(%d) %s %s\n", __func__, virDomainGetName(dom),
+           virDomainGetID(dom), eventToString(event),
+           eventDetailToString(event, detail));
+    return 0;
+}
+
+static int myDomainEventCallback2(virConnectPtr conn ATTRIBUTE_UNUSED,
+                                  virDomainPtr dom,
+                                  int event,
+                                  int detail,
+                                  void *opaque ATTRIBUTE_UNUSED)
+{
+    printf("%s EVENT: Domain %s(%d) %s %s\n", __func__, virDomainGetName(dom),
+           virDomainGetID(dom), eventToString(event),
+           eventDetailToString(event, detail));
+    return 0;
+}
+
+static int myDomainEventRebootCallback(virConnectPtr conn ATTRIBUTE_UNUSED,
+                                       virDomainPtr dom,
+                                       void *opaque ATTRIBUTE_UNUSED)
+{
+    printf("%s EVENT: Domain %s(%d) rebooted\n", __func__, virDomainGetName(dom),
+           virDomainGetID(dom));
+
+    return 0;
+}
+
+static int myDomainEventRTCChangeCallback(virConnectPtr conn ATTRIBUTE_UNUSED,
+                                          virDomainPtr dom,
+                                          long long offset,
+                                          void *opaque ATTRIBUTE_UNUSED)
+{
+    printf("%s EVENT: Domain %s(%d) rtc change %" PRIdMAX "\n",
+           __func__, virDomainGetName(dom), virDomainGetID(dom),
+           (intmax_t)offset);
+
+    return 0;
+}
+
+static int myDomainEventBalloonChangeCallback(virConnectPtr conn ATTRIBUTE_UNUSED,
+                                              virDomainPtr dom,
+                                              unsigned long long actual,
+                                              void *opaque ATTRIBUTE_UNUSED)
+{
+    printf("%s EVENT: Domain %s(%d) balloon change %" PRIuMAX "KB\n",
+           __func__, virDomainGetName(dom), virDomainGetID(dom), (uintmax_t)actual);
+
+    return 0;
+}
+
+static int myDomainEventWatchdogCallback(virConnectPtr conn ATTRIBUTE_UNUSED,
+                                         virDomainPtr dom,
+                                         int action,
+                                         void *opaque ATTRIBUTE_UNUSED)
+{
+    printf("%s EVENT: Domain %s(%d) watchdog action=%d\n", __func__, virDomainGetName(dom),
+           virDomainGetID(dom), action);
+
+    return 0;
+}
+
+static int myDomainEventIOErrorCallback(virConnectPtr conn ATTRIBUTE_UNUSED,
+                                        virDomainPtr dom,
+                                        const char *srcPath,
+                                        const char *devAlias,
+                                        int action,
+                                        void *opaque ATTRIBUTE_UNUSED)
+{
+    printf("%s EVENT: Domain %s(%d) io error path=%s alias=%s action=%d\n", __func__, virDomainGetName(dom),
+           virDomainGetID(dom), srcPath, devAlias, action);
+
+    return 0;
+}
+
+static int myDomainEventGraphicsCallback(virConnectPtr conn ATTRIBUTE_UNUSED,
+                                         virDomainPtr dom,
+                                         int phase,
+                                         virDomainEventGraphicsAddressPtr local,
+                                         virDomainEventGraphicsAddressPtr remote,
+                                         const char *authScheme,
+                                         virDomainEventGraphicsSubjectPtr subject,
+                                         void *opaque ATTRIBUTE_UNUSED)
+{
+    size_t i;
+    printf("%s EVENT: Domain %s(%d) graphics ", __func__, virDomainGetName(dom),
+           virDomainGetID(dom));
+
+    switch (phase) {
+    case VIR_DOMAIN_EVENT_GRAPHICS_CONNECT:
+        printf("connected ");
+        break;
+    case VIR_DOMAIN_EVENT_GRAPHICS_INITIALIZE:
+        printf("initialized ");
+        break;
+    case VIR_DOMAIN_EVENT_GRAPHICS_DISCONNECT:
+        printf("disconnected ");
+        break;
+    }
+
+    printf("local: family=%d node=%s service=%s ",
+           local->family, local->node, local->service);
+    printf("remote: family=%d node=%s service=%s ",
+           remote->family, remote->node, remote->service);
+
+    printf("auth: %s ", authScheme);
+    for (i = 0; i < subject->nidentity; i++) {
+        printf(" identity: %s=%s",
+               subject->identities[i].type,
+               subject->identities[i].name);
+    }
+    printf("\n");
+
+    return 0;
+}
+
+static int myDomainEventControlErrorCallback(virConnectPtr conn ATTRIBUTE_UNUSED,
+                                             virDomainPtr dom,
+                                             void *opaque ATTRIBUTE_UNUSED)
+{
+    printf("%s EVENT: Domain %s(%d) control error\n", __func__, virDomainGetName(dom),
+           virDomainGetID(dom));
+
+    return 0;
+}
+
+
+const char *diskChangeReasonStrings[] = {
+    "startupPolicy", /* 0 */
+    /* add new reason here */
+};
+static int myDomainEventDiskChangeCallback(virConnectPtr conn ATTRIBUTE_UNUSED,
+                                           virDomainPtr dom,
+                                           const char *oldSrcPath,
+                                           const char *newSrcPath,
+                                           const char *devAlias,
+                                           int reason,
+                                           void *opaque ATTRIBUTE_UNUSED)
+{
+    printf("%s EVENT: Domain %s(%d) disk change oldSrcPath: %s newSrcPath: %s devAlias: %s reason: %s\n",
+           __func__, virDomainGetName(dom), virDomainGetID(dom),
+           oldSrcPath, newSrcPath, devAlias, diskChangeReasonStrings[reason]);
+    return 0;
+}
+
+const char *trayChangeReasonStrings[] = {
+    "open",
+    "close",
+};
+
+static int myDomainEventTrayChangeCallback(virConnectPtr conn ATTRIBUTE_UNUSED,
+                                           virDomainPtr dom,
+                                           const char *devAlias,
+                                           int reason,
+                                           void *opaque ATTRIBUTE_UNUSED)
+{
+    printf("%s EVENT: Domain %s(%d) removable disk's tray change devAlias: %s reason: %s\n",
+           __func__, virDomainGetName(dom), virDomainGetID(dom),
+           devAlias, trayChangeReasonStrings[reason]);
+    return 0;
+}
+
+static int myDomainEventPMWakeupCallback(virConnectPtr conn ATTRIBUTE_UNUSED,
+                                         virDomainPtr dom,
+                                         int reason ATTRIBUTE_UNUSED,
+                                         void *opaque ATTRIBUTE_UNUSED)
+{
+    printf("%s EVENT: Domain %s(%d) system pmwakeup\n",
+           __func__, virDomainGetName(dom), virDomainGetID(dom));
+    return 0;
+}
+
+static int myDomainEventPMSuspendCallback(virConnectPtr conn ATTRIBUTE_UNUSED,
+                                          virDomainPtr dom,
+                                          int reason ATTRIBUTE_UNUSED,
+                                          void *opaque ATTRIBUTE_UNUSED)
+{
+    printf("%s EVENT: Domain %s(%d) system pmsuspend\n",
+           __func__, virDomainGetName(dom), virDomainGetID(dom));
+    return 0;
+}
+
+static int myDomainEventPMSuspendDiskCallback(virConnectPtr conn ATTRIBUTE_UNUSED,
+                                              virDomainPtr dom,
+                                              int reason ATTRIBUTE_UNUSED,
+                                              void *opaque ATTRIBUTE_UNUSED)
+{
+    printf("%s EVENT: Domain %s(%d) system pmsuspend-disk\n",
+           __func__, virDomainGetName(dom), virDomainGetID(dom));
+    return 0;
+}
+
+static int
+myDomainEventDeviceRemovedCallback(virConnectPtr conn ATTRIBUTE_UNUSED,
+                                   virDomainPtr dom,
+                                   const char *devAlias,
+                                   void *opaque ATTRIBUTE_UNUSED)
+{
+    printf("%s EVENT: Domain %s(%d) device removed: %s\n",
+           __func__, virDomainGetName(dom), virDomainGetID(dom), devAlias);
+    return 0;
+}
+
+static void myFreeFunc(void *opaque)
+{
+    char *str = opaque;
+    printf("%s: Freeing [%s]\n", __func__, str);
+    free(str);
+}
+
+
+/* main test functions */
+
+void usage(const char *pname)
+{
+    printf("%s uri\n", pname);
+}
+
+
+static void stop(int sig)
+{
+    printf("Exiting on signal %d\n", sig);
+    run = 0;
+}
+
+
+int main(int argc, char **argv)
+{
+    int callback1ret = -1;
+    int callback2ret = -1;
+    int callback3ret = -1;
+    int callback4ret = -1;
+    int callback5ret = -1;
+    int callback6ret = -1;
+    int callback7ret = -1;
+    int callback8ret = -1;
+    int callback9ret = -1;
+    int callback10ret = -1;
+    int callback11ret = -1;
+    int callback12ret = -1;
+    int callback13ret = -1;
+    int callback14ret = -1;
+    int callback15ret = -1;
+    struct sigaction action_stop;
+
+    memset(&action_stop, 0, sizeof(action_stop));
+
+    action_stop.sa_handler = stop;
+
+    if (argc > 1 && STREQ(argv[1], "--help")) {
+        usage(argv[0]);
+        return -1;
+    }
+
+    if (virInitialize() < 0) {
+        fprintf(stderr, "Failed to initialize libvirt");
+        return -1;
+    }
+
+    if (virEventRegisterDefaultImpl() < 0) {
+        virErrorPtr err = virGetLastError();
+        fprintf(stderr, "Failed to register event implementation: %s\n",
+                err && err->message ? err->message: "Unknown error");
+        return -1;
+    }
+
+    virConnectPtr dconn = NULL;
+    dconn = virConnectOpenAuth(argc > 1 ? argv[1] : NULL,
+                               virConnectAuthPtrDefault,
+                               VIR_CONNECT_RO);
+    if (!dconn) {
+        printf("error opening\n");
+        return -1;
+    }
+
+    virConnectRegisterCloseCallback(dconn,
+                                    connectClose, NULL, NULL);
+
+    sigaction(SIGTERM, &action_stop, NULL);
+    sigaction(SIGINT, &action_stop, NULL);
+
+    VIR_DEBUG("Registering domain event cbs");
+
+    /* Add 2 callbacks to prove this works with more than just one */
+    callback1ret = virConnectDomainEventRegister(dconn, myDomainEventCallback1,
+                                                 strdup("callback 1"), myFreeFunc);
+    callback2ret = virConnectDomainEventRegisterAny(dconn,
+                                                    NULL,
+                                                    VIR_DOMAIN_EVENT_ID_LIFECYCLE,
+                                                    VIR_DOMAIN_EVENT_CALLBACK(myDomainEventCallback2),
+                                                    strdup("callback 2"), myFreeFunc);
+    callback3ret = virConnectDomainEventRegisterAny(dconn,
+                                                    NULL,
+                                                    VIR_DOMAIN_EVENT_ID_REBOOT,
+                                                    VIR_DOMAIN_EVENT_CALLBACK(myDomainEventRebootCallback),
+                                                    strdup("callback reboot"), myFreeFunc);
+    callback4ret = virConnectDomainEventRegisterAny(dconn,
+                                                    NULL,
+                                                    VIR_DOMAIN_EVENT_ID_RTC_CHANGE,
+                                                    VIR_DOMAIN_EVENT_CALLBACK(myDomainEventRTCChangeCallback),
+                                                    strdup("callback rtcchange"), myFreeFunc);
+    callback5ret = virConnectDomainEventRegisterAny(dconn,
+                                                    NULL,
+                                                    VIR_DOMAIN_EVENT_ID_WATCHDOG,
+                                                    VIR_DOMAIN_EVENT_CALLBACK(myDomainEventWatchdogCallback),
+                                                    strdup("callback watchdog"), myFreeFunc);
+    callback6ret = virConnectDomainEventRegisterAny(dconn,
+                                                    NULL,
+                                                    VIR_DOMAIN_EVENT_ID_IO_ERROR,
+                                                    VIR_DOMAIN_EVENT_CALLBACK(myDomainEventIOErrorCallback),
+                                                    strdup("callback io error"), myFreeFunc);
+    callback7ret = virConnectDomainEventRegisterAny(dconn,
+                                                    NULL,
+                                                    VIR_DOMAIN_EVENT_ID_GRAPHICS,
+                                                    VIR_DOMAIN_EVENT_CALLBACK(myDomainEventGraphicsCallback),
+                                                    strdup("callback graphics"), myFreeFunc);
+    callback8ret = virConnectDomainEventRegisterAny(dconn,
+                                                    NULL,
+                                                    VIR_DOMAIN_EVENT_ID_CONTROL_ERROR,
+                                                    VIR_DOMAIN_EVENT_CALLBACK(myDomainEventControlErrorCallback),
+                                                    strdup("callback control error"), myFreeFunc);
+    callback9ret = virConnectDomainEventRegisterAny(dconn,
+                                                    NULL,
+                                                    VIR_DOMAIN_EVENT_ID_DISK_CHANGE,
+                                                    VIR_DOMAIN_EVENT_CALLBACK(myDomainEventDiskChangeCallback),
+                                                    strdup("disk change"), myFreeFunc);
+    callback10ret = virConnectDomainEventRegisterAny(dconn,
+                                                     NULL,
+                                                     VIR_DOMAIN_EVENT_ID_TRAY_CHANGE,
+                                                     VIR_DOMAIN_EVENT_CALLBACK(myDomainEventTrayChangeCallback),
+                                                     strdup("tray change"), myFreeFunc);
+    callback11ret = virConnectDomainEventRegisterAny(dconn,
+                                                     NULL,
+                                                     VIR_DOMAIN_EVENT_ID_PMWAKEUP,
+                                                     VIR_DOMAIN_EVENT_CALLBACK(myDomainEventPMWakeupCallback),
+                                                     strdup("pmwakeup"), myFreeFunc);
+    callback12ret = virConnectDomainEventRegisterAny(dconn,
+                                                     NULL,
+                                                     VIR_DOMAIN_EVENT_ID_PMSUSPEND,
+                                                     VIR_DOMAIN_EVENT_CALLBACK(myDomainEventPMSuspendCallback),
+                                                     strdup("pmsuspend"), myFreeFunc);
+    callback13ret = virConnectDomainEventRegisterAny(dconn,
+                                                     NULL,
+                                                     VIR_DOMAIN_EVENT_ID_BALLOON_CHANGE,
+                                                     VIR_DOMAIN_EVENT_CALLBACK(myDomainEventBalloonChangeCallback),
+                                                     strdup("callback balloonchange"), myFreeFunc);
+    callback14ret = virConnectDomainEventRegisterAny(dconn,
+                                                     NULL,
+                                                     VIR_DOMAIN_EVENT_ID_PMSUSPEND_DISK,
+                                                     VIR_DOMAIN_EVENT_CALLBACK(myDomainEventPMSuspendDiskCallback),
+                                                     strdup("pmsuspend-disk"), myFreeFunc);
+    callback15ret = virConnectDomainEventRegisterAny(dconn,
+                                                     NULL,
+                                                     VIR_DOMAIN_EVENT_ID_DEVICE_REMOVED,
+                                                     VIR_DOMAIN_EVENT_CALLBACK(myDomainEventDeviceRemovedCallback),
+                                                     strdup("device removed"), myFreeFunc);
+
+    if ((callback1ret != -1) &&
+        (callback2ret != -1) &&
+        (callback3ret != -1) &&
+        (callback4ret != -1) &&
+        (callback5ret != -1) &&
+        (callback6ret != -1) &&
+        (callback7ret != -1) &&
+        (callback9ret != -1) &&
+        (callback10ret != -1) &&
+        (callback11ret != -1) &&
+        (callback12ret != -1) &&
+        (callback13ret != -1) &&
+        (callback14ret != -1) &&
+        (callback15ret != -1)) {
+        if (virConnectSetKeepAlive(dconn, 5, 3) < 0) {
+            virErrorPtr err = virGetLastError();
+            fprintf(stderr, "Failed to start keepalive protocol: %s\n",
+                    err && err->message ? err->message : "Unknown error");
+            run = 0;
+        }
+
+        while (run) {
+            if (virEventRunDefaultImpl() < 0) {
+                virErrorPtr err = virGetLastError();
+                fprintf(stderr, "Failed to run event loop: %s\n",
+                        err && err->message ? err->message : "Unknown error");
+            }
+        }
+
+        VIR_DEBUG("Deregistering event handlers");
+        virConnectDomainEventDeregister(dconn, myDomainEventCallback1);
+        virConnectDomainEventDeregisterAny(dconn, callback2ret);
+        virConnectDomainEventDeregisterAny(dconn, callback3ret);
+        virConnectDomainEventDeregisterAny(dconn, callback4ret);
+        virConnectDomainEventDeregisterAny(dconn, callback5ret);
+        virConnectDomainEventDeregisterAny(dconn, callback6ret);
+        virConnectDomainEventDeregisterAny(dconn, callback7ret);
+        virConnectDomainEventDeregisterAny(dconn, callback9ret);
+        virConnectDomainEventDeregisterAny(dconn, callback10ret);
+        virConnectDomainEventDeregisterAny(dconn, callback11ret);
+        virConnectDomainEventDeregisterAny(dconn, callback12ret);
+        virConnectDomainEventDeregisterAny(dconn, callback13ret);
+        virConnectDomainEventDeregisterAny(dconn, callback14ret);
+        virConnectDomainEventDeregisterAny(dconn, callback15ret);
+        if (callback8ret != -1)
+            virConnectDomainEventDeregisterAny(dconn, callback8ret);
+    }
+
+    VIR_DEBUG("Closing connection");
+    if (dconn && virConnectClose(dconn) < 0) {
+        printf("error closing\n");
+    }
+
+    printf("done\n");
+    return 0;
+}
-- 
1.8.3.1




More information about the libvir-list mailing list