[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] [PULL v3 22/24] qapi: Improve how keyval input visitor repo
From: |
Markus Armbruster |
Subject: |
[Qemu-devel] [PULL v3 22/24] qapi: Improve how keyval input visitor reports unexpected dicts |
Date: |
Tue, 7 Mar 2017 08:20:35 +0100 |
Incorrect option
-blockdev node-name=foo,driver=file,filename=foo.img,aio.unmap=on
is rejected with "Invalid parameter type for 'aio', expected: string".
To make sense of this, you almost have to translate it into the
equivalent QMP command
{ "execute": "blockdev-add", "arguments": { "node-name": "foo", "driver":
"file", "filename": "foo.img", "aio": { "unmap": true } } }
Improve the error message to "Parameters 'aio.*' are unexpected".
Take care not to confuse the case "unexpected nested parameters"
(i.e. the object is a QDict or QList) with the case "non-string scalar
parameter". The latter is a misuse of the visitor, and should perhaps
be an assertion. Note that test-qobject-input-visitor exercises this
misuse in test_visitor_in_int_keyval(), test_visitor_in_bool_keyval()
and test_visitor_in_number_keyval().
Signed-off-by: Markus Armbruster <address@hidden>
Reviewed-by: Kevin Wolf <address@hidden>
Message-Id: <address@hidden>
---
qapi/qobject-input-visitor.c | 26 ++++++++++++++++++++++----
1 file changed, 22 insertions(+), 4 deletions(-)
diff --git a/qapi/qobject-input-visitor.c b/qapi/qobject-input-visitor.c
index 1a484d5..b9acd86 100644
--- a/qapi/qobject-input-visitor.c
+++ b/qapi/qobject-input-visitor.c
@@ -167,9 +167,18 @@ static const char
*qobject_input_get_keyval(QObjectInputVisitor *qiv,
qstr = qobject_to_qstring(qobj);
if (!qstr) {
- error_setg(errp, QERR_INVALID_PARAMETER_TYPE,
- full_name(qiv, name), "string");
- return NULL;
+ switch (qobject_type(qobj)) {
+ case QTYPE_QDICT:
+ case QTYPE_QLIST:
+ error_setg(errp, "Parameters '%s.*' are unexpected",
+ full_name(qiv, name));
+ return NULL;
+ default:
+ /* Non-string scalar (should this be an assertion?) */
+ error_setg(errp, "Internal error: parameter %s invalid",
+ full_name(qiv, name));
+ return NULL;
+ }
}
return qstring_get_str(qstr);
@@ -479,6 +488,15 @@ static void qobject_input_type_str(Visitor *v, const char
*name, char **obj,
*obj = g_strdup(qstring_get_str(qstr));
}
+static void qobject_input_type_str_keyval(Visitor *v, const char *name,
+ char **obj, Error **errp)
+{
+ QObjectInputVisitor *qiv = to_qiv(v);
+ const char *str = qobject_input_get_keyval(qiv, name, errp);
+
+ *obj = g_strdup(str);
+}
+
static void qobject_input_type_number(Visitor *v, const char *name, double
*obj,
Error **errp)
{
@@ -650,7 +668,7 @@ Visitor *qobject_input_visitor_new_keyval(QObject *obj)
v->visitor.type_int64 = qobject_input_type_int64_keyval;
v->visitor.type_uint64 = qobject_input_type_uint64_keyval;
v->visitor.type_bool = qobject_input_type_bool_keyval;
- v->visitor.type_str = qobject_input_type_str;
+ v->visitor.type_str = qobject_input_type_str_keyval;
v->visitor.type_number = qobject_input_type_number_keyval;
v->visitor.type_any = qobject_input_type_any;
v->visitor.type_null = qobject_input_type_null;
--
2.7.4
- [Qemu-devel] [PULL v3 00/24] block: Command line option -blockdev, Markus Armbruster, 2017/03/07
- [Qemu-devel] [PULL v3 01/24] test-qemu-opts: Cover qemu_opts_parse() of "no", Markus Armbruster, 2017/03/07
- [Qemu-devel] [PULL v3 11/24] test-qobject-input-visitor: Abort earlier on bad test input, Markus Armbruster, 2017/03/07
- [Qemu-devel] [PULL v3 09/24] libqtest: Fix qmp() & friends to abort on JSON parse errors, Markus Armbruster, 2017/03/07
- [Qemu-devel] [PULL v3 10/24] qjson: Abort earlier on qobject_from_jsonf() misuse, Markus Armbruster, 2017/03/07
- [Qemu-devel] [PULL v3 07/24] qapi: Factor out common qobject_input_get_keyval(), Markus Armbruster, 2017/03/07
- [Qemu-devel] [PULL v3 06/24] qapi: Factor out common part of qobject input visitor creation, Markus Armbruster, 2017/03/07
- [Qemu-devel] [PULL v3 22/24] qapi: Improve how keyval input visitor reports unexpected dicts,
Markus Armbruster <=
- [Qemu-devel] [PULL v3 18/24] qapi: New parse_qapi_name(), Markus Armbruster, 2017/03/07
- [Qemu-devel] [PULL v3 23/24] docs/qapi-code-gen.txt: Clarify naming rules, Markus Armbruster, 2017/03/07
- [Qemu-devel] [PULL v3 05/24] test-keyval: Cover use with qobject input visitor, Markus Armbruster, 2017/03/07
- [Qemu-devel] [PULL v3 03/24] keyval: New keyval_parse(), Markus Armbruster, 2017/03/07
- [Qemu-devel] [PULL v3 20/24] qapi: New qobject_input_visitor_new_str() for convenience, Markus Armbruster, 2017/03/07
- [Qemu-devel] [PULL v3 15/24] test-visitor-serialization: Pass &error_abort to qobject_from_json(), Markus Armbruster, 2017/03/07
- [Qemu-devel] [PULL v3 04/24] qapi: qobject input visitor variant for use with keyval_parse(), Markus Armbruster, 2017/03/07
- [Qemu-devel] [PULL v3 12/24] qobject: Propagate parse errors through qobject_from_json(), Markus Armbruster, 2017/03/07
- [Qemu-devel] [PULL v3 16/24] monitor: Assert qmp_schema_json[] is sane, Markus Armbruster, 2017/03/07
- [Qemu-devel] [PULL v3 13/24] block: More detailed syntax error reporting for JSON filenames, Markus Armbruster, 2017/03/07