qemu-config: Make config_parse_qdict() return bool
This simplifies error checking. Cc: Hanna Reitz <hreitz@redhat.com> Signed-off-by: Markus Armbruster <armbru@redhat.com> Message-Id: <20221121085054.683122-7-armbru@redhat.com>
This commit is contained in:
parent
50707b391e
commit
f766e6dc6a
|
@ -297,9 +297,7 @@ static int read_config(BDRVBlkdebugState *s, const char *filename,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
qemu_config_parse_qdict(options, config_groups, &local_err);
|
if (!qemu_config_parse_qdict(options, config_groups, errp)) {
|
||||||
if (local_err) {
|
|
||||||
error_propagate(errp, local_err);
|
|
||||||
ret = -EINVAL;
|
ret = -EINVAL;
|
||||||
goto fail;
|
goto fail;
|
||||||
}
|
}
|
||||||
|
|
|
@ -22,7 +22,7 @@ int qemu_read_config_file(const char *filename, QEMUConfigCB *f, Error **errp);
|
||||||
|
|
||||||
/* Parse QDict options as a replacement for a config file (allowing multiple
|
/* Parse QDict options as a replacement for a config file (allowing multiple
|
||||||
enumerated (0..(n-1)) configuration "sections") */
|
enumerated (0..(n-1)) configuration "sections") */
|
||||||
void qemu_config_parse_qdict(QDict *options, QemuOptsList **lists,
|
bool qemu_config_parse_qdict(QDict *options, QemuOptsList **lists,
|
||||||
Error **errp);
|
Error **errp);
|
||||||
|
|
||||||
#endif /* QEMU_CONFIG_FILE_H */
|
#endif /* QEMU_CONFIG_FILE_H */
|
||||||
|
|
|
@ -423,12 +423,12 @@ int qemu_read_config_file(const char *filename, QEMUConfigCB *cb, Error **errp)
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void config_parse_qdict_section(QDict *options, QemuOptsList *opts,
|
static bool config_parse_qdict_section(QDict *options, QemuOptsList *opts,
|
||||||
Error **errp)
|
Error **errp)
|
||||||
{
|
{
|
||||||
QemuOpts *subopts;
|
QemuOpts *subopts;
|
||||||
QDict *subqdict;
|
g_autoptr(QDict) subqdict = NULL;
|
||||||
QList *list = NULL;
|
g_autoptr(QList) list = NULL;
|
||||||
size_t orig_size, enum_size;
|
size_t orig_size, enum_size;
|
||||||
char *prefix;
|
char *prefix;
|
||||||
|
|
||||||
|
@ -437,23 +437,23 @@ static void config_parse_qdict_section(QDict *options, QemuOptsList *opts,
|
||||||
g_free(prefix);
|
g_free(prefix);
|
||||||
orig_size = qdict_size(subqdict);
|
orig_size = qdict_size(subqdict);
|
||||||
if (!orig_size) {
|
if (!orig_size) {
|
||||||
goto out;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
subopts = qemu_opts_create(opts, NULL, 0, errp);
|
subopts = qemu_opts_create(opts, NULL, 0, errp);
|
||||||
if (!subopts) {
|
if (!subopts) {
|
||||||
goto out;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!qemu_opts_absorb_qdict(subopts, subqdict, errp)) {
|
if (!qemu_opts_absorb_qdict(subopts, subqdict, errp)) {
|
||||||
goto out;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
enum_size = qdict_size(subqdict);
|
enum_size = qdict_size(subqdict);
|
||||||
if (enum_size < orig_size && enum_size) {
|
if (enum_size < orig_size && enum_size) {
|
||||||
error_setg(errp, "Unknown option '%s' for [%s]",
|
error_setg(errp, "Unknown option '%s' for [%s]",
|
||||||
qdict_first(subqdict)->key, opts->name);
|
qdict_first(subqdict)->key, opts->name);
|
||||||
goto out;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (enum_size) {
|
if (enum_size) {
|
||||||
|
@ -468,7 +468,7 @@ static void config_parse_qdict_section(QDict *options, QemuOptsList *opts,
|
||||||
if (qdict_size(subqdict)) {
|
if (qdict_size(subqdict)) {
|
||||||
error_setg(errp, "Unused option '%s' for [%s]",
|
error_setg(errp, "Unused option '%s' for [%s]",
|
||||||
qdict_first(subqdict)->key, opts->name);
|
qdict_first(subqdict)->key, opts->name);
|
||||||
goto out;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
QLIST_FOREACH_ENTRY(list, list_entry) {
|
QLIST_FOREACH_ENTRY(list, list_entry) {
|
||||||
|
@ -478,46 +478,43 @@ static void config_parse_qdict_section(QDict *options, QemuOptsList *opts,
|
||||||
if (!section) {
|
if (!section) {
|
||||||
error_setg(errp, "[%s] section (index %u) does not consist of "
|
error_setg(errp, "[%s] section (index %u) does not consist of "
|
||||||
"keys", opts->name, i);
|
"keys", opts->name, i);
|
||||||
goto out;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
opt_name = g_strdup_printf("%s.%u", opts->name, i++);
|
opt_name = g_strdup_printf("%s.%u", opts->name, i++);
|
||||||
subopts = qemu_opts_create(opts, opt_name, 1, errp);
|
subopts = qemu_opts_create(opts, opt_name, 1, errp);
|
||||||
g_free(opt_name);
|
g_free(opt_name);
|
||||||
if (!subopts) {
|
if (!subopts) {
|
||||||
goto out;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!qemu_opts_absorb_qdict(subopts, section, errp)) {
|
if (!qemu_opts_absorb_qdict(subopts, section, errp)) {
|
||||||
qemu_opts_del(subopts);
|
qemu_opts_del(subopts);
|
||||||
goto out;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (qdict_size(section)) {
|
if (qdict_size(section)) {
|
||||||
error_setg(errp, "[%s] section doesn't support the option '%s'",
|
error_setg(errp, "[%s] section doesn't support the option '%s'",
|
||||||
opts->name, qdict_first(section)->key);
|
opts->name, qdict_first(section)->key);
|
||||||
qemu_opts_del(subopts);
|
qemu_opts_del(subopts);
|
||||||
goto out;
|
return false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
out:
|
return true;
|
||||||
qobject_unref(subqdict);
|
|
||||||
qobject_unref(list);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void qemu_config_parse_qdict(QDict *options, QemuOptsList **lists,
|
bool qemu_config_parse_qdict(QDict *options, QemuOptsList **lists,
|
||||||
Error **errp)
|
Error **errp)
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
Error *local_err = NULL;
|
|
||||||
|
|
||||||
for (i = 0; lists[i]; i++) {
|
for (i = 0; lists[i]; i++) {
|
||||||
config_parse_qdict_section(options, lists[i], &local_err);
|
if (!config_parse_qdict_section(options, lists[i], errp)) {
|
||||||
if (local_err) {
|
return false;
|
||||||
error_propagate(errp, local_err);
|
|
||||||
return;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue