[PATCH v2 07/12] qemu: monitor: Make wrapping of 'props' of 'object-add' optional

Peter Krempa pkrempa at redhat.com
Wed Feb 24 15:58:01 UTC 2021


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 at 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 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




More information about the libvir-list mailing list