From: Jiri Denemark <jdenemar@redhat.com>
qemuMonitorJSONParsePropsList supported filtering based on type. Let's
replace it with a callback supplied by the caller to allow for more
advanced filtering.
Signed-off-by: Jiri Denemark <jdenemar@redhat.com>
---
src/qemu/qemu_monitor_json.c | 51 +++++++++++++++++++++++++++++-------
1 file changed, 41 insertions(+), 10 deletions(-)
diff --git a/src/qemu/qemu_monitor_json.c b/src/qemu/qemu_monitor_json.c
index 6402d18d37..0c78115e9d 100644
--- a/src/qemu/qemu_monitor_json.c
+++ b/src/qemu/qemu_monitor_json.c
@@ -5837,10 +5837,21 @@ int qemuMonitorJSONSetObjectProperty(qemuMonitor *mon,
#undef MAKE_SET_CMD
+/* A filter callback for qemuMonitorJSONParsePropsList.
+ *
+ * Returns 0 if the property should be included in the list,
+ * 1 if the property should be ignored,
+ * -1 on error.
+ */
+typedef int (*qemuMonitorJSONPropsListFilter)(const char *name,
+ virJSONValue *propData,
+ void *data);
+
static int
qemuMonitorJSONParsePropsList(virJSONValue *cmd,
virJSONValue *reply,
- const char *type,
+ qemuMonitorJSONPropsListFilter propFilter,
+ void *filterData,
char ***props)
{
virJSONValue *data;
@@ -5859,19 +5870,25 @@ qemuMonitorJSONParsePropsList(virJSONValue *cmd,
for (i = 0; i < n; i++) {
virJSONValue *child = virJSONValueArrayGet(data, i);
- const char *tmp;
+ const char *name = virJSONValueObjectGetString(child, "name");
- if (type &&
- STRNEQ_NULLABLE(virJSONValueObjectGetString(child, "type"), type))
- continue;
-
- if (!(tmp = virJSONValueObjectGetString(child, "name"))) {
+ if (!name) {
virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
_("reply data was missing 'name'"));
return -1;
}
- proplist[count++] = g_strdup(tmp);
+ if (propFilter) {
+ int rc = propFilter(name, child, filterData);
+
+ if (rc < 0)
+ return -1;
+
+ if (rc != 0)
+ continue;
+ }
+
+ proplist[count++] = g_strdup(name);
}
*props = g_steal_pointer(&proplist);
@@ -5954,7 +5971,7 @@ qemuMonitorJSONGetObjectProps(qemuMonitor *mon,
if (qemuMonitorJSONHasError(reply, "DeviceNotFound"))
return 0;
- return qemuMonitorJSONParsePropsList(cmd, reply, NULL, props);
+ return qemuMonitorJSONParsePropsList(cmd, reply, NULL, NULL, props);
}
@@ -6578,6 +6595,18 @@ qemuMonitorJSONGetDeviceAliases(qemuMonitor *mon,
}
+static int
+qemuMonitorJSONCPUPropsFilter(const char *name G_GNUC_UNUSED,
+ virJSONValue *propData,
+ void *data G_GNUC_UNUSED)
+{
+ if (STRNEQ_NULLABLE(virJSONValueObjectGetString(propData, "type"), "bool"))
+ return 1;
+
+ return 0;
+}
+
+
static int
qemuMonitorJSONGetCPUProperties(qemuMonitor *mon,
const char *cpuQOMPath,
@@ -6599,7 +6628,9 @@ qemuMonitorJSONGetCPUProperties(qemuMonitor *mon,
if (qemuMonitorJSONHasError(reply, "DeviceNotFound"))
return 0;
- return qemuMonitorJSONParsePropsList(cmd, reply, "bool", props);
+ return qemuMonitorJSONParsePropsList(cmd, reply,
+ qemuMonitorJSONCPUPropsFilter, NULL,
+ props);
}
--
2.51.0