mirror of https://gitlab.com/qemu-project/qemu
block: Move json: parsing to bdrv_fill_options()
Signed-off-by: Kevin Wolf <kwolf@redhat.com> Reviewed-by: Eric Blake <eblake@redhat.com>
This commit is contained in:
parent
462f5bcf69
commit
5e5c4f63f4
88
block.c
88
block.c
|
@ -1005,19 +1005,62 @@ free_and_fail:
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static QDict *parse_json_filename(const char *filename, Error **errp)
|
||||||
|
{
|
||||||
|
QObject *options_obj;
|
||||||
|
QDict *options;
|
||||||
|
int ret;
|
||||||
|
|
||||||
|
ret = strstart(filename, "json:", &filename);
|
||||||
|
assert(ret);
|
||||||
|
|
||||||
|
options_obj = qobject_from_json(filename);
|
||||||
|
if (!options_obj) {
|
||||||
|
error_setg(errp, "Could not parse the JSON options");
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (qobject_type(options_obj) != QTYPE_QDICT) {
|
||||||
|
qobject_decref(options_obj);
|
||||||
|
error_setg(errp, "Invalid JSON object given");
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
options = qobject_to_qdict(options_obj);
|
||||||
|
qdict_flatten(options);
|
||||||
|
|
||||||
|
return options;
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Fills in default options for opening images and converts the legacy
|
* Fills in default options for opening images and converts the legacy
|
||||||
* filename/flags pair to option QDict entries.
|
* filename/flags pair to option QDict entries.
|
||||||
*/
|
*/
|
||||||
static int bdrv_fill_options(QDict **options, const char *filename, int flags,
|
static int bdrv_fill_options(QDict **options, const char **pfilename, int flags,
|
||||||
Error **errp)
|
Error **errp)
|
||||||
{
|
{
|
||||||
|
const char *filename = *pfilename;
|
||||||
const char *drvname;
|
const char *drvname;
|
||||||
bool protocol = flags & BDRV_O_PROTOCOL;
|
bool protocol = flags & BDRV_O_PROTOCOL;
|
||||||
bool parse_filename = false;
|
bool parse_filename = false;
|
||||||
Error *local_err = NULL;
|
Error *local_err = NULL;
|
||||||
BlockDriver *drv;
|
BlockDriver *drv;
|
||||||
|
|
||||||
|
/* Parse json: pseudo-protocol */
|
||||||
|
if (filename && g_str_has_prefix(filename, "json:")) {
|
||||||
|
QDict *json_options = parse_json_filename(filename, &local_err);
|
||||||
|
if (local_err) {
|
||||||
|
error_propagate(errp, local_err);
|
||||||
|
return -EINVAL;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Options given in the filename have lower priority than options
|
||||||
|
* specified directly */
|
||||||
|
qdict_join(*options, json_options, false);
|
||||||
|
QDECREF(json_options);
|
||||||
|
*pfilename = filename = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
if (!protocol) {
|
if (!protocol) {
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
@ -1332,33 +1375,6 @@ out:
|
||||||
g_free(tmp_filename);
|
g_free(tmp_filename);
|
||||||
}
|
}
|
||||||
|
|
||||||
static QDict *parse_json_filename(const char *filename, Error **errp)
|
|
||||||
{
|
|
||||||
QObject *options_obj;
|
|
||||||
QDict *options;
|
|
||||||
int ret;
|
|
||||||
|
|
||||||
ret = strstart(filename, "json:", &filename);
|
|
||||||
assert(ret);
|
|
||||||
|
|
||||||
options_obj = qobject_from_json(filename);
|
|
||||||
if (!options_obj) {
|
|
||||||
error_setg(errp, "Could not parse the JSON options");
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (qobject_type(options_obj) != QTYPE_QDICT) {
|
|
||||||
qobject_decref(options_obj);
|
|
||||||
error_setg(errp, "Invalid JSON object given");
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
options = qobject_to_qdict(options_obj);
|
|
||||||
qdict_flatten(options);
|
|
||||||
|
|
||||||
return options;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Opens a disk image (raw, qcow2, vmdk, ...)
|
* Opens a disk image (raw, qcow2, vmdk, ...)
|
||||||
*
|
*
|
||||||
|
@ -1422,21 +1438,7 @@ int bdrv_open(BlockDriverState **pbs, const char *filename,
|
||||||
options = qdict_new();
|
options = qdict_new();
|
||||||
}
|
}
|
||||||
|
|
||||||
if (filename && g_str_has_prefix(filename, "json:")) {
|
ret = bdrv_fill_options(&options, &filename, flags, &local_err);
|
||||||
QDict *json_options = parse_json_filename(filename, &local_err);
|
|
||||||
if (local_err) {
|
|
||||||
ret = -EINVAL;
|
|
||||||
goto fail;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Options given in the filename have lower priority than options
|
|
||||||
* specified directly */
|
|
||||||
qdict_join(options, json_options, false);
|
|
||||||
QDECREF(json_options);
|
|
||||||
filename = NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
ret = bdrv_fill_options(&options, filename, flags, &local_err);
|
|
||||||
if (local_err) {
|
if (local_err) {
|
||||||
goto fail;
|
goto fail;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue