This is just a quick hack to test things Signed-off-by: Kevin Wolf <kw...@redhat.com> --- blockdev.c | 32 ++++++++++++++++++++++++++++++++ qapi-schema.json | 29 +++++++++++++++++++++++++++++ qmp-commands.hx | 6 ++++++ 3 files changed, 67 insertions(+)
diff --git a/blockdev.c b/blockdev.c index e71c4ee..e3a4fb8 100644 --- a/blockdev.c +++ b/blockdev.c @@ -1741,6 +1741,38 @@ void qmp_block_job_complete(const char *device, Error **errp) block_job_complete(job, errp); } +#include "qapi-visit.h" +#include "qapi/qmp-output-visitor.h" + +void qmp_blockdev_add(BlockOptions *options, Error **errp) +{ + QString *str; + QmpOutputVisitor *ov = qmp_output_visitor_new(); + QObject *obj; + visit_type_BlockOptions(qmp_output_get_visitor(ov), + &options, NULL, errp); + obj = qmp_output_get_qobject(ov); + str = qobject_to_json_pretty(obj); + assert(str != NULL); + fprintf(stderr, "\n>>>>>>%s\n<<<<<<\n", qstring_get_str(str)); + qdict_flatten(obj); + str = qobject_to_json_pretty(obj); + fprintf(stderr, "\n----->%s\n<-----\n", qstring_get_str(str)); + + Error *local_err = NULL; + QemuOpts *opts = qemu_opts_from_qdict(&qemu_drive_opts, qobject_to_qdict(obj), &local_err); + if (error_is_set(&local_err)) { + qerror_report_err(local_err); + error_free(local_err); + } else { + drive_init(opts, IF_NONE); + } + + qobject_decref(obj); + qmp_output_visitor_cleanup(ov); + QDECREF(str); +} + static void do_qmp_query_block_jobs_one(void *opaque, BlockDriverState *bs) { BlockJobInfoList **prev = opaque; diff --git a/qapi-schema.json b/qapi-schema.json index a90aeb1..9f1cc8d 100644 --- a/qapi-schema.json +++ b/qapi-schema.json @@ -3702,3 +3702,32 @@ '*cpuid-input-ecx': 'int', 'cpuid-register': 'X86CPURegister32', 'features': 'int' } } + + +{ 'type': 'BlockOptionsBase', + 'data': { 'driver': 'str', '*read-only': 'bool' } } + +{ 'type': 'BlockOptionsFile', + 'data': { 'filename': 'str' } } + +{ 'type': 'BlockOptionsRaw', + 'data': { 'file': 'BlockRef' } } + +{ 'type': 'BlockOptionsQcow2', + 'data': { '*lazy-refcounts': 'bool', 'file': 'BlockRef' } } + +{ 'union': 'BlockOptions', + 'base': 'BlockOptionsBase', + 'discriminator': 'driver', + 'data': { + 'file': 'BlockOptionsFile' + 'raw': 'BlockOptionsRaw' + 'qcow2': 'BlockOptionsQcow2' + } } + +{ 'union': 'BlockRef', + 'discriminator': {}, + 'data': { 'definition': 'BlockOptions' + 'reference': 'str' } } + +{ 'command': 'blockdev-add', 'data': { 'options': 'BlockOptions' } } diff --git a/qmp-commands.hx b/qmp-commands.hx index 362f0e1..fe32ae7 100644 --- a/qmp-commands.hx +++ b/qmp-commands.hx @@ -3043,3 +3043,9 @@ Example: <- { "return": {} } EQMP + + { + .name = "blockdev-add", + .args_type = "options:q", + .mhandler.cmd_new = qmp_marshal_input_blockdev_add, + }, -- 1.8.1.4