[libvirt] [PATCH 05/21] qemu: qapi: Return schema entry via argument in virQEMUQAPISchemaTraverse

Peter Krempa pkrempa at redhat.com
Mon Apr 15 16:01:58 UTC 2019


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 at redhat.com>
---
 src/qemu/qemu_qapi.c | 30 +++++++++++++++++-------------
 1 file changed, 17 insertions(+), 13 deletions(-)

diff --git a/src/qemu/qemu_qapi.c b/src/qemu/qemu_qapi.c
index de663d4408..7155f2d084 100644
--- a/src/qemu/qemu_qapi.c
+++ b/src/qemu/qemu_qapi.c
@@ -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;
 }
-- 
2.20.1




More information about the libvir-list mailing list