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

2013-04-01 Thread Corey Bryant



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 */



--
libvir-list mailing list
libvir-list@redhat.com
https://www.redhat.com/mailman/listinfo/libvir-list


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

2013-04-01 Thread Stefan Berger

On 04/01/2013 03:45 PM, Corey Bryant wrote:

+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?



It doesn't seem to be the case for the 'return' object. No other code 
frees it, either.


   Stefan

--
libvir-list mailing list
libvir-list@redhat.com
https://www.redhat.com/mailman/listinfo/libvir-list


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

2013-04-01 Thread Eric Blake
On 04/01/2013 01:52 PM, Stefan Berger wrote:
 On 04/01/2013 03:45 PM, Corey Bryant wrote:
 +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;
 +}
 +

 +cleanup:
 +if (ret  0)
 +virStringFreeList(list);
 +virJSONValueFree(cmd);
 +virJSONValueFree(reply);
 +

 Does data need to be freed?

 
 It doesn't seem to be the case for the 'return' object. No other code
 frees it, either.

data is a pointer to contents already within reply; freeing reply is
recursive, and explicitly freeing data in addition to reply would be a
double-free bug.  This aspect of the code is correct as written.

-- 
Eric Blake   eblake redhat com+1-919-301-3266
Libvirt virtualization library http://libvirt.org



signature.asc
Description: OpenPGP digital signature
--
libvir-list mailing list
libvir-list@redhat.com
https://www.redhat.com/mailman/listinfo/libvir-list

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

2013-03-21 Thread Stefan Berger
Probe for QEMU's QMP TPM support by querying the lists of
supported TPM models (query-tpm-models) and backend types
(query-tpm-types). 

The setting of the capability flags following the strings
returned from the commands above is only provided in the
patch where domain_conf.c gets TPM support due to dependencies
on functions only introduced there. 

Signed-off-by: Stefan Berger stef...@linux.vnet.ibm.com

---
 src/qemu/qemu_capabilities.c |3 +
 src/qemu/qemu_capabilities.h |3 +
 src/qemu/qemu_monitor.c  |   44 +
 src/qemu/qemu_monitor.h  |6 ++
 src/qemu/qemu_monitor_json.c |   90 +++
 src/qemu/qemu_monitor_json.h |8 +++
 6 files changed, 154 insertions(+)

Index: libvirt/src/qemu/qemu_capabilities.c
===
--- libvirt.orig/src/qemu/qemu_capabilities.c
+++ libvirt/src/qemu/qemu_capabilities.c
@@ -212,6 +212,9 @@ VIR_ENUM_IMPL(virQEMUCaps, QEMU_CAPS_LAS
   rng-egd,
   virtio-ccw,
   dtb,
+  tpm-passthrough,
+
+  tpm-tis, /* 135 */
 );
 
 struct _virQEMUCaps {
Index: libvirt/src/qemu/qemu_capabilities.h
===
--- libvirt.orig/src/qemu/qemu_capabilities.h
+++ libvirt/src/qemu/qemu_capabilities.h
@@ -173,6 +173,8 @@ enum virQEMUCapsFlags {
 QEMU_CAPS_OBJECT_RNG_EGD = 131, /* EGD protocol daemon for rng */
 QEMU_CAPS_VIRTIO_CCW = 132, /* -device virtio-*-ccw */
 QEMU_CAPS_DTB= 133, /* -dtb file */
+QEMU_CAPS_DEVICE_TPM_PASSTHROUGH = 134, /* -tpmdev passthrough */
+QEMU_CAPS_DEVICE_TPM_TIS = 135, /* -device tpm_tis */
 
 QEMU_CAPS_LAST,   /* this must always be the last item */
 };
@@ -254,4 +256,5 @@ int virQEMUCapsParseDeviceStr(virQEMUCap
 VIR_ENUM_DECL(virQEMUCaps);
 
 bool virQEMUCapsUsedQMP(virQEMUCapsPtr qemuCaps);
+
 #endif /* __QEMU_CAPABILITIES_H__*/
Index: libvirt/src/qemu/qemu_monitor.c
===
--- libvirt.orig/src/qemu/qemu_monitor.c
+++ libvirt/src/qemu/qemu_monitor.c
@@ -3522,3 +3522,47 @@ int qemuMonitorNBDServerStop(qemuMonitor
 
 return qemuMonitorJSONNBDServerStop(mon);
 }
+
+
+int qemuMonitorGetTPMModels(qemuMonitorPtr mon,
+char ***tpmmodels)
+{
+VIR_DEBUG(mon=%p tpmmodels=%p,
+  mon, tpmmodels);
+
+if (!mon) {
+virReportError(VIR_ERR_INVALID_ARG, %s,
+   _(monitor must not be NULL));
+return -1;
+}
+
+if (!mon-json) {
+virReportError(VIR_ERR_OPERATION_UNSUPPORTED, %s,
+   _(JSON monitor is required));
+return -1;
+}
+
+return qemuMonitorJSONGetTPMModels(mon, tpmmodels);
+}
+
+
+int qemuMonitorGetTPMTypes(qemuMonitorPtr mon,
+   char ***tpmtypes)
+{
+VIR_DEBUG(mon=%p tpmtypes=%p,
+  mon, tpmtypes);
+
+if (!mon) {
+virReportError(VIR_ERR_INVALID_ARG, %s,
+   _(monitor must not be NULL));
+return -1;
+}
+
+if (!mon-json) {
+virReportError(VIR_ERR_OPERATION_UNSUPPORTED, %s,
+   _(JSON monitor is required));
+return -1;
+}
+
+return qemuMonitorJSONGetTPMTypes(mon, tpmtypes);
+}
Index: libvirt/src/qemu/qemu_monitor.h
===
--- libvirt.orig/src/qemu/qemu_monitor.h
+++ libvirt/src/qemu/qemu_monitor.h
@@ -683,6 +683,12 @@ int qemuMonitorNBDServerAdd(qemuMonitorP
 const char *deviceID,
 bool writable);
 int qemuMonitorNBDServerStop(qemuMonitorPtr);
+int qemuMonitorGetTPMModels(qemuMonitorPtr mon,
+char ***tpmmodels);
+
+int qemuMonitorGetTPMTypes(qemuMonitorPtr mon,
+   char ***tpmtypes);
+
 /**
  * When running two dd process and using  redirection, we need a
  * shell that will not truncate files.  These two strings serve that
Index: libvirt/src/qemu/qemu_monitor_json.c
===
--- libvirt.orig/src/qemu/qemu_monitor_json.c
+++ libvirt/src/qemu/qemu_monitor_json.c
@@ -41,6 +41,7 @@
 #include datatypes.h
 #include virerror.h
 #include virjson.h
+#include virstring.h
 
 #ifdef WITH_DTRACE_PROBES
 # include libvirt_qemu_probes.h
@@ -4693,3 +4694,92 @@ qemuMonitorJSONNBDServerStop(qemuMonitor
 virJSONValueFree(reply);
 return ret;
 }
+
+
+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)))
+