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@xxxxxxxxxx> --- 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