[libvirt] [PATCH 3/4] Misc fixes to QMP monitor support for QEMU
Daniel Veillard
veillard at redhat.com
Mon Jan 25 14:17:52 UTC 2010
On Fri, Jan 22, 2010 at 05:01:13PM +0000, Daniel P. Berrange wrote:
> * src/util/json.c, src/util/json.h: Declare returned strings
> to be const
> * src/qemu/qemu_monitor.c: Wire up JSON mode for qemuMonitorGetPtyPaths
> * src/qemu/qemu_monitor_json.c, src/qemu/qemu_monitor_json.h: Fix
> const correctness. Add missing error message in the function
> qemuMonitorJSONGetAllPCIAddresses. Add implementation of the
> qemuMonitorGetPtyPaths function calling 'query-chardev'.
> ---
> src/qemu/qemu_monitor.c | 7 ++-
> src/qemu/qemu_monitor_json.c | 121 +++++++++++++++++++++++++++++++++++++++--
> src/qemu/qemu_monitor_json.h | 3 +
> src/util/json.c | 4 +-
> src/util/json.h | 4 +-
> 5 files changed, 128 insertions(+), 11 deletions(-)
>
> diff --git a/src/qemu/qemu_monitor.c b/src/qemu/qemu_monitor.c
> index 031df30..817ccd7 100644
> --- a/src/qemu/qemu_monitor.c
> +++ b/src/qemu/qemu_monitor.c
> @@ -1245,10 +1245,15 @@ int qemuMonitorRemoveHostNetwork(qemuMonitorPtr mon,
> int qemuMonitorGetPtyPaths(qemuMonitorPtr mon,
> virHashTablePtr paths)
> {
> + int ret;
> DEBUG("mon=%p, fd=%d",
> mon, mon->fd);
>
> - return qemuMonitorTextGetPtyPaths(mon, paths);
> + if (mon->json)
> + ret = qemuMonitorJSONGetPtyPaths(mon, paths);
> + else
> + ret = qemuMonitorTextGetPtyPaths(mon, paths);
> + return ret;
> }
>
>
> diff --git a/src/qemu/qemu_monitor_json.c b/src/qemu/qemu_monitor_json.c
> index 57e2ad9..7dd2bdb 100644
> --- a/src/qemu/qemu_monitor_json.c
> +++ b/src/qemu/qemu_monitor_json.c
> @@ -65,7 +65,7 @@ static int
> qemuMonitorJSONIOProcessEvent(qemuMonitorPtr mon,
> virJSONValuePtr obj)
> {
> - char *type;
> + const char *type;
> int i;
> VIR_DEBUG("mon=%p obj=%p", mon, obj);
>
> @@ -248,7 +248,7 @@ qemuMonitorJSONCommand(qemuMonitorPtr mon,
> */
> static char *qemuMonitorJSONStringifyError(virJSONValuePtr error)
> {
> - char *klass = virJSONValueObjectGetString(error, "class");
> + const char *klass = virJSONValueObjectGetString(error, "class");
>
> if (klass) {
> return strdup(klass);
> @@ -304,7 +304,7 @@ qemuMonitorJSONHasError(virJSONValuePtr reply,
> const char *klass)
> {
> virJSONValuePtr error;
> - char *thisklass;
> + const char *thisklass;
>
> if (!virJSONValueObjectHasKey(reply, "error"))
> return 0;
> @@ -592,11 +592,19 @@ int qemuMonitorJSONGetBalloonInfo(qemuMonitorPtr mon,
>
> /* Success */
> if (ret == 0) {
> + virJSONValuePtr data;
> unsigned long long mem;
>
> - if (virJSONValueObjectGetNumberUlong(reply, "return", &mem) < 0) {
> + if (!(data = virJSONValueObjectGet(reply, "return"))) {
> qemudReportError(NULL, NULL, NULL, VIR_ERR_INTERNAL_ERROR, "%s",
> - _("info balloon reply was missing mem return data"));
> + _("info balloon reply was missing return data"));
> + ret = -1;
> + goto cleanup;
> + }
> +
> + if (virJSONValueObjectGetNumberUlong(data, "balloon", &mem) < 0) {
> + qemudReportError(NULL, NULL, NULL, VIR_ERR_INTERNAL_ERROR, "%s",
> + _("info balloon reply was missing balloon data"));
> ret = -1;
> goto cleanup;
> }
> @@ -916,7 +924,7 @@ qemuMonitorJSONGetMigrationStatusReply(virJSONValuePtr reply,
> unsigned long long *total)
> {
> virJSONValuePtr ret;
> - char *statusstr;
> + const char *statusstr;
>
> if (!(ret = virJSONValueObjectGet(reply, "return"))) {
> qemudReportError(NULL, NULL, NULL, VIR_ERR_INTERNAL_ERROR, "%s",
> @@ -1483,6 +1491,105 @@ int qemuMonitorJSONRemoveHostNetwork(qemuMonitorPtr mon,
> }
>
>
> +/*
> + * Example return data
> + *
> + * {"return": [
> + * {"filename": "stdio", "label": "monitor"},
> + * {"filename": "pty:/dev/pts/6", "label": "serial0"},
> + * {"filename": "pty:/dev/pts/7", "label": "parallel0"}
> + * ]}
> + *
> + */
> +static int qemuMonitorJSONExtractPtyPaths(virJSONValuePtr reply,
> + virHashTablePtr paths)
> +{
> + virJSONValuePtr data;
> + int ret = -1;
> + int i;
> +
> + if (!(data = virJSONValueObjectGet(reply, "return"))) {
> + qemudReportError(NULL, NULL, NULL, VIR_ERR_INTERNAL_ERROR, "%s",
> + _("character device reply was missing return data"));
> + goto cleanup;
> + }
> +
> + if (data->type != VIR_JSON_TYPE_ARRAY) {
> + qemudReportError(NULL, NULL, NULL, VIR_ERR_INTERNAL_ERROR, "%s",
> + _("character device information was not an array"));
> + goto cleanup;
> + }
> +
> + for (i = 0 ; i < virJSONValueArraySize(data) ; i++) {
> + virJSONValuePtr entry = virJSONValueArrayGet(data, i);
> + const char *type;
> + const char *id;
> + if (!entry) {
> + qemudReportError(NULL, NULL, NULL, VIR_ERR_INTERNAL_ERROR, "%s",
> + _("character device information was missing aray element"));
> + goto cleanup;
> + }
> +
> + if (!(type = virJSONValueObjectGetString(entry, "filename"))) {
> + qemudReportError(NULL, NULL, NULL, VIR_ERR_INTERNAL_ERROR, "%s",
> + _("character device information was missing filename"));
> + goto cleanup;
> + }
> +
> + if (!(id = virJSONValueObjectGetString(entry, "label"))) {
> + qemudReportError(NULL, NULL, NULL, VIR_ERR_INTERNAL_ERROR, "%s",
> + _("character device information was missing filename"));
> + goto cleanup;
> + }
> +
> + if (STRPREFIX(type, "pty:")) {
> + char *path = strdup(type + strlen("pty:"));
> + if (!path) {
> + virReportOOMError(NULL);
> + goto cleanup;
> + }
> +
> + if (virHashAddEntry(paths, id, path) < 0) {
> + qemudReportError(NULL, NULL, NULL, VIR_ERR_OPERATION_FAILED,
> + _("failed to save chardev path '%s'"), path);
> + VIR_FREE(path);
> + goto cleanup;
> + }
> + }
> + }
> +
> + ret = 0;
> +
> +cleanup:
> + return ret;
> +}
> +
> +int qemuMonitorJSONGetPtyPaths(qemuMonitorPtr mon,
> + virHashTablePtr paths)
> +
> +{
> + int ret;
> + virJSONValuePtr cmd = qemuMonitorJSONMakeCommand("query-chardev",
> + NULL);
> + virJSONValuePtr reply = NULL;
> +
> + if (!cmd)
> + return -1;
> +
> + ret = qemuMonitorJSONCommand(mon, cmd, &reply);
> +
> + if (ret == 0)
> + ret = qemuMonitorJSONCheckError(cmd, reply);
> +
> + if (ret == 0)
> + ret = qemuMonitorJSONExtractPtyPaths(reply, paths);
> +
> + virJSONValueFree(cmd);
> + virJSONValueFree(reply);
> + return ret;
> +}
> +
> +
> int qemuMonitorJSONAttachPCIDiskController(qemuMonitorPtr mon,
> const char *bus,
> virDomainDevicePCIAddress *guestAddr)
> @@ -1594,5 +1701,7 @@ int qemuMonitorJSONAttachDrive(qemuMonitorPtr mon,
> int qemuMonitorJSONGetAllPCIAddresses(qemuMonitorPtr mon ATTRIBUTE_UNUSED,
> qemuMonitorPCIAddress **addrs ATTRIBUTE_UNUSED)
> {
> + qemudReportError(NULL, NULL, NULL, VIR_ERR_INTERNAL_ERROR, "%s",
> + _("query-pci not suppported in JSON mode"));
> return -1;
> }
> diff --git a/src/qemu/qemu_monitor_json.h b/src/qemu/qemu_monitor_json.h
> index 7db9785..858aac0 100644
> --- a/src/qemu/qemu_monitor_json.h
> +++ b/src/qemu/qemu_monitor_json.h
> @@ -141,6 +141,9 @@ int qemuMonitorJSONRemoveHostNetwork(qemuMonitorPtr mon,
> int vlan,
> const char *netname);
>
> +int qemuMonitorJSONGetPtyPaths(qemuMonitorPtr mon,
> + virHashTablePtr paths);
> +
> int qemuMonitorJSONAttachPCIDiskController(qemuMonitorPtr mon,
> const char *bus,
> virDomainDevicePCIAddress *guestAddr);
> diff --git a/src/util/json.c b/src/util/json.c
> index 4b3e629..a292e1b 100644
> --- a/src/util/json.c
> +++ b/src/util/json.c
> @@ -440,7 +440,7 @@ virJSONValuePtr virJSONValueArrayGet(virJSONValuePtr array, unsigned int element
> return array->data.array.values[element];
> }
>
> -char *virJSONValueGetString(virJSONValuePtr string)
> +const char *virJSONValueGetString(virJSONValuePtr string)
> {
> if (string->type != VIR_JSON_TYPE_STRING)
> return NULL;
> @@ -508,7 +508,7 @@ int virJSONValueIsNull(virJSONValuePtr val)
> }
>
>
> -char *virJSONValueObjectGetString(virJSONValuePtr object, const char *key)
> +const char *virJSONValueObjectGetString(virJSONValuePtr object, const char *key)
> {
> virJSONValuePtr val;
> if (object->type != VIR_JSON_TYPE_OBJECT)
> diff --git a/src/util/json.h b/src/util/json.h
> index 7468628..1af9d9d 100644
> --- a/src/util/json.h
> +++ b/src/util/json.h
> @@ -99,7 +99,7 @@ virJSONValuePtr virJSONValueObjectGet(virJSONValuePtr object, const char *key);
> int virJSONValueArraySize(virJSONValuePtr object);
> virJSONValuePtr virJSONValueArrayGet(virJSONValuePtr object, unsigned int element);
>
> -char *virJSONValueGetString(virJSONValuePtr object);
> +const char *virJSONValueGetString(virJSONValuePtr object);
> int virJSONValueGetNumberInt(virJSONValuePtr object, int *value);
> int virJSONValueGetNumberUint(virJSONValuePtr object, unsigned int *value);
> int virJSONValueGetNumberLong(virJSONValuePtr object, long long *value);
> @@ -108,7 +108,7 @@ int virJSONValueGetNumberDouble(virJSONValuePtr object, double *value);
> int virJSONValueGetBoolean(virJSONValuePtr object);
> int virJSONValueIsNull(virJSONValuePtr object);
>
> -char *virJSONValueObjectGetString(virJSONValuePtr object, const char *key);
> +const char *virJSONValueObjectGetString(virJSONValuePtr object, const char *key);
> int virJSONValueObjectGetNumberInt(virJSONValuePtr object, const char *key, int *value);
> int virJSONValueObjectGetNumberUint(virJSONValuePtr object, const char *key, unsigned int *value);
> int virJSONValueObjectGetNumberLong(virJSONValuePtr object, const char *key, long long *value);
ACK,
Daniel
--
Daniel Veillard | libxml Gnome XML XSLT toolkit http://xmlsoft.org/
daniel at veillard.com | Rpmfind RPM search engine http://rpmfind.net/
http://veillard.com/ | virtualization library http://libvirt.org/
More information about the libvir-list
mailing list