From 421d99500505af9d84a0675f4ea250f01cd53e63 Mon Sep 17 00:00:00 2001 From: "Daniel P. Berrange" Date: Thu, 26 Nov 2009 13:06:24 +0000 Subject: [PATCH] Hook up JSON monitor to emit basic lifecycle events * src/qemu/qemu_monitor_json.c: Hook up reset, shutdown, poweroff and stop events --- src/qemu/qemu_monitor_json.c | 69 ++++++++++++++++++++++++++++++++++-- 1 file changed, 66 insertions(+), 3 deletions(-) diff --git a/src/qemu/qemu_monitor_json.c b/src/qemu/qemu_monitor_json.c index 1aab304321..03562e82ac 100644 --- a/src/qemu/qemu_monitor_json.c +++ b/src/qemu/qemu_monitor_json.c @@ -45,8 +45,51 @@ #define LINE_ENDING "\r\n" +static void qemuMonitorJSONHandleShutdown(qemuMonitorPtr mon, virJSONValuePtr data); +static void qemuMonitorJSONHandleReset(qemuMonitorPtr mon, virJSONValuePtr data); +static void qemuMonitorJSONHandlePowerdown(qemuMonitorPtr mon, virJSONValuePtr data); +static void qemuMonitorJSONHandleStop(qemuMonitorPtr mon, virJSONValuePtr data); + +struct { + const char *type; + void (*handler)(qemuMonitorPtr mon, virJSONValuePtr data); +} eventHandlers[] = { + { "SHUTDOWN", qemuMonitorJSONHandleShutdown, }, + { "RESET", qemuMonitorJSONHandleReset, }, + { "POWERDOWN", qemuMonitorJSONHandlePowerdown, }, + { "STOP", qemuMonitorJSONHandleStop, }, +}; + + static int -qemuMonitorJSONIOProcessLine(qemuMonitorPtr mon ATTRIBUTE_UNUSED, +qemuMonitorJSONIOProcessEvent(qemuMonitorPtr mon, + virJSONValuePtr obj) +{ + char *type; + int i; + VIR_DEBUG("mon=%p obj=%p", mon, obj); + + type = virJSONValueObjectGetString(obj, "event"); + if (!type) { + VIR_WARN0("missing event type in message"); + errno = EINVAL; + return -1; + } + + for (i = 0 ; i < ARRAY_CARDINALITY(eventHandlers) ; i++) { + if (STREQ(eventHandlers[i].type, type)) { + virJSONValuePtr data = virJSONValueObjectGet(obj, "data"); + VIR_DEBUG("handle %s handler=%p data=%p", type, + eventHandlers[i].handler, data); + (eventHandlers[i].handler)(mon, data); + break; + } + } + return 0; +} + +static int +qemuMonitorJSONIOProcessLine(qemuMonitorPtr mon, const char *line, qemuMonitorMessagePtr msg) { @@ -73,8 +116,7 @@ qemuMonitorJSONIOProcessLine(qemuMonitorPtr mon ATTRIBUTE_UNUSED, } if (virJSONValueObjectHasKey(obj, "event") == 1) { - VIR_DEBUG0("Got an event"); - ret = 0; + ret = qemuMonitorJSONIOProcessEvent(mon, obj); goto cleanup; } @@ -413,6 +455,27 @@ error: } +static void qemuMonitorJSONHandleShutdown(qemuMonitorPtr mon, virJSONValuePtr data ATTRIBUTE_UNUSED) +{ + qemuMonitorEmitShutdown(mon); +} + +static void qemuMonitorJSONHandleReset(qemuMonitorPtr mon, virJSONValuePtr data ATTRIBUTE_UNUSED) +{ + qemuMonitorEmitReset(mon); +} + +static void qemuMonitorJSONHandlePowerdown(qemuMonitorPtr mon, virJSONValuePtr data ATTRIBUTE_UNUSED) +{ + qemuMonitorEmitPowerdown(mon); +} + +static void qemuMonitorJSONHandleStop(qemuMonitorPtr mon, virJSONValuePtr data ATTRIBUTE_UNUSED) +{ + qemuMonitorEmitStop(mon); +} + + int qemuMonitorJSONStartCPUs(qemuMonitorPtr mon, virConnectPtr conn ATTRIBUTE_UNUSED)