]> git.ipfire.org Git - thirdparty/libvirt.git/commitdiff
qemu: qapi: Return schema entry via argument in virQEMUQAPISchemaTraverse
authorPeter Krempa <pkrempa@redhat.com>
Tue, 9 Apr 2019 11:25:49 +0000 (13:25 +0200)
committerPeter Krempa <pkrempa@redhat.com>
Mon, 6 May 2019 07:46:06 +0000 (09:46 +0200)
To allow for boolean query string, let's return the queried schema entry
via argument rather than a return value.

Signed-off-by: Peter Krempa <pkrempa@redhat.com>
Reviewed-by: Ján Tomko <jtomko@redhat.com>
src/qemu/qemu_qapi.c

index de663d4408c5f68d2ba3187f62d59a81b3741120..7155f2d084d54dc1bdcb6837e11e874b57ac8ddb 100644 (file)
@@ -101,10 +101,11 @@ virQEMUQAPISchemaObjectGetType(const char *field,
 }
 
 
-static virJSONValuePtr
+static int
 virQEMUQAPISchemaTraverse(const char *baseName,
                           char **query,
-                          virHashTablePtr schema)
+                          virHashTablePtr schema,
+                          virJSONValuePtr *type)
 {
     virJSONValuePtr base;
     virJSONValuePtr obj;
@@ -114,18 +115,20 @@ virQEMUQAPISchemaTraverse(const char *baseName,
 
     while (1) {
         if (!(base = virHashLookup(schema, baseName)))
-            return NULL;
+            return 0;
 
-        if (!*query)
-            return base;
+        if (!*query) {
+            *type = base;
+            return 0;
+        }
 
         if (!(metatype = virJSONValueObjectGetString(base, "meta-type")))
-            return NULL;
+            return 0;
 
         /* flatten arrays by default */
         if (STREQ(metatype, "array")) {
             if (!(baseName = virJSONValueObjectGetString(base, "element-type")))
-                return NULL;
+                return 0;
 
             continue;
         } else if (STREQ(metatype, "object")) {
@@ -145,26 +148,26 @@ virQEMUQAPISchemaTraverse(const char *baseName,
 
                 if (modifier == '*' &&
                     !virJSONValueObjectHasKey(obj, "default"))
-                    return NULL;
+                    return 0;
 
                 baseName = virQEMUQAPISchemaTypeFromObject(obj);
             }
 
             if (!baseName)
-                return NULL;
+                return 0;
         } else if (STREQ(metatype, "command") ||
                    STREQ(metatype, "event")) {
             if (!(baseName = virJSONValueObjectGetString(base, *query)))
-                return NULL;
+                return 0;
         } else {
             /* alternates, basic types and enums can't be entered */
-            return NULL;
+            return 0;
         }
 
         query++;
     }
 
-    return NULL;
+    return 0;
 }
 
 
@@ -219,7 +222,8 @@ virQEMUQAPISchemaPathGet(const char *query,
         return -1;
     }
 
-    *entry = virQEMUQAPISchemaTraverse(*elems, elems + 1, schema);
+    if (virQEMUQAPISchemaTraverse(elems[0], elems + 1, schema, entry) < 0)
+        return -1;
 
     return 0;
 }