]> git.ipfire.org Git - thirdparty/libvirt.git/commitdiff
qemuMonitorGetDeviceProps: Return data in a hash table
authorPeter Krempa <pkrempa@redhat.com>
Wed, 6 May 2020 17:53:43 +0000 (19:53 +0200)
committerPeter Krempa <pkrempa@redhat.com>
Tue, 12 May 2020 04:55:00 +0000 (06:55 +0200)
Create a hash table of device property names which also stores the
corresponding JSON object so that the detection code can look at the
recently added 'default-value' field and possibly others.

Signed-off-by: Peter Krempa <pkrempa@redhat.com>
Reviewed-by: Michal Privoznik <mprivozn@redhat.com>
src/qemu/qemu_capabilities.c
src/qemu/qemu_monitor.c
src/qemu/qemu_monitor.h
src/qemu/qemu_monitor_json.c
src/qemu/qemu_monitor_json.h

index 42425fabbd37b18d2ec7d889a0419e79ea6f4212..ae1f0853f1e6eb9dcf44888d1104aee029581d82 100644 (file)
@@ -2580,20 +2580,24 @@ virQEMUCapsProbeQMPDeviceProperties(virQEMUCapsPtr qemuCaps,
 
     for (i = 0; i < G_N_ELEMENTS(virQEMUCapsDeviceProps); i++) {
         virQEMUCapsObjectTypeProps *device = virQEMUCapsDeviceProps + i;
-        VIR_AUTOSTRINGLIST values = NULL;
-        int nvalues;
+        g_autoptr(virHashTable) qemuprops = NULL;
+        size_t j;
 
         if (device->capsCondition >= 0 &&
             !virQEMUCapsGet(qemuCaps, device->capsCondition))
             continue;
 
-        if ((nvalues = qemuMonitorGetDeviceProps(mon, device->type, &values)) < 0)
+        if (!(qemuprops = qemuMonitorGetDeviceProps(mon, device->type)))
             return -1;
 
-        virQEMUCapsProcessStringFlags(qemuCaps,
-                                      device->nprops,
-                                      device->props,
-                                      nvalues, values);
+        for (j = 0; j < device->nprops; j++) {
+            virJSONValuePtr entry = virHashLookup(qemuprops, device->props[j].value);
+
+            if (!entry)
+                continue;
+
+            virQEMUCapsSet(qemuCaps, device->props[j].flag);
+        }
     }
 
     return 0;
index 339facfad32c05260d4f53354c8ed239ce246351..9c853ccb93b902031b5f62aa9bf5b82d79f1169c 100644 (file)
@@ -3764,16 +3764,15 @@ qemuMonitorGetObjectTypes(qemuMonitorPtr mon,
 }
 
 
-int
+virHashTablePtr
 qemuMonitorGetDeviceProps(qemuMonitorPtr mon,
-                          const char *device,
-                          char ***props)
+                          const char *device)
 {
-    VIR_DEBUG("device=%s props=%p", device, props);
+    VIR_DEBUG("device=%s", device);
 
-    QEMU_CHECK_MONITOR(mon);
+    QEMU_CHECK_MONITOR_NULL(mon);
 
-    return qemuMonitorJSONGetDeviceProps(mon, device, props);
+    return qemuMonitorJSONGetDeviceProps(mon, device);
 }
 
 
index 68e21dcaee28fb27765025b60ee7935a7f821653..2e35d94bdac2cc973a3456c7508e0981ae9d17e5 100644 (file)
@@ -1203,9 +1203,8 @@ int qemuMonitorGetKVMState(qemuMonitorPtr mon,
 
 int qemuMonitorGetObjectTypes(qemuMonitorPtr mon,
                               char ***types);
-int qemuMonitorGetDeviceProps(qemuMonitorPtr mon,
-                              const char *device,
-                              char ***props);
+virHashTablePtr qemuMonitorGetDeviceProps(qemuMonitorPtr mon,
+                                          const char *device);
 int qemuMonitorGetObjectProps(qemuMonitorPtr mon,
                               const char *object,
                               char ***props);
index 9d1db07ccd5a30cc06de59e3a3a5293e3ce31818..505b31a78aca89cb69ea470360300e528f5f0941 100644 (file)
@@ -6745,28 +6745,56 @@ qemuMonitorJSONParsePropsList(virJSONValuePtr cmd,
 }
 
 
-int
+static int
+qemuMonitorJSONGetDevicePropsWorker(size_t pos G_GNUC_UNUSED,
+                                    virJSONValuePtr item,
+                                    void *opaque)
+{
+    const char *name = virJSONValueObjectGetString(item, "name");
+    virHashTablePtr devices = opaque;
+
+    if (!name) {
+        virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
+                       _("reply data was missing 'name'"));
+        return -1;
+    }
+
+    if (virHashAddEntry(devices, name, item) < 0)
+        return -1;
+
+    return 0;
+}
+
+
+virHashTablePtr
 qemuMonitorJSONGetDeviceProps(qemuMonitorPtr mon,
-                              const char *device,
-                              char ***props)
+                              const char *device)
 {
+    g_autoptr(virHashTable) props = virHashNew(virJSONValueHashFree);
     g_autoptr(virJSONValue) cmd = NULL;
     g_autoptr(virJSONValue) reply = NULL;
 
-    *props = NULL;
-
     if (!(cmd = qemuMonitorJSONMakeCommand("device-list-properties",
                                            "s:typename", device,
                                            NULL)))
-        return -1;
+        return NULL;
 
     if (qemuMonitorJSONCommand(mon, cmd, &reply) < 0)
-        return -1;
+        return NULL;
 
+    /* return empty hash */
     if (qemuMonitorJSONHasError(reply, "DeviceNotFound"))
-        return 0;
+        return g_steal_pointer(&props);
+
+    if (qemuMonitorJSONCheckReply(cmd, reply, VIR_JSON_TYPE_ARRAY) < 0)
+        return NULL;
+
+    if (virJSONValueArrayForeachSteal(virJSONValueObjectGetArray(reply, "return"),
+                                      qemuMonitorJSONGetDevicePropsWorker,
+                                      props) < 0)
+        return NULL;
 
-    return qemuMonitorJSONParsePropsList(cmd, reply, NULL, props);
+    return g_steal_pointer(&props);
 }
 
 
index 05a46b4fe21421792f6230e18762ae9f8ccd444b..d3d46ec2f72f696a873ec6a89452fd85baa95b0b 100644 (file)
@@ -487,10 +487,9 @@ int qemuMonitorJSONSetObjectProperty(qemuMonitorPtr mon,
                                      qemuMonitorJSONObjectPropertyPtr prop)
     ATTRIBUTE_NONNULL(2) ATTRIBUTE_NONNULL(3) ATTRIBUTE_NONNULL(4);
 
-int qemuMonitorJSONGetDeviceProps(qemuMonitorPtr mon,
-                                  const char *device,
-                                  char ***props)
-    ATTRIBUTE_NONNULL(2) ATTRIBUTE_NONNULL(3);
+virHashTablePtr qemuMonitorJSONGetDeviceProps(qemuMonitorPtr mon,
+                                              const char *device)
+    ATTRIBUTE_NONNULL(2);
 int qemuMonitorJSONGetObjectProps(qemuMonitorPtr mon,
                                   const char *object,
                                   char ***props)