Construct the JSON object which is used for object-add without the
'props' wrapper and add the wrapper only in the monitor code.
This simplifies the JSON->commandline generator in the first place and
also prepares for upcoming qemu where 'props' will be removed.
Signed-off-by: Peter Krempa <pkrempa(a)redhat.com>
---
src/qemu/qemu_monitor.c | 68 +++++++++++++++++++++++++++++------------
src/util/virqemu.c | 42 +++++++++----------------
2 files changed, 62 insertions(+), 48 deletions(-)
diff --git a/src/qemu/qemu_monitor.c b/src/qemu/qemu_monitor.c
index b26fba303d..5da3213976 100644
--- a/src/qemu/qemu_monitor.c
+++ b/src/qemu/qemu_monitor.c
@@ -112,6 +112,9 @@ struct _qemuMonitor {
qemuMonitorReportDomainLogError logFunc;
void *logOpaque;
virFreeCallback logDestroy;
+
+ /* true if qemu no longer wants 'props' sub-object of object-add */
+ bool objectAddNoWrap;
};
/**
@@ -3010,14 +3013,12 @@ qemuMonitorCreateObjectPropsWrap(const char *type,
const char *alias,
virJSONValuePtr *props)
{
- virJSONValuePtr ret;
- ignore_value(virJSONValueObjectCreate(&ret,
- "s:qom-type", type,
- "s:id", alias,
- "A:props", props,
- NULL));
- return ret;
+ if (virJSONValueObjectPrependString(*props, "id", alias) < 0 ||
+ virJSONValueObjectPrependString(*props, "qom-type", type))
+ return NULL;
+
+ return g_steal_pointer(props);
}
@@ -3037,26 +3038,28 @@ qemuMonitorCreateObjectProps(virJSONValuePtr *propsret,
const char *alias,
...)
{
- virJSONValuePtr props = NULL;
- int ret = -1;
+ g_autoptr(virJSONValue) props = NULL;
+ int rc;
va_list args;
- *propsret = NULL;
+ if (virJSONValueObjectCreate(&props,
+ "s:qom-type", type,
+ "s:id", alias,
+ NULL) < 0)
+ return -1;
+
va_start(args, alias);
- if (virJSONValueObjectCreateVArgs(&props, args) < 0)
- goto cleanup;
+ rc = virJSONValueObjectAddVArgs(props, args);
- if (!(*propsret = qemuMonitorCreateObjectPropsWrap(type, alias, &props)))
- goto cleanup;
+ va_end(args);
- ret = 0;
+ if (rc < 0)
+ return -1;
- cleanup:
- virJSONValueFree(props);
- va_end(args);
- return ret;
+ *propsret = g_steal_pointer(&props);
+ return 0;
}
@@ -3076,6 +3079,7 @@ qemuMonitorAddObject(qemuMonitorPtr mon,
virJSONValuePtr *props,
char **alias)
{
+ g_autoptr(virJSONValue) pr = NULL;
const char *type = NULL;
const char *id = NULL;
g_autofree char *aliasCopy = NULL;
@@ -3103,7 +3107,31 @@ qemuMonitorAddObject(qemuMonitorPtr mon,
if (alias)
aliasCopy = g_strdup(id);
- if (qemuMonitorJSONAddObject(mon, props) < 0)
+ if (mon->objectAddNoWrap) {
+ pr = g_steal_pointer(props);
+ } else {
+ /* we need to create a wrapper which has the 'qom-type' and 'id'
and
+ * store everything else under a 'props' sub-object */
+ g_autoptr(virJSONValue) typeobj = NULL;
+ g_autoptr(virJSONValue) idobj = NULL;
+
+ ignore_value(virJSONValueObjectRemoveKey(*props, "qom-type",
&typeobj));
+ ignore_value(virJSONValueObjectRemoveKey(*props, "id", &idobj));
+
+ if (!virJSONValueObjectGetKey(*props, 0)) {
+ virJSONValueFree(*props);
+ *props = NULL;
+ }
+
+ if (virJSONValueObjectCreate(&pr,
+ "s:qom-type", type,
+ "s:id", id,
+ "A:props", props,
+ NULL) < 0)
+ return -1;
+ }
+
+ if (qemuMonitorJSONAddObject(mon, &pr) < 0)
return -1;
if (alias)
diff --git a/src/util/virqemu.c b/src/util/virqemu.c
index fd8661951a..8a705b79a0 100644
--- a/src/util/virqemu.c
+++ b/src/util/virqemu.c
@@ -320,32 +320,6 @@ virQEMUBuildNetdevCommandlineFromJSON(virJSONValuePtr props,
}
-static int
-virQEMUBuildObjectCommandlineFromJSONInternal(virBufferPtr buf,
- const char *type,
- const char *alias,
- virJSONValuePtr props)
-{
- if (!type || !alias) {
- virReportError(VIR_ERR_INTERNAL_ERROR,
- _("missing 'type'(%s) or 'alias'(%s) field of
QOM 'object'"),
- NULLSTR(type), NULLSTR(alias));
- return -1;
- }
-
- virBufferAsprintf(buf, "%s,id=%s", type, alias);
-
- if (props) {
- virBufferAddLit(buf, ",");
- if (virQEMUBuildCommandLineJSON(props, buf, NULL, false,
- virQEMUBuildCommandLineJSONArrayBitmap) < 0)
- return -1;
- }
-
- return 0;
-}
-
-
/**
* virQEMUBuildObjectCommandlineFromJSON:
* @buf: buffer to format output to
@@ -363,12 +337,24 @@ virQEMUBuildObjectCommandlineFromJSON(virBufferPtr buf,
{
const char *type = virJSONValueObjectGetString(objprops, "qom-type");
const char *alias = virJSONValueObjectGetString(objprops, "id");
- virJSONValuePtr props = virJSONValueObjectGetObject(objprops, "props");
+
+ if (!type || !alias) {
+ virReportError(VIR_ERR_INTERNAL_ERROR,
+ _("missing 'type'(%s) or 'alias'(%s) field of
QOM 'object'"),
+ NULLSTR(type), NULLSTR(alias));
+ return -1;
+ }
if (rawjson)
return virJSONValueToBuffer(objprops, buf, false);
- return virQEMUBuildObjectCommandlineFromJSONInternal(buf, type, alias, props);
+ virBufferAsprintf(buf, "%s,", type);
+
+ if (virQEMUBuildCommandLineJSON(objprops, buf, "qom-type", false,
+ virQEMUBuildCommandLineJSONArrayBitmap) < 0)
+ return -1;
+
+ return 0;
}
--
2.28.0