From c59734e3f6c4373684ff8da71f5a46f96a02b55e Mon Sep 17 00:00:00 2001 From: Peter Krempa Date: Wed, 15 Aug 2018 08:39:19 +0200 Subject: [PATCH] qemu: qapi: Split up virQEMUQAPISchemaObjectGetType Split it into a function that returns the whole schema entry so that we can do additional checks and a helper getting the type string from the schema entry. Signed-off-by: Peter Krempa Reviewed-by: John Ferlan --- src/qemu/qemu_qapi.c | 69 ++++++++++++++++++++++++++++++++------------ 1 file changed, 50 insertions(+), 19 deletions(-) diff --git a/src/qemu/qemu_qapi.c b/src/qemu/qemu_qapi.c index fea6683336..1492c0c757 100644 --- a/src/qemu/qemu_qapi.c +++ b/src/qemu/qemu_qapi.c @@ -32,11 +32,59 @@ VIR_LOG_INIT("qemu.qemu_qapi"); +/** + * virQEMUQAPISchemaObjectGet: + * @field: name of the object containing the requested type + * @name: name of the requested type + * @namefield: name of the object property holding @name + * @elem: QAPI schema entry JSON object + * + * Helper that selects the type of a QMP schema object member or it's variant + * member. Returns the QMP entry on success or NULL on error. + */ +static virJSONValuePtr +virQEMUQAPISchemaObjectGet(const char *field, + const char *name, + const char *namefield, + virJSONValuePtr elem) +{ + virJSONValuePtr arr; + virJSONValuePtr cur; + const char *curname; + size_t i; + + if (!(arr = virJSONValueObjectGetArray(elem, field))) + return NULL; + + for (i = 0; i < virJSONValueArraySize(arr); i++) { + if (!(cur = virJSONValueArrayGet(arr, i)) || + !(curname = virJSONValueObjectGetString(cur, namefield))) + continue; + + if (STREQ(name, curname)) + return cur; + } + + return NULL; +} + + +static const char * +virQEMUQAPISchemaTypeFromObject(virJSONValuePtr obj) +{ + if (!obj) + return NULL; + + return virJSONValueObjectGetString(obj, "type"); +} + + /** * virQEMUQAPISchemaObjectGetType: * @field: name of the object containing the requested type * @name: name of the requested type * @namefield: name of the object property holding @name + * @elem: QAPI schema entry JSON object * * Helper that selects the type of a QMP schema object member or it's variant * member. Returns the type string on success or NULL on error. @@ -47,26 +95,9 @@ virQEMUQAPISchemaObjectGetType(const char *field, const char *namefield, virJSONValuePtr elem) { - virJSONValuePtr arr; - virJSONValuePtr cur; - const char *curname; - const char *type; - size_t i; + virJSONValuePtr obj = virQEMUQAPISchemaObjectGet(field, name, namefield, elem); - if (!(arr = virJSONValueObjectGetArray(elem, field))) - return NULL; - - for (i = 0; i < virJSONValueArraySize(arr); i++) { - if (!(cur = virJSONValueArrayGet(arr, i)) || - !(curname = virJSONValueObjectGetString(cur, namefield)) || - !(type = virJSONValueObjectGetString(cur, "type"))) - continue; - - if (STREQ(name, curname)) - return type; - } - - return NULL; + return virQEMUQAPISchemaTypeFromObject(obj); }