]> git.ipfire.org Git - thirdparty/libvirt.git/commitdiff
qemu: qapi: Allow selecting specifically optional schema entries in virQEMUQAPISchema...
authorPeter Krempa <pkrempa@redhat.com>
Wed, 15 Aug 2018 06:51:01 +0000 (08:51 +0200)
committerPeter Krempa <pkrempa@redhat.com>
Fri, 24 Aug 2018 13:58:33 +0000 (15:58 +0200)
Add a new modifier character '*' which will select given schema entry
only when it is optional (denoted by the presence of the 'default' key).

Signed-off-by: Peter Krempa <pkrempa@redhat.com>
Reviewed-by: John Ferlan <jferlan@redhat.com>
src/qemu/qemu_qapi.c

index 1492c0c7578962f280d725e93f1f3d674a952fa0..427809e9e32835d54ff66488334c1989089c2c91 100644 (file)
@@ -107,6 +107,7 @@ virQEMUQAPISchemaTraverse(const char *baseName,
                           virHashTablePtr schema)
 {
     virJSONValuePtr base;
+    virJSONValuePtr obj;
     const char *metatype;
     const char *querystr;
     char modifier;
@@ -134,14 +135,20 @@ virQEMUQAPISchemaTraverse(const char *baseName,
             if (!c_isalpha(modifier))
                 querystr++;
 
-            if (modifier == '+')
+            if (modifier == '+') {
                 baseName = virQEMUQAPISchemaObjectGetType("variants",
                                                           querystr,
                                                           "case", base);
-            else
-                baseName = virQEMUQAPISchemaObjectGetType("members",
-                                                          querystr,
-                                                          "name", base);
+            } else {
+                obj = virQEMUQAPISchemaObjectGet("members", querystr,
+                                                 "name", base);
+
+                if (modifier == '*' &&
+                    !virJSONValueObjectHasKey(obj, "default"))
+                    return NULL;
+
+                baseName = virQEMUQAPISchemaTypeFromObject(obj);
+            }
 
             if (!baseName)
                 return NULL;
@@ -177,6 +184,8 @@ virQEMUQAPISchemaTraverse(const char *baseName,
  * attribute: selects whether arguments or return type should be introspected
  *            ("arg-type" or "ret-type" for commands, "arg-type" for events)
  * subattribute: specifies member name of object types
+ * *subattribute: same as above but must be optional (has a property named
+ *                'default' field in the schema)
  * +variant_discriminator: In the case of unionized objects, select a
  *                         specific case to introspect.
  *