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 | 34 ++++++---------------
2 files changed, 58 insertions(+), 44 deletions(-)
diff --git a/src/qemu/qemu_monitor.c b/src/qemu/qemu_monitor.c
index b4f2641504..1127794206 100644
--- a/src/qemu/qemu_monitor.c
+++ b/src/qemu/qemu_monitor.c
@@ -109,6 +109,9 @@ struct _qemuMonitor {
qemuMonitorReportDomainLogError logFunc;
void *logOpaque;
virFreeCallback logDestroy;
+
+ /* true if qemu no longer wants 'props' sub-object of object-add */
+ bool objectAddNoWrap;
};
/**
@@ -3019,14 +3022,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);
}
@@ -3046,26 +3047,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;
}
@@ -3085,6 +3088,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;
@@ -3112,7 +3116,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 57ee42dd16..a206da1852 100644
--- a/src/util/virqemu.c
+++ b/src/util/virqemu.c
@@ -303,12 +303,13 @@ virQEMUBuildNetdevCommandlineFromJSON(virJSONValuePtr props,
}
-static int
-virQEMUBuildObjectCommandlineFromJSONInternal(virBufferPtr buf,
- const char *type,
- const char *alias,
- virJSONValuePtr props)
+int
+virQEMUBuildObjectCommandlineFromJSON(virBufferPtr buf,
+ virJSONValuePtr objprops)
{
+ const char *type = virJSONValueObjectGetString(objprops, "qom-type");
+ const char *alias = virJSONValueObjectGetString(objprops, "id");
+
if (!type || !alias) {
virReportError(VIR_ERR_INTERNAL_ERROR,
_("missing 'type'(%s) or 'alias'(%s) field of
QOM 'object'"),
@@ -316,31 +317,16 @@ virQEMUBuildObjectCommandlineFromJSONInternal(virBufferPtr buf,
return -1;
}
- virBufferAsprintf(buf, "%s,id=%s", type, alias);
+ virBufferAsprintf(buf, "%s,", type);
- if (props) {
- virBufferAddLit(buf, ",");
- if (virQEMUBuildCommandLineJSON(props, buf, NULL,
- virQEMUBuildCommandLineJSONArrayBitmap) < 0)
- return -1;
- }
+ if (virQEMUBuildCommandLineJSON(objprops, buf, "qom-type",
+ virQEMUBuildCommandLineJSONArrayBitmap) < 0)
+ return -1;
return 0;
}
-int
-virQEMUBuildObjectCommandlineFromJSON(virBufferPtr buf,
- virJSONValuePtr objprops)
-{
- const char *type = virJSONValueObjectGetString(objprops, "qom-type");
- const char *alias = virJSONValueObjectGetString(objprops, "id");
- virJSONValuePtr props = virJSONValueObjectGetObject(objprops, "props");
-
- return virQEMUBuildObjectCommandlineFromJSONInternal(buf, type, alias, props);
-}
-
-
char *
virQEMUBuildDriveCommandlineFromJSON(virJSONValuePtr srcdef)
{
--
2.29.2