[libvirt] [PATCH v3 01/11] Add QMP probing for TPM

Corey Bryant coreyb at linux.vnet.ibm.com
Mon Apr 1 19:45:53 UTC 2013



On 03/21/2013 11:42 AM, Stefan Berger wrote:
[snip]
> +
> +
> +static int
> +qemuMonitorJSONGetStringArray(qemuMonitorPtr mon, const char *qmpCmd,
> +                              char ***array)
> +{
> +    int ret;
> +    virJSONValuePtr cmd;
> +    virJSONValuePtr reply = NULL;
> +    virJSONValuePtr data;
> +    char **list = NULL;
> +    int n = 0;
> +    size_t i;
> +
> +    *array = NULL;
> +
> +    if (!(cmd = qemuMonitorJSONMakeCommand(qmpCmd, 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 reply was missing return data"),
> +                       qmpCmd);
> +        goto cleanup;
> +    }
> +
> +    if ((n = virJSONValueArraySize(data)) < 0) {
> +        virReportError(VIR_ERR_INTERNAL_ERROR,
> +                       _("%s reply data was not an array"),
> +                       qmpCmd);
> +        goto cleanup;
> +    }
> +
> +    /* null-terminated list */
> +    if (VIR_ALLOC_N(list, n + 1) < 0) {
> +        virReportOOMError();
> +        goto cleanup;
> +    }
> +
> +    for (i = 0 ; i < n ; i++) {
> +        virJSONValuePtr child = virJSONValueArrayGet(data, i);
> +        const char *tmp;
> +
> +        if (!(tmp = virJSONValueGetString(child))) {
> +            virReportError(VIR_ERR_INTERNAL_ERROR,
> +                           _("%s array element does not contain data"),
> +                           qmpCmd);
> +            goto cleanup;
> +        }
> +
> +        if (!(list[i] = strdup(tmp))) {
> +            virReportOOMError();
> +            goto cleanup;
> +        }
> +    }
> +
> +    ret = n;
> +    *array = list;
> +
> +cleanup:
> +    if (ret < 0)
> +        virStringFreeList(list);
> +    virJSONValueFree(cmd);
> +    virJSONValueFree(reply);

Does data need to be freed?

-- 
Regards,
Corey Bryant

> +    return ret;
> +}
> +
> +int qemuMonitorJSONGetTPMModels(qemuMonitorPtr mon,
> +                                char ***tpmmodels)
> +{
> +    return qemuMonitorJSONGetStringArray(mon, "query-tpm-models", tpmmodels);
> +}
> +
> +
> +int qemuMonitorJSONGetTPMTypes(qemuMonitorPtr mon,
> +                               char ***tpmtypes)
> +{
> +    return qemuMonitorJSONGetStringArray(mon, "query-tpm-types", tpmtypes);
> +}
> Index: libvirt/src/qemu/qemu_monitor_json.h
> ===================================================================
> --- libvirt.orig/src/qemu/qemu_monitor_json.h
> +++ libvirt/src/qemu/qemu_monitor_json.h
> @@ -341,4 +341,12 @@ int qemuMonitorJSONNBDServerAdd(qemuMoni
>                                   const char *deviceID,
>                                   bool writable);
>   int qemuMonitorJSONNBDServerStop(qemuMonitorPtr mon);
> +int qemuMonitorJSONGetTPMModels(qemuMonitorPtr mon,
> +                                char ***tpmmodels)
> +    ATTRIBUTE_NONNULL(2);
> +
> +int qemuMonitorJSONGetTPMTypes(qemuMonitorPtr mon,
> +                               char ***tpmtypes)
> +    ATTRIBUTE_NONNULL(2);
> +
>   #endif /* QEMU_MONITOR_JSON_H */
>




More information about the libvir-list mailing list