提交 1683535a 编写于 作者: P Peter Krempa

qemu: monitor: Add code to retrieve and store QMP schema data

Call 'query-qmp-schema' and store the returned types in a hash table
keyed by the 'name' field so that the capabilities code can traverse it.
上级 edf33d1a
...@@ -4033,3 +4033,14 @@ qemuMonitorGetRTCTime(qemuMonitorPtr mon, ...@@ -4033,3 +4033,14 @@ qemuMonitorGetRTCTime(qemuMonitorPtr mon,
return qemuMonitorJSONGetRTCTime(mon, tm); return qemuMonitorJSONGetRTCTime(mon, tm);
} }
virHashTablePtr
qemuMonitorQueryQMPSchema(qemuMonitorPtr mon)
{
VIR_DEBUG("mon=%p", mon);
QEMU_CHECK_MONITOR_JSON_NULL(mon);
return qemuMonitorJSONQueryQMPSchema(mon);
}
...@@ -1008,4 +1008,6 @@ int qemuMonitorMigrateStartPostCopy(qemuMonitorPtr mon); ...@@ -1008,4 +1008,6 @@ int qemuMonitorMigrateStartPostCopy(qemuMonitorPtr mon);
int qemuMonitorGetRTCTime(qemuMonitorPtr mon, int qemuMonitorGetRTCTime(qemuMonitorPtr mon,
struct tm *tm); struct tm *tm);
virHashTablePtr qemuMonitorQueryQMPSchema(qemuMonitorPtr mon);
#endif /* QEMU_MONITOR_H */ #endif /* QEMU_MONITOR_H */
...@@ -7278,3 +7278,70 @@ qemuMonitorJSONGetHotpluggableCPUs(qemuMonitorPtr mon, ...@@ -7278,3 +7278,70 @@ qemuMonitorJSONGetHotpluggableCPUs(qemuMonitorPtr mon,
virJSONValueFree(reply); virJSONValueFree(reply);
return ret; return ret;
} }
static int
qemuMonitorJSONFillQMPSchema(size_t pos ATTRIBUTE_UNUSED,
virJSONValuePtr item,
void *opaque)
{
const char *name;
virHashTablePtr schema = opaque;
if (!(name = virJSONValueObjectGetString(item, "name"))) {
virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
_("malformed QMP schema"));
return -1;
}
if (virHashAddEntry(schema, name, item) < 0)
return -1;
return 0;
}
static void
qemuMonitorJSONFreeSchemaEntry(void *opaque,
const void *name ATTRIBUTE_UNUSED)
{
virJSONValueFree(opaque);
}
virHashTablePtr
qemuMonitorJSONQueryQMPSchema(qemuMonitorPtr mon)
{
virJSONValuePtr cmd;
virJSONValuePtr reply = NULL;
virJSONValuePtr arr;
virHashTablePtr schema = NULL;
virHashTablePtr ret = NULL;
if (!(cmd = qemuMonitorJSONMakeCommand("query-qmp-schema", NULL)))
return NULL;
if (qemuMonitorJSONCommand(mon, cmd, &reply) < 0)
goto cleanup;
if (qemuMonitorJSONCheckError(cmd, reply) < 0)
goto cleanup;
arr = virJSONValueObjectGet(reply, "return");
if (!(schema = virHashCreate(512, qemuMonitorJSONFreeSchemaEntry)))
goto cleanup;
if (virJSONValueArrayForeachSteal(arr, qemuMonitorJSONFillQMPSchema,
schema) < 0)
goto cleanup;
VIR_STEAL_PTR(ret, schema);
cleanup:
virJSONValueFree(cmd);
virJSONValueFree(reply);
virHashFree(schema);
return ret;
}
...@@ -500,4 +500,7 @@ int qemuMonitorJSONGetHotpluggableCPUs(qemuMonitorPtr mon, ...@@ -500,4 +500,7 @@ int qemuMonitorJSONGetHotpluggableCPUs(qemuMonitorPtr mon,
struct qemuMonitorQueryHotpluggableCpusEntry **entries, struct qemuMonitorQueryHotpluggableCpusEntry **entries,
size_t *nentries) size_t *nentries)
ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2) ATTRIBUTE_NONNULL(3); ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2) ATTRIBUTE_NONNULL(3);
virHashTablePtr qemuMonitorJSONQueryQMPSchema(qemuMonitorPtr mon)
ATTRIBUTE_NONNULL(1);
#endif /* QEMU_MONITOR_JSON_H */ #endif /* QEMU_MONITOR_JSON_H */
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册