[libvirt] [PATCH v2 01/10] Add qemuMonitorJSONGetObjectListPaths() method for QMP qom-list command

John Ferlan jferlan at redhat.com
Thu Jul 11 15:24:39 UTC 2013


On 07/11/2013 10:06 AM, Michal Privoznik wrote:
> On 08.07.2013 21:20, John Ferlan wrote:
<...snip...>
>> diff --git a/src/qemu/qemu_monitor_json.c b/src/qemu/qemu_monitor_json.c
>> index 3383c88..fc2b65f 100644
>> --- a/src/qemu/qemu_monitor_json.c
>> +++ b/src/qemu/qemu_monitor_json.c
>> @@ -4540,6 +4540,108 @@ cleanup:
>>  }
>>  
>>  
>> +int qemuMonitorJSONGetObjectListPaths(qemuMonitorPtr mon,
>> +                                      const char *path,
>> +                                      qemuMonitorJSONListPathPtr **paths)
>> +{
>> +    int ret;
>> +    virJSONValuePtr cmd;
>> +    virJSONValuePtr reply = NULL;
>> +    virJSONValuePtr data;
>> +    qemuMonitorJSONListPathPtr *pathlist = NULL;
>> +    int n = 0;
>> +    size_t i;
>> +
>> +    *paths = NULL;
>> +
>> +    if (!(cmd = qemuMonitorJSONMakeCommand("qom-list",
>> +                                           "s:path", path,
>> +                                           NULL)))
>> +        return -1;
>> +
>> +    ret = qemuMonitorJSONCommand(mon, cmd, &reply);
>> +
>> +    if (ret == 0)
>> +        ret = qemuMonitorJSONCheckError(cmd, reply);
>> +
>> +    if (ret < 0)
>> +        goto cleanup;
>> +
>> +    ret = -1;
>> +
>> +    if (!(data = virJSONValueObjectGet(reply, "return"))) {
>> +        virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
>> +                       _("qom-list reply was missing return data"));
>> +        goto cleanup;
>> +    }
>> +
>> +    if ((n = virJSONValueArraySize(data)) < 0) {
>> +        virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
>> +                       _("qom-list reply data was not an array"));
>> +        goto cleanup;
>> +    }
>> +
>> +    /* null-terminated list */
> 
> Do we need NULL terminated list ... [1]
> 

This same comment and sequence exists in many other places - this was a
lot of cut-n-paste


>> +    if (VIR_ALLOC_N(pathlist, n + 1) < 0) {
>> +        virReportOOMError();
> 
> This can be dropped now. But as you've said in one of previous e-mails
> of your, you already did that.
> 

Right - it was dropped as were the {}

>> +        goto cleanup;
>> +    }
>> +
>> +    for (i = 0; i < n; i++) {
>> +        virJSONValuePtr child = virJSONValueArrayGet(data, i);
>> +        const char *tmp;
>> +        qemuMonitorJSONListPathPtr info;
>> +
>> +        if (VIR_ALLOC(info) < 0) {
>> +            virReportOOMError();
>> +            goto cleanup;
>> +        }
>> +
>> +        pathlist[i] = info;
>> +
>> +        if (!(tmp = virJSONValueObjectGetString(child, "name"))) {
>> +            virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
>> +                           _("qom-list reply data was missing 'name'"));
>> +            goto cleanup;
>> +        }
>> +
>> +        if (VIR_STRDUP(info->name, tmp) < 0)
>> +            goto cleanup;
>> +
>> +        if (virJSONValueObjectHasKey(child, "type")) {
>> +            if (!(tmp = virJSONValueObjectGetString(child, "type"))) {
>> +                virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
>> +                               _("qom-list reply has malformed 'type' data"));
>> +                goto cleanup;
>> +            }
>> +            if (VIR_STRDUP(info->type, tmp) < 0)
>> +                goto cleanup;
>> +        }
>> +    }
>> +
>> +    ret = n;
> 
> 1: ... if we are returning number of items in array? I'm not saying it's
> something wrong, just curious.
> 

Yes, we are returning the number of items in the array the callers then
use that to walk through the results.

>> +    *paths = pathlist;
>> +
>> +cleanup:
>> +    if (ret < 0 && pathlist) {
>> +        for (i = 0; i < n; i++)
>> +            qemuMonitorJSONListPathFree(pathlist[i]);
>> +        VIR_FREE(pathlist);
>> +    }
>> +    virJSONValueFree(cmd);
>> +    virJSONValueFree(reply);
>> +    return ret;
>> +}
<...snip...>

John




More information about the libvir-list mailing list