[libvirt] [PATCH 00/18] Refactor event-test

I was asked to add the new event to the test. My eyes started bleeding after opening the file. Refactor the mega-ancient code and add missing stuff. As a finishing touch add a static check that new events are not forgotten. P.S: I contemplated just deleting that ... stuff ... at first. But I coudn't think of a bulletproof justification other than the state of the code. Peter Krempa (18): event-test: Remove forward declarations event-test: Get rid of useless and ambiguous VIR_DEBUG macro event-test: Remove unnecessary 'usage' function event-test: touch up coding style event-test: Use functions with typecasted switch to convert enums lib: document fields virConnectDomainEventDiskChangeReason event-test: Force compiler check in switch for connectClose callback event-test: Use typecasted enum to convert graphics event phase event-test: Use switch instead of if/else if chains for lifecycle event translation event-test: make few switch statements future proof event-test: Enable enum sentinels and warn on not fully populated enums event-test: make domain event registration declarative event-test: Add VIR_DOMAIN_EVENT_ID_BLOCK_JOB and VIR_DOMAIN_EVENT_ID_BLOCK_JOB_2 event-test: Add VIR_DOMAIN_EVENT_ID_MIGRATION_ITERATION callback event-test: Add VIR_DOMAIN_EVENT_ID_JOB_COMPLETED event-test: Add VIR_DOMAIN_EVENT_ID_DEVICE_REMOVAL_FAILED event-test: Add VIR_DOMAIN_EVENT_ID_IO_ERROR_REASON event-test: Enforce domain event sync examples/Makefile.am | 5 + examples/object-events/event-test.c | 973 +++++++++++++++++++++--------------- include/libvirt/libvirt-domain.h | 6 +- 3 files changed, 580 insertions(+), 404 deletions(-) -- 2.8.0

Most of the functions are no longer in this file. 'usage' does not need a declaration. --- examples/object-events/event-test.c | 21 --------------------- 1 file changed, 21 deletions(-) diff --git a/examples/object-events/event-test.c b/examples/object-events/event-test.c index 7be1d21..cde2d83 100644 --- a/examples/object-events/event-test.c +++ b/examples/object-events/event-test.c @@ -18,27 +18,6 @@ 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 */ -- 2.8.0

On Thu, Apr 14, 2016 at 05:52:26PM +0200, Peter Krempa wrote:
Most of the functions are no longer in this file. 'usage' does not need a declaration. --- examples/object-events/event-test.c | 21 --------------------- 1 file changed, 21 deletions(-)
ACK Jan

The event test does not try to include libvirt internals. Using a macro named VIR_DEBUG might hint to such usage. Additionally it's useless since it's used only in the main() function. Modernize the message strings while touching them. --- examples/object-events/event-test.c | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/examples/object-events/event-test.c b/examples/object-events/event-test.c index cde2d83..e3f0330 100644 --- a/examples/object-events/event-test.c +++ b/examples/object-events/event-test.c @@ -9,7 +9,6 @@ #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 @@ -656,7 +655,7 @@ int main(int argc, char **argv) sigaction(SIGTERM, &action_stop, NULL); sigaction(SIGINT, &action_stop, NULL); - VIR_DEBUG("Registering event cbs"); + printf("Registering event callbacks\n"); /* Add 2 callbacks to prove this works with more than just one */ callback1ret = virConnectDomainEventRegister(dconn, myDomainEventCallback1, @@ -787,7 +786,7 @@ int main(int argc, char **argv) } } - VIR_DEBUG("Deregistering event handlers"); + printf("Deregistering event callbacks\n"); virConnectDomainEventDeregister(dconn, myDomainEventCallback1); virConnectDomainEventDeregisterAny(dconn, callback2ret); virConnectDomainEventDeregisterAny(dconn, callback3ret); @@ -816,9 +815,9 @@ int main(int argc, char **argv) cleanup: if (dconn) { - VIR_DEBUG("Closing connection"); + printf("Closing connection: "); if (virConnectClose(dconn) < 0) - printf("error closing\n"); + printf("failed\n"); printf("done\n"); } -- 2.8.0

On Thu, Apr 14, 2016 at 05:52:27PM +0200, Peter Krempa wrote:
The event test does not try to include libvirt internals. Using a macro named VIR_DEBUG might hint to such usage. Additionally it's useless since it's used only in the main() function.
Modernize the message strings while touching them. --- examples/object-events/event-test.c | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-)
ACK Jan

--- examples/object-events/event-test.c | 8 +------- 1 file changed, 1 insertion(+), 7 deletions(-) diff --git a/examples/object-events/event-test.c b/examples/object-events/event-test.c index e3f0330..63629c2 100644 --- a/examples/object-events/event-test.c +++ b/examples/object-events/event-test.c @@ -579,12 +579,6 @@ static void myFreeFunc(void *opaque) /* 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); @@ -622,7 +616,7 @@ int main(int argc, char **argv) action_stop.sa_handler = stop; if (argc > 1 && STREQ(argv[1], "--help")) { - usage(argv[0]); + printf("%s uri\n", argv[0]); goto cleanup; } -- 2.8.0

Break long lines and format headers correctly. --- examples/object-events/event-test.c | 227 ++++++++++++++++++++++-------------- 1 file changed, 137 insertions(+), 90 deletions(-) diff --git a/examples/object-events/event-test.c b/examples/object-events/event-test.c index 63629c2..3ab2b64 100644 --- a/examples/object-events/event-test.c +++ b/examples/object-events/event-test.c @@ -18,11 +18,10 @@ int run = 1; /* Callback functions */ - - -static void connectClose(virConnectPtr conn ATTRIBUTE_UNUSED, - int reason, - void *opaque ATTRIBUTE_UNUSED) +static void +connectClose(virConnectPtr conn ATTRIBUTE_UNUSED, + int reason, + void *opaque ATTRIBUTE_UNUSED) { switch (reason) { case VIR_CONNECT_CLOSE_REASON_ERROR: @@ -44,7 +43,10 @@ static void connectClose(virConnectPtr conn ATTRIBUTE_UNUSED, run = 0; } -const char *eventToString(int event) { + +static const char * +eventToString(int event) +{ const char *ret = ""; switch ((virDomainEventType) event) { case VIR_DOMAIN_EVENT_DEFINED: @@ -78,7 +80,11 @@ const char *eventToString(int event) { return ret; } -static const char *eventDetailToString(int event, int detail) { + +static const char * +eventDetailToString(int event, + int detail) +{ const char *ret = ""; switch ((virDomainEventType) event) { case VIR_DOMAIN_EVENT_DEFINED: @@ -216,6 +222,7 @@ static const char *eventDetailToString(int event, int detail) { return ret; } + static const char * networkEventToString(int event) { @@ -237,6 +244,7 @@ networkEventToString(int event) return ret; } + static const char * guestAgentLifecycleEventStateToString(int event) { @@ -255,6 +263,7 @@ guestAgentLifecycleEventStateToString(int event) return ret; } + static const char * guestAgentLifecycleEventReasonToString(int event) { @@ -278,11 +287,12 @@ guestAgentLifecycleEventReasonToString(int event) } -static int myDomainEventCallback1(virConnectPtr conn ATTRIBUTE_UNUSED, - virDomainPtr dom, - int event, - int detail, - void *opaque ATTRIBUTE_UNUSED) +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), @@ -290,11 +300,13 @@ static int myDomainEventCallback1(virConnectPtr conn ATTRIBUTE_UNUSED, return 0; } -static int myDomainEventCallback2(virConnectPtr conn ATTRIBUTE_UNUSED, - virDomainPtr dom, - int event, - int detail, - void *opaque ATTRIBUTE_UNUSED) + +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), @@ -302,9 +314,11 @@ static int myDomainEventCallback2(virConnectPtr conn ATTRIBUTE_UNUSED, return 0; } -static int myDomainEventRebootCallback(virConnectPtr conn ATTRIBUTE_UNUSED, - virDomainPtr dom, - void *opaque ATTRIBUTE_UNUSED) + +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)); @@ -312,10 +326,12 @@ static int myDomainEventRebootCallback(virConnectPtr conn ATTRIBUTE_UNUSED, return 0; } -static int myDomainEventRTCChangeCallback(virConnectPtr conn ATTRIBUTE_UNUSED, - virDomainPtr dom, - long long offset, - void *opaque ATTRIBUTE_UNUSED) + +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), @@ -324,10 +340,12 @@ static int myDomainEventRTCChangeCallback(virConnectPtr conn ATTRIBUTE_UNUSED, return 0; } -static int myDomainEventBalloonChangeCallback(virConnectPtr conn ATTRIBUTE_UNUSED, - virDomainPtr dom, - unsigned long long actual, - void *opaque ATTRIBUTE_UNUSED) + +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); @@ -335,38 +353,45 @@ static int myDomainEventBalloonChangeCallback(virConnectPtr conn ATTRIBUTE_UNUSE return 0; } -static int myDomainEventWatchdogCallback(virConnectPtr conn ATTRIBUTE_UNUSED, - virDomainPtr dom, - int action, - void *opaque ATTRIBUTE_UNUSED) + +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); + 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) + +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); + 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) + +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), @@ -400,12 +425,14 @@ static int myDomainEventGraphicsCallback(virConnectPtr conn ATTRIBUTE_UNUSED, return 0; } -static int myDomainEventControlErrorCallback(virConnectPtr conn ATTRIBUTE_UNUSED, - virDomainPtr dom, - void *opaque ATTRIBUTE_UNUSED) + +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)); + printf("%s EVENT: Domain %s(%d) control error\n", __func__, + virDomainGetName(dom), virDomainGetID(dom)); return 0; } @@ -415,15 +442,17 @@ 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) +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", + 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; @@ -434,48 +463,58 @@ const char *trayChangeReasonStrings[] = { "close", }; -static int myDomainEventTrayChangeCallback(virConnectPtr conn ATTRIBUTE_UNUSED, - virDomainPtr dom, - const char *devAlias, - int reason, - void *opaque ATTRIBUTE_UNUSED) + +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", + 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) + +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) + +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) + +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, @@ -487,17 +526,20 @@ myDomainEventDeviceRemovedCallback(virConnectPtr conn ATTRIBUTE_UNUSED, return 0; } -static int myNetworkEventCallback(virConnectPtr conn ATTRIBUTE_UNUSED, - virNetworkPtr dom, - int event, - int detail, - void *opaque ATTRIBUTE_UNUSED) + +static int +myNetworkEventCallback(virConnectPtr conn ATTRIBUTE_UNUSED, + virNetworkPtr dom, + int event, + int detail, + void *opaque ATTRIBUTE_UNUSED) { printf("%s EVENT: Network %s %s %d\n", __func__, virNetworkGetName(dom), networkEventToString(event), detail); return 0; } + static int myDomainEventTunableCallback(virConnectPtr conn ATTRIBUTE_UNUSED, virDomainPtr dom, @@ -543,6 +585,7 @@ myDomainEventTunableCallback(virConnectPtr conn ATTRIBUTE_UNUSED, return 0; } + static int myDomainEventAgentLifecycleCallback(virConnectPtr conn ATTRIBUTE_UNUSED, virDomainPtr dom, @@ -558,6 +601,7 @@ myDomainEventAgentLifecycleCallback(virConnectPtr conn ATTRIBUTE_UNUSED, return 0; } + static int myDomainEventDeviceAddedCallback(virConnectPtr conn ATTRIBUTE_UNUSED, virDomainPtr dom, @@ -569,7 +613,9 @@ myDomainEventDeviceAddedCallback(virConnectPtr conn ATTRIBUTE_UNUSED, return 0; } -static void myFreeFunc(void *opaque) + +static void +myFreeFunc(void *opaque) { char *str = opaque; printf("%s: Freeing [%s]\n", __func__, str); @@ -578,15 +624,16 @@ static void myFreeFunc(void *opaque) /* main test functions */ - -static void stop(int sig) +static void +stop(int sig) { printf("Exiting on signal %d\n", sig); run = 0; } -int main(int argc, char **argv) +int +main(int argc, char **argv) { int ret = EXIT_FAILURE; virConnectPtr dconn = NULL; -- 2.8.0

On Thu, Apr 14, 2016 at 05:52:29PM +0200, Peter Krempa wrote:
Break long lines and format headers correctly. --- examples/object-events/event-test.c | 227 ++++++++++++++++++++++-------------- 1 file changed, 137 insertions(+), 90 deletions(-)
ACK Jan

Arrays would induce crash if a new value was introduced without adding it here. This could happen for VIR_DOMAIN_EVENT_DISK_DROP_MISSING_ON_START --- examples/object-events/event-test.c | 37 ++++++++++++++++++++++++++++--------- 1 file changed, 28 insertions(+), 9 deletions(-) diff --git a/examples/object-events/event-test.c b/examples/object-events/event-test.c index 3ab2b64..68a571b 100644 --- a/examples/object-events/event-test.c +++ b/examples/object-events/event-test.c @@ -437,11 +437,21 @@ myDomainEventControlErrorCallback(virConnectPtr conn ATTRIBUTE_UNUSED, return 0; } +static const char * +diskChangeReasonToStr(int reason) +{ + switch ((virConnectDomainEventDiskChangeReason) reason) { + case VIR_DOMAIN_EVENT_DISK_CHANGE_MISSING_ON_START: + return "disk empty due to startupPolicy"; + + case VIR_DOMAIN_EVENT_DISK_DROP_MISSING_ON_START: + return "disk dropped due to startupPolicy"; + } + + return "unknown"; +} + -const char *diskChangeReasonStrings[] = { - "startupPolicy", /* 0 */ - /* add new reason here */ -}; static int myDomainEventDiskChangeCallback(virConnectPtr conn ATTRIBUTE_UNUSED, virDomainPtr dom, @@ -454,13 +464,22 @@ myDomainEventDiskChangeCallback(virConnectPtr conn 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]); + oldSrcPath, newSrcPath, devAlias, diskChangeReasonToStr(reason)); return 0; } -const char *trayChangeReasonStrings[] = { - "open", - "close", +static const char * +trayChangeReasonToStr(int reason) +{ + switch ((virDomainEventTrayChangeReason) reason) { + case VIR_DOMAIN_EVENT_TRAY_CHANGE_OPEN: + return "open"; + + case VIR_DOMAIN_EVENT_TRAY_CHANGE_CLOSE: + return "close"; + } + + return "unknown"; }; @@ -474,7 +493,7 @@ myDomainEventTrayChangeCallback(virConnectPtr conn 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]); + devAlias, trayChangeReasonToStr(reason)); return 0; } -- 2.8.0

On Thu, Apr 14, 2016 at 05:52:30PM +0200, Peter Krempa wrote:
Arrays would induce crash if a new value was introduced without adding it here. This could happen for VIR_DOMAIN_EVENT_DISK_DROP_MISSING_ON_START --- examples/object-events/event-test.c | 37 ++++++++++++++++++++++++++++--------- 1 file changed, 28 insertions(+), 9 deletions(-)
+static const char * +diskChangeReasonToStr(int reason)
diskChangeReasonToString would looks nicer, but Str is readable enough, thanks to all the std funcs in libc. ACK Jan
+{ + switch ((virConnectDomainEventDiskChangeReason) reason) { + case VIR_DOMAIN_EVENT_DISK_CHANGE_MISSING_ON_START: + return "disk empty due to startupPolicy"; + + case VIR_DOMAIN_EVENT_DISK_DROP_MISSING_ON_START: + return "disk dropped due to startupPolicy"; + } + + return "unknown"; +} +

--- include/libvirt/libvirt-domain.h | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/include/libvirt/libvirt-domain.h b/include/libvirt/libvirt-domain.h index 8220ab0..4faa6fd 100644 --- a/include/libvirt/libvirt-domain.h +++ b/include/libvirt/libvirt-domain.h @@ -3170,8 +3170,12 @@ typedef void (*virConnectDomainEventBlockJobCallback)(virConnectPtr conn, * The reason describing why this callback is called */ typedef enum { - VIR_DOMAIN_EVENT_DISK_CHANGE_MISSING_ON_START = 0, /* oldSrcPath is set */ + VIR_DOMAIN_EVENT_DISK_CHANGE_MISSING_ON_START = 0, + /* removable media changed to empty according to startup policy as source + * was missing. oldSrcPath is set, newSrcPath is NULL */ VIR_DOMAIN_EVENT_DISK_DROP_MISSING_ON_START = 1, + /* disk was dropped from domain as source file was missing. + * oldSrcPath is set, newSrcPath is NULL */ # ifdef VIR_ENUM_SENTINELS VIR_DOMAIN_EVENT_DISK_CHANGE_LAST -- 2.8.0

--- examples/object-events/event-test.c | 21 ++++++++++++--------- 1 file changed, 12 insertions(+), 9 deletions(-) diff --git a/examples/object-events/event-test.c b/examples/object-events/event-test.c index 68a571b..22bd706 100644 --- a/examples/object-events/event-test.c +++ b/examples/object-events/event-test.c @@ -23,24 +23,27 @@ connectClose(virConnectPtr conn ATTRIBUTE_UNUSED, int reason, void *opaque ATTRIBUTE_UNUSED) { - switch (reason) { + run = 0; + + switch ((virConnectCloseReason) reason) { case VIR_CONNECT_CLOSE_REASON_ERROR: fprintf(stderr, "Connection closed due to I/O error\n"); - break; + return; + case VIR_CONNECT_CLOSE_REASON_EOF: fprintf(stderr, "Connection closed due to end of file\n"); - break; + return; + case VIR_CONNECT_CLOSE_REASON_KEEPALIVE: fprintf(stderr, "Connection closed due to keepalive timeout\n"); - break; + return; + 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; + return; }; - run = 0; + + fprintf(stderr, "Connection closed due to unknown reason\n"); } -- 2.8.0

On Thu, Apr 14, 2016 at 05:52:32PM +0200, Peter Krempa wrote:
--- examples/object-events/event-test.c | 21 ++++++++++++--------- 1 file changed, 12 insertions(+), 9 deletions(-)
ACK Jan

--- examples/object-events/event-test.c | 31 ++++++++++++++++++++----------- 1 file changed, 20 insertions(+), 11 deletions(-) diff --git a/examples/object-events/event-test.c b/examples/object-events/event-test.c index 22bd706..e1ad990 100644 --- a/examples/object-events/event-test.c +++ b/examples/object-events/event-test.c @@ -386,6 +386,24 @@ myDomainEventIOErrorCallback(virConnectPtr conn ATTRIBUTE_UNUSED, } +static const char * +graphicsPhaseToStr(int phase) +{ + switch ((virDomainEventGraphicsPhase) phase) { + case VIR_DOMAIN_EVENT_GRAPHICS_CONNECT: + return "connected "; + + case VIR_DOMAIN_EVENT_GRAPHICS_INITIALIZE: + return "initialized "; + + case VIR_DOMAIN_EVENT_GRAPHICS_DISCONNECT: + return "disconnected "; + } + + return "unknown"; +} + + static int myDomainEventGraphicsCallback(virConnectPtr conn ATTRIBUTE_UNUSED, virDomainPtr dom, @@ -400,17 +418,8 @@ myDomainEventGraphicsCallback(virConnectPtr conn ATTRIBUTE_UNUSED, 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("%s", graphicsPhaseToStr(phase)); + printf("local: family=%d node=%s service=%s ", local->family, local->node, local->service); -- 2.8.0

On Thu, Apr 14, 2016 at 05:52:33PM +0200, Peter Krempa wrote:
--- examples/object-events/event-test.c | 31 ++++++++++++++++++++----------- 1 file changed, 20 insertions(+), 11 deletions(-)
ACK
diff --git a/examples/object-events/event-test.c b/examples/object-events/event-test.c index 22bd706..e1ad990 100644 --- a/examples/object-events/event-test.c +++ b/examples/object-events/event-test.c @@ -386,6 +386,24 @@ myDomainEventIOErrorCallback(virConnectPtr conn ATTRIBUTE_UNUSED, }
+static const char * +graphicsPhaseToStr(int phase) +{ + switch ((virDomainEventGraphicsPhase) phase) { + case VIR_DOMAIN_EVENT_GRAPHICS_CONNECT: + return "connected ";
Adding the space in the caller would be neater.
+ + case VIR_DOMAIN_EVENT_GRAPHICS_INITIALIZE: + return "initialized "; + + case VIR_DOMAIN_EVENT_GRAPHICS_DISCONNECT: + return "disconnected "; + } + + return "unknown";
This string does not have a trailing space.
+} + + static int myDomainEventGraphicsCallback(virConnectPtr conn ATTRIBUTE_UNUSED, virDomainPtr dom, @@ -400,17 +418,8 @@ myDomainEventGraphicsCallback(virConnectPtr conn ATTRIBUTE_UNUSED, 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("%s", graphicsPhaseToStr(phase)); +
Why the extra newline? Jan

--- examples/object-events/event-test.c | 22 ++++++++++++++++------ 1 file changed, 16 insertions(+), 6 deletions(-) diff --git a/examples/object-events/event-test.c b/examples/object-events/event-test.c index e1ad990..910e869 100644 --- a/examples/object-events/event-test.c +++ b/examples/object-events/event-test.c @@ -91,20 +91,30 @@ eventDetailToString(int event, const char *ret = ""; switch ((virDomainEventType) event) { case VIR_DOMAIN_EVENT_DEFINED: - if (detail == VIR_DOMAIN_EVENT_DEFINED_ADDED) + switch ((virDomainEventDefinedDetailType) detail) { + case VIR_DOMAIN_EVENT_DEFINED_ADDED: ret = "Added"; - else if (detail == VIR_DOMAIN_EVENT_DEFINED_UPDATED) + break; + case VIR_DOMAIN_EVENT_DEFINED_UPDATED: ret = "Updated"; - else if (detail == VIR_DOMAIN_EVENT_DEFINED_RENAMED) + break; + case VIR_DOMAIN_EVENT_DEFINED_RENAMED: ret = "Renamed"; - else if (detail == VIR_DOMAIN_EVENT_DEFINED_FROM_SNAPSHOT) + break; + case VIR_DOMAIN_EVENT_DEFINED_FROM_SNAPSHOT: ret = "Snapshot"; + break; + } break; case VIR_DOMAIN_EVENT_UNDEFINED: - if (detail == VIR_DOMAIN_EVENT_UNDEFINED_REMOVED) + switch ((virDomainEventUndefinedDetailType) detail) { + case VIR_DOMAIN_EVENT_UNDEFINED_REMOVED: ret = "Removed"; - else if (detail == VIR_DOMAIN_EVENT_UNDEFINED_RENAMED) + break; + case VIR_DOMAIN_EVENT_UNDEFINED_RENAMED: ret = "Renamed"; + break; + } break; case VIR_DOMAIN_EVENT_STARTED: switch ((virDomainEventStartedDetailType) detail) { -- 2.8.0

On Thu, Apr 14, 2016 at 05:52:34PM +0200, Peter Krempa wrote:
--- examples/object-events/event-test.c | 22 ++++++++++++++++------ 1 file changed, 16 insertions(+), 6 deletions(-)
ACK Jan

Make them return "uknown" for invalid values without breaking compiler checks to add new values. --- examples/object-events/event-test.c | 226 +++++++++++++++++------------------- 1 file changed, 108 insertions(+), 118 deletions(-) diff --git a/examples/object-events/event-test.c b/examples/object-events/event-test.c index 910e869..9672171 100644 --- a/examples/object-events/event-test.c +++ b/examples/object-events/event-test.c @@ -50,37 +50,36 @@ connectClose(virConnectPtr conn ATTRIBUTE_UNUSED, static const char * eventToString(int event) { - const char *ret = ""; switch ((virDomainEventType) event) { case VIR_DOMAIN_EVENT_DEFINED: - ret = "Defined"; - break; + return "Defined"; + case VIR_DOMAIN_EVENT_UNDEFINED: - ret = "Undefined"; - break; + return "Undefined"; + case VIR_DOMAIN_EVENT_STARTED: - ret = "Started"; - break; + return "Started"; + case VIR_DOMAIN_EVENT_SUSPENDED: - ret = "Suspended"; - break; + return "Suspended"; + case VIR_DOMAIN_EVENT_RESUMED: - ret = "Resumed"; - break; + return "Resumed"; + case VIR_DOMAIN_EVENT_STOPPED: - ret = "Stopped"; - break; + return "Stopped"; + case VIR_DOMAIN_EVENT_SHUTDOWN: - ret = "Shutdown"; - break; + return "Shutdown"; + case VIR_DOMAIN_EVENT_PMSUSPENDED: - ret = "PMSuspended"; - break; + return "PMSuspended"; + case VIR_DOMAIN_EVENT_CRASHED: - ret = "Crashed"; - break; + return "Crashed"; } - return ret; + + return "unknown"; } @@ -88,215 +87,206 @@ static const char * eventDetailToString(int event, int detail) { - const char *ret = ""; switch ((virDomainEventType) event) { case VIR_DOMAIN_EVENT_DEFINED: switch ((virDomainEventDefinedDetailType) detail) { case VIR_DOMAIN_EVENT_DEFINED_ADDED: - ret = "Added"; - break; + return "Added"; + case VIR_DOMAIN_EVENT_DEFINED_UPDATED: - ret = "Updated"; - break; + return "Updated"; + case VIR_DOMAIN_EVENT_DEFINED_RENAMED: - ret = "Renamed"; - break; + return "Renamed"; + case VIR_DOMAIN_EVENT_DEFINED_FROM_SNAPSHOT: - ret = "Snapshot"; - break; + return "Snapshot"; } break; + case VIR_DOMAIN_EVENT_UNDEFINED: switch ((virDomainEventUndefinedDetailType) detail) { case VIR_DOMAIN_EVENT_UNDEFINED_REMOVED: - ret = "Removed"; - break; + return "Removed"; + case VIR_DOMAIN_EVENT_UNDEFINED_RENAMED: - ret = "Renamed"; - break; + return "Renamed"; } break; + case VIR_DOMAIN_EVENT_STARTED: switch ((virDomainEventStartedDetailType) detail) { case VIR_DOMAIN_EVENT_STARTED_BOOTED: - ret = "Booted"; - break; + return "Booted"; + case VIR_DOMAIN_EVENT_STARTED_MIGRATED: - ret = "Migrated"; - break; + return "Migrated"; + case VIR_DOMAIN_EVENT_STARTED_RESTORED: - ret = "Restored"; - break; + return "Restored"; + case VIR_DOMAIN_EVENT_STARTED_FROM_SNAPSHOT: - ret = "Snapshot"; - break; + return "Snapshot"; + case VIR_DOMAIN_EVENT_STARTED_WAKEUP: - ret = "Event wakeup"; - break; + return "Event wakeup"; } break; + case VIR_DOMAIN_EVENT_SUSPENDED: switch ((virDomainEventSuspendedDetailType) detail) { case VIR_DOMAIN_EVENT_SUSPENDED_PAUSED: - ret = "Paused"; - break; + return "Paused"; + case VIR_DOMAIN_EVENT_SUSPENDED_MIGRATED: - ret = "Migrated"; - break; + return "Migrated"; + case VIR_DOMAIN_EVENT_SUSPENDED_IOERROR: - ret = "I/O Error"; - break; + return "I/O Error"; + case VIR_DOMAIN_EVENT_SUSPENDED_WATCHDOG: - ret = "Watchdog"; - break; + return "Watchdog"; + case VIR_DOMAIN_EVENT_SUSPENDED_RESTORED: - ret = "Restored"; - break; + return "Restored"; + case VIR_DOMAIN_EVENT_SUSPENDED_FROM_SNAPSHOT: - ret = "Snapshot"; - break; + return "Snapshot"; + case VIR_DOMAIN_EVENT_SUSPENDED_API_ERROR: - ret = "API error"; - break; + return "API error"; + case VIR_DOMAIN_EVENT_SUSPENDED_POSTCOPY: - ret = "Post-copy"; - break; + return "Post-copy"; + case VIR_DOMAIN_EVENT_SUSPENDED_POSTCOPY_FAILED: - ret = "Post-copy Error"; - break; + return "Post-copy Error"; } break; + case VIR_DOMAIN_EVENT_RESUMED: switch ((virDomainEventResumedDetailType) detail) { case VIR_DOMAIN_EVENT_RESUMED_UNPAUSED: - ret = "Unpaused"; - break; + return "Unpaused"; + case VIR_DOMAIN_EVENT_RESUMED_MIGRATED: - ret = "Migrated"; - break; + return "Migrated"; + case VIR_DOMAIN_EVENT_RESUMED_FROM_SNAPSHOT: - ret = "Snapshot"; - break; + return "Snapshot"; + case VIR_DOMAIN_EVENT_RESUMED_POSTCOPY: - ret = "Post-copy"; - break; + return "Post-copy"; } break; + case VIR_DOMAIN_EVENT_STOPPED: switch ((virDomainEventStoppedDetailType) detail) { case VIR_DOMAIN_EVENT_STOPPED_SHUTDOWN: - ret = "Shutdown"; - break; + return "Shutdown"; + case VIR_DOMAIN_EVENT_STOPPED_DESTROYED: - ret = "Destroyed"; - break; + return "Destroyed"; + case VIR_DOMAIN_EVENT_STOPPED_CRASHED: - ret = "Crashed"; - break; + return "Crashed"; + case VIR_DOMAIN_EVENT_STOPPED_MIGRATED: - ret = "Migrated"; - break; + return "Migrated"; + case VIR_DOMAIN_EVENT_STOPPED_SAVED: - ret = "Saved"; - break; + return "Saved"; + case VIR_DOMAIN_EVENT_STOPPED_FAILED: - ret = "Failed"; - break; + return "Failed"; + case VIR_DOMAIN_EVENT_STOPPED_FROM_SNAPSHOT: - ret = "Snapshot"; - break; + return "Snapshot"; } break; + case VIR_DOMAIN_EVENT_SHUTDOWN: switch ((virDomainEventShutdownDetailType) detail) { case VIR_DOMAIN_EVENT_SHUTDOWN_FINISHED: - ret = "Finished"; - break; + return "Finished"; + } break; + case VIR_DOMAIN_EVENT_PMSUSPENDED: switch ((virDomainEventPMSuspendedDetailType) detail) { case VIR_DOMAIN_EVENT_PMSUSPENDED_MEMORY: - ret = "Memory"; - break; + return "Memory"; + case VIR_DOMAIN_EVENT_PMSUSPENDED_DISK: - ret = "Disk"; - break; + return "Disk"; } break; + case VIR_DOMAIN_EVENT_CRASHED: switch ((virDomainEventCrashedDetailType) detail) { case VIR_DOMAIN_EVENT_CRASHED_PANICKED: - ret = "Panicked"; - break; + return "Panicked"; } break; } - return ret; + + return "unknown"; } static const char * networkEventToString(int event) { - const char *ret = ""; switch ((virNetworkEventLifecycleType) event) { case VIR_NETWORK_EVENT_DEFINED: - ret = "Defined"; - break; + return "Defined"; + case VIR_NETWORK_EVENT_UNDEFINED: - ret = "Undefined"; - break; + return "Undefined"; + case VIR_NETWORK_EVENT_STARTED: - ret = "Started"; - break; + return "Started"; + case VIR_NETWORK_EVENT_STOPPED: - ret = "Stopped"; - break; + return "Stopped"; + } - return ret; + + return "unknown"; } static const char * guestAgentLifecycleEventStateToString(int event) { - const char *ret = ""; - switch ((virConnectDomainEventAgentLifecycleState) event) { case VIR_CONNECT_DOMAIN_EVENT_AGENT_LIFECYCLE_STATE_DISCONNECTED: - ret = "Disconnected"; - break; + return "Disconnected"; case VIR_CONNECT_DOMAIN_EVENT_AGENT_LIFECYCLE_STATE_CONNECTED: - ret = "Connected"; - break; + return "Connected"; } - return ret; + return "unknown"; } static const char * guestAgentLifecycleEventReasonToString(int event) { - const char *ret = ""; - switch ((virConnectDomainEventAgentLifecycleReason) event) { case VIR_CONNECT_DOMAIN_EVENT_AGENT_LIFECYCLE_REASON_UNKNOWN: - ret = "Unknown"; - break; + return "Unknown"; case VIR_CONNECT_DOMAIN_EVENT_AGENT_LIFECYCLE_REASON_DOMAIN_STARTED: - ret = "Domain started"; - break; + return "Domain started"; case VIR_CONNECT_DOMAIN_EVENT_AGENT_LIFECYCLE_REASON_CHANNEL: - ret = "Channel event"; - break; + return "Channel event"; } - return ret; + return "unknown"; } -- 2.8.0

On Thu, Apr 14, 2016 at 05:52:35PM +0200, Peter Krempa wrote:
Make them return "uknown" for invalid values without breaking compiler checks to add new values. --- examples/object-events/event-test.c | 226 +++++++++++++++++------------------- 1 file changed, 108 insertions(+), 118 deletions(-)
ACK Jan

Avoid forgetting to add the correct fiels to the event-test. --- examples/Makefile.am | 5 ++++ examples/object-events/event-test.c | 54 +++++++++++++++++++++++++++++++++++++ 2 files changed, 59 insertions(+) diff --git a/examples/Makefile.am b/examples/Makefile.am index 2adcefb..46465f9 100644 --- a/examples/Makefile.am +++ b/examples/Makefile.am @@ -48,7 +48,12 @@ dommigrate_dommigrate_SOURCES = dommigrate/dommigrate.c domsuspend_suspend_SOURCES = domsuspend/suspend.c domtop_domtop_SOURCES = domtop/domtop.c hellolibvirt_hellolibvirt_SOURCES = hellolibvirt/hellolibvirt.c + +object_events_event_test_CFLAGS = \ + $(WARN_CFLAGS) \ + $(NULL) object_events_event_test_SOURCES = object-events/event-test.c + openauth_openauth_SOURCES = openauth/openauth.c rename_rename_SOURCES = rename/rename.c diff --git a/examples/object-events/event-test.c b/examples/object-events/event-test.c index 9672171..ebfc557 100644 --- a/examples/object-events/event-test.c +++ b/examples/object-events/event-test.c @@ -6,6 +6,8 @@ #include <signal.h> #include <inttypes.h> +#define VIR_ENUM_SENTINELS + #include <libvirt/libvirt.h> #include <libvirt/virterror.h> @@ -41,6 +43,9 @@ connectClose(virConnectPtr conn ATTRIBUTE_UNUSED, case VIR_CONNECT_CLOSE_REASON_CLIENT: fprintf(stderr, "Connection closed due to client request\n"); return; + + case VIR_CONNECT_CLOSE_REASON_LAST: + break; }; fprintf(stderr, "Connection closed due to unknown reason\n"); @@ -77,6 +82,9 @@ eventToString(int event) case VIR_DOMAIN_EVENT_CRASHED: return "Crashed"; + + case VIR_DOMAIN_EVENT_LAST: + break; } return "unknown"; @@ -101,6 +109,9 @@ eventDetailToString(int event, case VIR_DOMAIN_EVENT_DEFINED_FROM_SNAPSHOT: return "Snapshot"; + + case VIR_DOMAIN_EVENT_DEFINED_LAST: + break; } break; @@ -111,6 +122,9 @@ eventDetailToString(int event, case VIR_DOMAIN_EVENT_UNDEFINED_RENAMED: return "Renamed"; + + case VIR_DOMAIN_EVENT_UNDEFINED_LAST: + break; } break; @@ -130,6 +144,9 @@ eventDetailToString(int event, case VIR_DOMAIN_EVENT_STARTED_WAKEUP: return "Event wakeup"; + + case VIR_DOMAIN_EVENT_STARTED_LAST: + break; } break; @@ -161,6 +178,9 @@ eventDetailToString(int event, case VIR_DOMAIN_EVENT_SUSPENDED_POSTCOPY_FAILED: return "Post-copy Error"; + + case VIR_DOMAIN_EVENT_SUSPENDED_LAST: + break; } break; @@ -177,6 +197,9 @@ eventDetailToString(int event, case VIR_DOMAIN_EVENT_RESUMED_POSTCOPY: return "Post-copy"; + + case VIR_DOMAIN_EVENT_RESUMED_LAST: + break; } break; @@ -202,6 +225,9 @@ eventDetailToString(int event, case VIR_DOMAIN_EVENT_STOPPED_FROM_SNAPSHOT: return "Snapshot"; + + case VIR_DOMAIN_EVENT_STOPPED_LAST: + break; } break; @@ -210,6 +236,8 @@ eventDetailToString(int event, case VIR_DOMAIN_EVENT_SHUTDOWN_FINISHED: return "Finished"; + case VIR_DOMAIN_EVENT_SHUTDOWN_LAST: + break; } break; @@ -220,6 +248,9 @@ eventDetailToString(int event, case VIR_DOMAIN_EVENT_PMSUSPENDED_DISK: return "Disk"; + + case VIR_DOMAIN_EVENT_PMSUSPENDED_LAST: + break; } break; @@ -227,8 +258,14 @@ eventDetailToString(int event, switch ((virDomainEventCrashedDetailType) detail) { case VIR_DOMAIN_EVENT_CRASHED_PANICKED: return "Panicked"; + + case VIR_DOMAIN_EVENT_CRASHED_LAST: + break; } break; + + case VIR_DOMAIN_EVENT_LAST: + break; } return "unknown"; @@ -251,6 +288,8 @@ networkEventToString(int event) case VIR_NETWORK_EVENT_STOPPED: return "Stopped"; + case VIR_NETWORK_EVENT_LAST: + break; } return "unknown"; @@ -266,6 +305,9 @@ guestAgentLifecycleEventStateToString(int event) case VIR_CONNECT_DOMAIN_EVENT_AGENT_LIFECYCLE_STATE_CONNECTED: return "Connected"; + + case VIR_CONNECT_DOMAIN_EVENT_AGENT_LIFECYCLE_STATE_LAST: + break; } return "unknown"; @@ -284,6 +326,9 @@ guestAgentLifecycleEventReasonToString(int event) case VIR_CONNECT_DOMAIN_EVENT_AGENT_LIFECYCLE_REASON_CHANNEL: return "Channel event"; + + case VIR_CONNECT_DOMAIN_EVENT_AGENT_LIFECYCLE_REASON_LAST: + break; } return "unknown"; @@ -398,6 +443,9 @@ graphicsPhaseToStr(int phase) case VIR_DOMAIN_EVENT_GRAPHICS_DISCONNECT: return "disconnected "; + + case VIR_DOMAIN_EVENT_GRAPHICS_LAST: + break; } return "unknown"; @@ -458,6 +506,9 @@ diskChangeReasonToStr(int reason) case VIR_DOMAIN_EVENT_DISK_DROP_MISSING_ON_START: return "disk dropped due to startupPolicy"; + + case VIR_DOMAIN_EVENT_DISK_CHANGE_LAST: + break; } return "unknown"; @@ -489,6 +540,9 @@ trayChangeReasonToStr(int reason) case VIR_DOMAIN_EVENT_TRAY_CHANGE_CLOSE: return "close"; + + case VIR_DOMAIN_EVENT_TRAY_CHANGE_LAST: + break; } return "unknown"; -- 2.8.0

The summary does not make sense. How about: event-test: warn on unhandled enum values On Thu, Apr 14, 2016 at 05:52:36PM +0200, Peter Krempa wrote:
Avoid forgetting to add the correct fiels to the event-test.
*fields or even: to the switches in event-test.
--- examples/Makefile.am | 5 ++++ examples/object-events/event-test.c | 54 +++++++++++++++++++++++++++++++++++++ 2 files changed, 59 insertions(+)
ACK Jan

Rather than copying loads of ugly code, let's help out by a few C tricks. --- examples/object-events/event-test.c | 200 +++++++++++------------------------- 1 file changed, 62 insertions(+), 138 deletions(-) diff --git a/examples/object-events/event-test.c b/examples/object-events/event-test.c index ebfc557..4123a17 100644 --- a/examples/object-events/event-test.c +++ b/examples/object-events/event-test.c @@ -11,6 +11,7 @@ #include <libvirt/libvirt.h> #include <libvirt/virterror.h> +#define ARRAY_CARDINALITY(Array) (sizeof(Array) / sizeof(*(Array))) #define STREQ(a, b) (strcmp(a, b) == 0) #ifndef ATTRIBUTE_UNUSED @@ -717,31 +718,51 @@ stop(int sig) } +struct domainEventData { + int event; + int id; + virConnectDomainEventGenericCallback cb; + const char *name; +}; + + +#define DOMAIN_EVENT(event, callback) \ + {event, -1, VIR_DOMAIN_EVENT_CALLBACK(callback), #event} + +struct domainEventData domainEvents[] = { + DOMAIN_EVENT(VIR_DOMAIN_EVENT_ID_LIFECYCLE, myDomainEventCallback2), + DOMAIN_EVENT(VIR_DOMAIN_EVENT_ID_REBOOT, myDomainEventRebootCallback), + DOMAIN_EVENT(VIR_DOMAIN_EVENT_ID_RTC_CHANGE, myDomainEventRTCChangeCallback), + DOMAIN_EVENT(VIR_DOMAIN_EVENT_ID_WATCHDOG, myDomainEventWatchdogCallback), + DOMAIN_EVENT(VIR_DOMAIN_EVENT_ID_IO_ERROR, myDomainEventIOErrorCallback), + DOMAIN_EVENT(VIR_DOMAIN_EVENT_ID_GRAPHICS, myDomainEventGraphicsCallback), + DOMAIN_EVENT(VIR_DOMAIN_EVENT_ID_CONTROL_ERROR, myDomainEventControlErrorCallback), + /* VIR_DOMAIN_EVENT_ID_BLOCK_JOB */ + DOMAIN_EVENT(VIR_DOMAIN_EVENT_ID_DISK_CHANGE, myDomainEventDiskChangeCallback), + DOMAIN_EVENT(VIR_DOMAIN_EVENT_ID_TRAY_CHANGE, myDomainEventTrayChangeCallback), + DOMAIN_EVENT(VIR_DOMAIN_EVENT_ID_PMWAKEUP, myDomainEventPMWakeupCallback), + DOMAIN_EVENT(VIR_DOMAIN_EVENT_ID_PMSUSPEND, myDomainEventPMSuspendCallback), + DOMAIN_EVENT(VIR_DOMAIN_EVENT_ID_BALLOON_CHANGE, myDomainEventBalloonChangeCallback), + DOMAIN_EVENT(VIR_DOMAIN_EVENT_ID_PMSUSPEND_DISK, myDomainEventPMSuspendDiskCallback), + DOMAIN_EVENT(VIR_DOMAIN_EVENT_ID_DEVICE_REMOVED, myDomainEventDeviceRemovedCallback), + /* VIR_DOMAIN_EVENT_ID_BLOCK_JOB_2 */ + DOMAIN_EVENT(VIR_DOMAIN_EVENT_ID_TUNABLE, myDomainEventTunableCallback), + DOMAIN_EVENT(VIR_DOMAIN_EVENT_ID_AGENT_LIFECYCLE, myDomainEventAgentLifecycleCallback), + DOMAIN_EVENT(VIR_DOMAIN_EVENT_ID_DEVICE_ADDED, myDomainEventDeviceAddedCallback), + /* VIR_DOMAIN_EVENT_ID_MIGRATION_ITERATION */ + /* VIR_DOMAIN_EVENT_ID_JOB_COMPLETED */ + /* VIR_DOMAIN_EVENT_ID_DEVICE_REMOVAL_FAILED */ +}; + int main(int argc, char **argv) { int ret = EXIT_FAILURE; virConnectPtr dconn = NULL; 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; int callback16ret = -1; - int callback17ret = -1; - int callback18ret = -1; - int callback19ret = -1; struct sigaction action_stop; + size_t i; memset(&action_stop, 0, sizeof(action_stop)); @@ -783,118 +804,33 @@ main(int argc, char **argv) printf("Registering event callbacks\n"); - /* 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); + + /* register common domain callbacks */ + for (i = 0; i < ARRAY_CARDINALITY(domainEvents); i++) { + struct domainEventData *event = domainEvents + i; + + event->id = virConnectDomainEventRegisterAny(dconn, NULL, + event->event, + event->cb, + strdup(event->name), + myFreeFunc); + + if (event->id < 0) { + fprintf(stderr, "Failed to register event '%s'\n", event->name); + goto cleanup; + } + } + callback16ret = virConnectNetworkEventRegisterAny(dconn, NULL, VIR_NETWORK_EVENT_ID_LIFECYCLE, VIR_NETWORK_EVENT_CALLBACK(myNetworkEventCallback), strdup("net callback"), myFreeFunc); - callback17ret = virConnectDomainEventRegisterAny(dconn, - NULL, - VIR_DOMAIN_EVENT_ID_TUNABLE, - VIR_DOMAIN_EVENT_CALLBACK(myDomainEventTunableCallback), - strdup("tunable"), myFreeFunc); - callback18ret = virConnectDomainEventRegisterAny(dconn, - NULL, - VIR_DOMAIN_EVENT_ID_AGENT_LIFECYCLE, - VIR_DOMAIN_EVENT_CALLBACK(myDomainEventAgentLifecycleCallback), - strdup("guest agent lifecycle"), myFreeFunc); - callback19ret = virConnectDomainEventRegisterAny(dconn, - NULL, - VIR_DOMAIN_EVENT_ID_DEVICE_ADDED, - VIR_DOMAIN_EVENT_CALLBACK(myDomainEventDeviceAddedCallback), - strdup("device added"), 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) || - (callback16ret == -1) || - (callback17ret == -1) || - (callback18ret == -1) || - (callback19ret == -1)) + (callback16ret == -1)) goto cleanup; if (virConnectSetKeepAlive(dconn, 5, 3) < 0) { @@ -914,26 +850,14 @@ main(int argc, char **argv) printf("Deregistering event callbacks\n"); 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); virConnectNetworkEventDeregisterAny(dconn, callback16ret); - virConnectDomainEventDeregisterAny(dconn, callback17ret); - virConnectDomainEventDeregisterAny(dconn, callback18ret); - virConnectDomainEventDeregisterAny(dconn, callback19ret); - if (callback8ret != -1) - virConnectDomainEventDeregisterAny(dconn, callback8ret); + + printf("Deregistering domain event callbacks\n"); + for (i = 0; i < ARRAY_CARDINALITY(domainEvents); i++) { + if (domainEvents[i].id > 0) + virConnectDomainEventDeregisterAny(dconn, domainEvents[i].id); + } virConnectUnregisterCloseCallback(dconn, connectClose); ret = EXIT_SUCCESS; -- 2.8.0

On Thu, Apr 14, 2016 at 05:52:37PM +0200, Peter Krempa wrote:
Rather than copying loads of ugly code, let's help out by a few C tricks. --- examples/object-events/event-test.c | 200 +++++++++++------------------------- 1 file changed, 62 insertions(+), 138 deletions(-)
ACK Jan

--- examples/object-events/event-test.c | 71 +++++++++++++++++++++++++++++++++++-- 1 file changed, 69 insertions(+), 2 deletions(-) diff --git a/examples/object-events/event-test.c b/examples/object-events/event-test.c index 4123a17..97b3a09 100644 --- a/examples/object-events/event-test.c +++ b/examples/object-events/event-test.c @@ -700,6 +700,73 @@ myDomainEventDeviceAddedCallback(virConnectPtr conn ATTRIBUTE_UNUSED, } +static const char * +blockJobTypeToStr(int type) +{ + switch ((virDomainBlockJobType) type) { + case VIR_DOMAIN_BLOCK_JOB_TYPE_UNKNOWN: + case VIR_DOMAIN_BLOCK_JOB_TYPE_LAST: + break; + + case VIR_DOMAIN_BLOCK_JOB_TYPE_PULL: + return "block pull"; + + case VIR_DOMAIN_BLOCK_JOB_TYPE_COPY: + return "block copy"; + + case VIR_DOMAIN_BLOCK_JOB_TYPE_COMMIT: + return "block commit"; + + case VIR_DOMAIN_BLOCK_JOB_TYPE_ACTIVE_COMMIT: + return "active layer block commit"; + } + + return "unknown"; +} + + +static const char * +blockJobStatusToStr(int status) +{ + switch ((virConnectDomainEventBlockJobStatus) status) { + case VIR_DOMAIN_BLOCK_JOB_COMPLETED: + return "completed"; + + case VIR_DOMAIN_BLOCK_JOB_FAILED: + return "failed"; + + case VIR_DOMAIN_BLOCK_JOB_CANCELED: + return "cancelled"; + + case VIR_DOMAIN_BLOCK_JOB_READY: + return "ready"; + + case VIR_DOMAIN_BLOCK_JOB_LAST: + break; + } + + return "unknown"; +} + + +static int +myDomainEventBlockJobCallback(virConnectPtr conn ATTRIBUTE_UNUSED, + virDomainPtr dom, + const char *disk, + int type, + int status, + void *opaque) +{ + const char *eventName = opaque; + + printf("%s EVENT: Domain %s(%d) block job callback '%s' disk '%s', " + "type '%s' status '%s'", + __func__, virDomainGetName(dom), virDomainGetID(dom), eventName, + disk, blockJobTypeToStr(type), blockJobStatusToStr(status)); + return 0; +} + + static void myFreeFunc(void *opaque) { @@ -737,7 +804,7 @@ struct domainEventData domainEvents[] = { DOMAIN_EVENT(VIR_DOMAIN_EVENT_ID_IO_ERROR, myDomainEventIOErrorCallback), DOMAIN_EVENT(VIR_DOMAIN_EVENT_ID_GRAPHICS, myDomainEventGraphicsCallback), DOMAIN_EVENT(VIR_DOMAIN_EVENT_ID_CONTROL_ERROR, myDomainEventControlErrorCallback), - /* VIR_DOMAIN_EVENT_ID_BLOCK_JOB */ + DOMAIN_EVENT(VIR_DOMAIN_EVENT_ID_BLOCK_JOB, myDomainEventBlockJobCallback), DOMAIN_EVENT(VIR_DOMAIN_EVENT_ID_DISK_CHANGE, myDomainEventDiskChangeCallback), DOMAIN_EVENT(VIR_DOMAIN_EVENT_ID_TRAY_CHANGE, myDomainEventTrayChangeCallback), DOMAIN_EVENT(VIR_DOMAIN_EVENT_ID_PMWAKEUP, myDomainEventPMWakeupCallback), @@ -745,7 +812,7 @@ struct domainEventData domainEvents[] = { DOMAIN_EVENT(VIR_DOMAIN_EVENT_ID_BALLOON_CHANGE, myDomainEventBalloonChangeCallback), DOMAIN_EVENT(VIR_DOMAIN_EVENT_ID_PMSUSPEND_DISK, myDomainEventPMSuspendDiskCallback), DOMAIN_EVENT(VIR_DOMAIN_EVENT_ID_DEVICE_REMOVED, myDomainEventDeviceRemovedCallback), - /* VIR_DOMAIN_EVENT_ID_BLOCK_JOB_2 */ + DOMAIN_EVENT(VIR_DOMAIN_EVENT_ID_BLOCK_JOB_2, myDomainEventBlockJobCallback), DOMAIN_EVENT(VIR_DOMAIN_EVENT_ID_TUNABLE, myDomainEventTunableCallback), DOMAIN_EVENT(VIR_DOMAIN_EVENT_ID_AGENT_LIFECYCLE, myDomainEventAgentLifecycleCallback), DOMAIN_EVENT(VIR_DOMAIN_EVENT_ID_DEVICE_ADDED, myDomainEventDeviceAddedCallback), -- 2.8.0

On Thu, Apr 14, 2016 at 05:52:38PM +0200, Peter Krempa wrote:
--- examples/object-events/event-test.c | 71 +++++++++++++++++++++++++++++++++++-- 1 file changed, 69 insertions(+), 2 deletions(-)
ACK Jan

--- examples/object-events/event-test.c | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/examples/object-events/event-test.c b/examples/object-events/event-test.c index 97b3a09..0abcfe4 100644 --- a/examples/object-events/event-test.c +++ b/examples/object-events/event-test.c @@ -767,6 +767,18 @@ myDomainEventBlockJobCallback(virConnectPtr conn ATTRIBUTE_UNUSED, } +static int +myDomainEventMigrationIterationCallback(virConnectPtr conn ATTRIBUTE_UNUSED, + virDomainPtr dom, + int iteration, + void *opaque ATTRIBUTE_UNUSED) +{ + printf("%s EVENT: Domain %s(%d) migration iteration '%d'\n", + __func__, virDomainGetName(dom), virDomainGetID(dom), iteration); + return 0; +} + + static void myFreeFunc(void *opaque) { @@ -816,7 +828,7 @@ struct domainEventData domainEvents[] = { DOMAIN_EVENT(VIR_DOMAIN_EVENT_ID_TUNABLE, myDomainEventTunableCallback), DOMAIN_EVENT(VIR_DOMAIN_EVENT_ID_AGENT_LIFECYCLE, myDomainEventAgentLifecycleCallback), DOMAIN_EVENT(VIR_DOMAIN_EVENT_ID_DEVICE_ADDED, myDomainEventDeviceAddedCallback), - /* VIR_DOMAIN_EVENT_ID_MIGRATION_ITERATION */ + DOMAIN_EVENT(VIR_DOMAIN_EVENT_ID_MIGRATION_ITERATION, myDomainEventMigrationIterationCallback), /* VIR_DOMAIN_EVENT_ID_JOB_COMPLETED */ /* VIR_DOMAIN_EVENT_ID_DEVICE_REMOVAL_FAILED */ }; -- 2.8.0

On Thu, Apr 14, 2016 at 05:52:39PM +0200, Peter Krempa wrote:
--- examples/object-events/event-test.c | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-)
ACK Jan

--- examples/object-events/event-test.c | 45 ++++++++++++++++++++++++++++--------- 1 file changed, 34 insertions(+), 11 deletions(-) diff --git a/examples/object-events/event-test.c b/examples/object-events/event-test.c index 0abcfe4..70f1d4c 100644 --- a/examples/object-events/event-test.c +++ b/examples/object-events/event-test.c @@ -625,19 +625,12 @@ myNetworkEventCallback(virConnectPtr conn ATTRIBUTE_UNUSED, return 0; } - -static int -myDomainEventTunableCallback(virConnectPtr conn ATTRIBUTE_UNUSED, - virDomainPtr dom, - virTypedParameterPtr params, - int nparams, - void *opaque ATTRIBUTE_UNUSED) +static void +eventTypedParamsPrint(virTypedParameterPtr params, + int nparams) { size_t i; - printf("%s EVENT: Domain %s(%d) tunable updated:\n", - __func__, virDomainGetName(dom), virDomainGetID(dom)); - for (i = 0; i < nparams; i++) { switch (params[i].type) { case VIR_TYPED_PARAM_INT: @@ -667,6 +660,20 @@ myDomainEventTunableCallback(virConnectPtr conn ATTRIBUTE_UNUSED, printf("\t%s: unknown type\n", params[i].field); } } +} + + +static int +myDomainEventTunableCallback(virConnectPtr conn ATTRIBUTE_UNUSED, + virDomainPtr dom, + virTypedParameterPtr params, + int nparams, + void *opaque ATTRIBUTE_UNUSED) +{ + printf("%s EVENT: Domain %s(%d) tunable updated:\n", + __func__, virDomainGetName(dom), virDomainGetID(dom)); + + eventTypedParamsPrint(params, nparams); return 0; } @@ -779,6 +786,22 @@ myDomainEventMigrationIterationCallback(virConnectPtr conn ATTRIBUTE_UNUSED, } +static int +myDomainEventJobCompletedCallback(virConnectPtr conn ATTRIBUTE_UNUSED, + virDomainPtr dom, + virTypedParameterPtr params, + int nparams, + void *opaque ATTRIBUTE_UNUSED) +{ + printf("%s EVENT: Domain %s(%d) job completed:\n", + __func__, virDomainGetName(dom), virDomainGetID(dom)); + + eventTypedParamsPrint(params, nparams); + + return 0; +} + + static void myFreeFunc(void *opaque) { @@ -829,7 +852,7 @@ struct domainEventData domainEvents[] = { DOMAIN_EVENT(VIR_DOMAIN_EVENT_ID_AGENT_LIFECYCLE, myDomainEventAgentLifecycleCallback), DOMAIN_EVENT(VIR_DOMAIN_EVENT_ID_DEVICE_ADDED, myDomainEventDeviceAddedCallback), DOMAIN_EVENT(VIR_DOMAIN_EVENT_ID_MIGRATION_ITERATION, myDomainEventMigrationIterationCallback), - /* VIR_DOMAIN_EVENT_ID_JOB_COMPLETED */ + DOMAIN_EVENT(VIR_DOMAIN_EVENT_ID_JOB_COMPLETED, myDomainEventJobCompletedCallback), /* VIR_DOMAIN_EVENT_ID_DEVICE_REMOVAL_FAILED */ }; -- 2.8.0

On Thu, Apr 14, 2016 at 05:52:40PM +0200, Peter Krempa wrote:
--- examples/object-events/event-test.c | 45 ++++++++++++++++++++++++++++--------- 1 file changed, 34 insertions(+), 11 deletions(-)
ACK Jan

--- examples/object-events/event-test.c | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/examples/object-events/event-test.c b/examples/object-events/event-test.c index 70f1d4c..1d8c4b1 100644 --- a/examples/object-events/event-test.c +++ b/examples/object-events/event-test.c @@ -802,6 +802,19 @@ myDomainEventJobCompletedCallback(virConnectPtr conn ATTRIBUTE_UNUSED, } +static int +myDomainEventDeviceRemovalFailedCallback(virConnectPtr conn ATTRIBUTE_UNUSED, + virDomainPtr dom, + const char *devAlias, + void *opaque ATTRIBUTE_UNUSED) +{ + printf("%s EVENT: Domain %s(%d) device removal failed: %s\n", + __func__, virDomainGetName(dom), virDomainGetID(dom), devAlias); + return 0; +} + + + static void myFreeFunc(void *opaque) { @@ -853,7 +866,7 @@ struct domainEventData domainEvents[] = { DOMAIN_EVENT(VIR_DOMAIN_EVENT_ID_DEVICE_ADDED, myDomainEventDeviceAddedCallback), DOMAIN_EVENT(VIR_DOMAIN_EVENT_ID_MIGRATION_ITERATION, myDomainEventMigrationIterationCallback), DOMAIN_EVENT(VIR_DOMAIN_EVENT_ID_JOB_COMPLETED, myDomainEventJobCompletedCallback), - /* VIR_DOMAIN_EVENT_ID_DEVICE_REMOVAL_FAILED */ + DOMAIN_EVENT(VIR_DOMAIN_EVENT_ID_DEVICE_REMOVAL_FAILED, myDomainEventDeviceRemovalFailedCallback), }; int -- 2.8.0

On Thu, Apr 14, 2016 at 05:52:41PM +0200, Peter Krempa wrote:
--- examples/object-events/event-test.c | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-)
ACK Jan

When adding the static check I've noticed that one other event is missing. --- examples/object-events/event-test.c | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/examples/object-events/event-test.c b/examples/object-events/event-test.c index 1d8c4b1..7ec85a2 100644 --- a/examples/object-events/event-test.c +++ b/examples/object-events/event-test.c @@ -432,6 +432,24 @@ myDomainEventIOErrorCallback(virConnectPtr conn ATTRIBUTE_UNUSED, } +static int +myDomainEventIOErrorReasonCallback(virConnectPtr conn ATTRIBUTE_UNUSED, + virDomainPtr dom, + const char *srcPath, + const char *devAlias, + int action, + const char *reason, + void *opaque ATTRIBUTE_UNUSED) +{ + printf("%s EVENT: Domain %s(%d) io error (reason) path=%s alias=%s " + "action=%d reason=%s\n", + __func__, virDomainGetName(dom), virDomainGetID(dom), + srcPath, devAlias, action, reason); + + return 0; +} + + static const char * graphicsPhaseToStr(int phase) { @@ -851,6 +869,7 @@ struct domainEventData domainEvents[] = { DOMAIN_EVENT(VIR_DOMAIN_EVENT_ID_WATCHDOG, myDomainEventWatchdogCallback), DOMAIN_EVENT(VIR_DOMAIN_EVENT_ID_IO_ERROR, myDomainEventIOErrorCallback), DOMAIN_EVENT(VIR_DOMAIN_EVENT_ID_GRAPHICS, myDomainEventGraphicsCallback), + DOMAIN_EVENT(VIR_DOMAIN_EVENT_ID_IO_ERROR_REASON, myDomainEventIOErrorReasonCallback), DOMAIN_EVENT(VIR_DOMAIN_EVENT_ID_CONTROL_ERROR, myDomainEventControlErrorCallback), DOMAIN_EVENT(VIR_DOMAIN_EVENT_ID_BLOCK_JOB, myDomainEventBlockJobCallback), DOMAIN_EVENT(VIR_DOMAIN_EVENT_ID_DISK_CHANGE, myDomainEventDiskChangeCallback), -- 2.8.0

On Thu, Apr 14, 2016 at 05:52:42PM +0200, Peter Krempa wrote:
When adding the static check I've noticed that one other event is missing. --- examples/object-events/event-test.c | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+)
ACK Jan

Use verify to force adding new events by means of static assertions. --- examples/object-events/event-test.c | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/examples/object-events/event-test.c b/examples/object-events/event-test.c index 7ec85a2..265e24a 100644 --- a/examples/object-events/event-test.c +++ b/examples/object-events/event-test.c @@ -6,6 +6,8 @@ #include <signal.h> #include <inttypes.h> +#include <verify.h> + #define VIR_ENUM_SENTINELS #include <libvirt/libvirt.h> @@ -888,6 +890,9 @@ struct domainEventData domainEvents[] = { DOMAIN_EVENT(VIR_DOMAIN_EVENT_ID_DEVICE_REMOVAL_FAILED, myDomainEventDeviceRemovalFailedCallback), }; +/* make sure that the events are kept in sync */ +verify(ARRAY_CARDINALITY(domainEvents) == VIR_DOMAIN_EVENT_ID_LAST); + int main(int argc, char **argv) { -- 2.8.0

On Thu, Apr 14, 2016 at 05:52:43PM +0200, Peter Krempa wrote:
Use verify to force adding new events by means of static assertions. --- examples/object-events/event-test.c | 5 +++++ 1 file changed, 5 insertions(+)
ACK Jan
participants (2)
-
Ján Tomko
-
Peter Krempa