qapi: Make visitor functions taking Error ** return bool, not void

See recent commit "error: Document Error API usage rules" for
rationale.

Signed-off-by: Markus Armbruster <armbru@redhat.com>
Reviewed-by: Eric Blake <eblake@redhat.com>
Reviewed-by: Vladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com>
Message-Id: <20200707160613.848843-18-armbru@redhat.com>
This commit is contained in:
Markus Armbruster 2020-07-07 18:05:45 +02:00
parent 3c4b89c3b2
commit 012d4c96e2
14 changed files with 456 additions and 361 deletions

View file

@ -133,7 +133,7 @@ opts_visitor_insert(GHashTable *unprocessed_opts, const QemuOpt *opt)
}
static void
static bool
opts_start_struct(Visitor *v, const char *name, void **obj,
size_t size, Error **errp)
{
@ -144,7 +144,7 @@ opts_start_struct(Visitor *v, const char *name, void **obj,
*obj = g_malloc0(size);
}
if (ov->depth++ > 0) {
return;
return true;
}
ov->unprocessed_opts = g_hash_table_new_full(&g_str_hash, &g_str_equal,
@ -163,10 +163,11 @@ opts_start_struct(Visitor *v, const char *name, void **obj,
ov->fake_id_opt->str = g_strdup(ov->opts_root->id);
opts_visitor_insert(ov->unprocessed_opts, ov->fake_id_opt);
}
return true;
}
static void
static bool
opts_check_struct(Visitor *v, Error **errp)
{
OptsVisitor *ov = to_ov(v);
@ -174,7 +175,7 @@ opts_check_struct(Visitor *v, Error **errp)
GQueue *any;
if (ov->depth > 1) {
return;
return true;
}
/* we should have processed all (distinct) QemuOpt instances */
@ -184,7 +185,9 @@ opts_check_struct(Visitor *v, Error **errp)
first = g_queue_peek_head(any);
error_setg(errp, QERR_INVALID_PARAMETER, first->name);
return false;
}
return true;
}
@ -221,7 +224,7 @@ lookup_distinct(const OptsVisitor *ov, const char *name, Error **errp)
}
static void
static bool
opts_start_list(Visitor *v, const char *name, GenericList **list, size_t size,
Error **errp)
{
@ -232,12 +235,13 @@ opts_start_list(Visitor *v, const char *name, GenericList **list, size_t size,
/* we don't support visits without a list */
assert(list);
ov->repeated_opts = lookup_distinct(ov, name, errp);
if (ov->repeated_opts) {
ov->list_mode = LM_IN_PROGRESS;
*list = g_malloc0(size);
} else {
if (!ov->repeated_opts) {
*list = NULL;
return false;
}
ov->list_mode = LM_IN_PROGRESS;
*list = g_malloc0(size);
return true;
}
@ -285,13 +289,14 @@ opts_next_list(Visitor *v, GenericList *tail, size_t size)
}
static void
static bool
opts_check_list(Visitor *v, Error **errp)
{
/*
* Unvisited list elements will be reported later when checking
* whether unvisited struct members remain.
*/
return true;
}
@ -341,7 +346,7 @@ processed(OptsVisitor *ov, const char *name)
}
static void
static bool
opts_type_str(Visitor *v, const char *name, char **obj, Error **errp)
{
OptsVisitor *ov = to_ov(v);
@ -350,7 +355,7 @@ opts_type_str(Visitor *v, const char *name, char **obj, Error **errp)
opt = lookup_scalar(ov, name, errp);
if (!opt) {
*obj = NULL;
return;
return false;
}
*obj = g_strdup(opt->str ? opt->str : "");
/* Note that we consume a string even if this is called as part of
@ -359,11 +364,12 @@ opts_type_str(Visitor *v, const char *name, char **obj, Error **errp)
* consumed only matters to visit_end_struct() as the final error
* check if there were no other failures during the visit. */
processed(ov, name);
return true;
}
/* mimics qemu-option.c::parse_option_bool() */
static void
static bool
opts_type_bool(Visitor *v, const char *name, bool *obj, Error **errp)
{
OptsVisitor *ov = to_ov(v);
@ -371,7 +377,7 @@ opts_type_bool(Visitor *v, const char *name, bool *obj, Error **errp)
opt = lookup_scalar(ov, name, errp);
if (!opt) {
return;
return false;
}
if (opt->str) {
@ -386,17 +392,18 @@ opts_type_bool(Visitor *v, const char *name, bool *obj, Error **errp)
} else {
error_setg(errp, QERR_INVALID_PARAMETER_VALUE, opt->name,
"on|yes|y|off|no|n");
return;
return false;
}
} else {
*obj = true;
}
processed(ov, name);
return true;
}
static void
static bool
opts_type_int64(Visitor *v, const char *name, int64_t *obj, Error **errp)
{
OptsVisitor *ov = to_ov(v);
@ -407,12 +414,12 @@ opts_type_int64(Visitor *v, const char *name, int64_t *obj, Error **errp)
if (ov->list_mode == LM_SIGNED_INTERVAL) {
*obj = ov->range_next.s;
return;
return true;
}
opt = lookup_scalar(ov, name, errp);
if (!opt) {
return;
return false;
}
str = opt->str ? opt->str : "";
@ -425,7 +432,7 @@ opts_type_int64(Visitor *v, const char *name, int64_t *obj, Error **errp)
if (*endptr == '\0') {
*obj = val;
processed(ov, name);
return;
return true;
}
if (*endptr == '-' && ov->list_mode == LM_IN_PROGRESS) {
long long val2;
@ -442,17 +449,18 @@ opts_type_int64(Visitor *v, const char *name, int64_t *obj, Error **errp)
/* as if entering on the top */
*obj = ov->range_next.s;
return;
return true;
}
}
}
error_setg(errp, QERR_INVALID_PARAMETER_VALUE, opt->name,
(ov->list_mode == LM_NONE) ? "an int64 value" :
"an int64 value or range");
return false;
}
static void
static bool
opts_type_uint64(Visitor *v, const char *name, uint64_t *obj, Error **errp)
{
OptsVisitor *ov = to_ov(v);
@ -463,12 +471,12 @@ opts_type_uint64(Visitor *v, const char *name, uint64_t *obj, Error **errp)
if (ov->list_mode == LM_UNSIGNED_INTERVAL) {
*obj = ov->range_next.u;
return;
return true;
}
opt = lookup_scalar(ov, name, errp);
if (!opt) {
return;
return false;
}
str = opt->str;
@ -479,7 +487,7 @@ opts_type_uint64(Visitor *v, const char *name, uint64_t *obj, Error **errp)
if (*endptr == '\0') {
*obj = val;
processed(ov, name);
return;
return true;
}
if (*endptr == '-' && ov->list_mode == LM_IN_PROGRESS) {
unsigned long long val2;
@ -494,17 +502,18 @@ opts_type_uint64(Visitor *v, const char *name, uint64_t *obj, Error **errp)
/* as if entering on the top */
*obj = ov->range_next.u;
return;
return true;
}
}
}
error_setg(errp, QERR_INVALID_PARAMETER_VALUE, opt->name,
(ov->list_mode == LM_NONE) ? "a uint64 value" :
"a uint64 value or range");
return false;
}
static void
static bool
opts_type_size(Visitor *v, const char *name, uint64_t *obj, Error **errp)
{
OptsVisitor *ov = to_ov(v);
@ -513,17 +522,18 @@ opts_type_size(Visitor *v, const char *name, uint64_t *obj, Error **errp)
opt = lookup_scalar(ov, name, errp);
if (!opt) {
return;
return false;
}
err = qemu_strtosz(opt->str ? opt->str : "", NULL, obj);
if (err < 0) {
error_setg(errp, QERR_INVALID_PARAMETER_VALUE, opt->name,
"a size value");
return;
return false;
}
processed(ov, name);
return true;
}