summaryrefslogtreecommitdiff
path: root/qapi
diff options
context:
space:
mode:
authorMarkus Armbruster <armbru@redhat.com>2017-02-28 22:27:08 +0100
committerMarkus Armbruster <armbru@redhat.com>2017-03-07 16:07:47 +0100
commit31478f26ab4ed82d35b763bbf259810d0c8b44e1 (patch)
treed645d24279265bb083447941218b16e234348908 /qapi
parent42e5f39378c6e7a0ada563779bbb6f470f7c03ff (diff)
downloadqemu-31478f26ab4ed82d35b763bbf259810d0c8b44e1.tar.gz
qapi: Improve how keyval input visitor reports unexpected dicts
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 <armbru@redhat.com> Reviewed-by: Kevin Wolf <kwolf@redhat.com> Message-Id: <1488317230-26248-23-git-send-email-armbru@redhat.com>
Diffstat (limited to 'qapi')
-rw-r--r--qapi/qobject-input-visitor.c26
1 files changed, 22 insertions, 4 deletions
diff --git a/qapi/qobject-input-visitor.c b/qapi/qobject-input-visitor.c
index 1a484d54be..b9acd86f4f 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;