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 | 42 +++++++++---------------- 2 files changed, 62 insertions(+), 48 deletions(-) diff --git a/src/qemu/qemu_monitor.c b/src/qemu/qemu_monitor.c index ed35da17e1..8b88c8f922 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; }; /** @@ -3012,14 +3015,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); } @@ -3039,26 +3040,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; } @@ -3078,6 +3081,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; @@ -3105,7 +3109,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 c420b144e1..5fe142394c 100644 --- a/src/util/virqemu.c +++ b/src/util/virqemu.c @@ -303,32 +303,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, - virQEMUBuildCommandLineJSONArrayBitmap) < 0) - return -1; - } - - return 0; -} - - /** * virQEMUBuildObjectCommandlineFromJSON: * @buf: buffer to format output to @@ -346,12 +320,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", + virQEMUBuildCommandLineJSONArrayBitmap) < 0) + return -1; + + return 0; } -- 2.29.2