This provides an interface to create a chardev from a QAPI representation of the command line.
At this point, the only difference between it and QMP chardev-add is that it allows 'backend' to be flattened and returns a Chardev pointer. We'll add support for mux=on and more compatibility glue to support legacy command line syntax later. Signed-off-by: Kevin Wolf <kw...@redhat.com> --- qapi/char.json | 15 +++++++++++++++ include/chardev/char.h | 9 +++++++++ chardev/char.c | 24 ++++++++++++++++++------ 3 files changed, 42 insertions(+), 6 deletions(-) diff --git a/qapi/char.json b/qapi/char.json index 43486d1daa..14ee06a52d 100644 --- a/qapi/char.json +++ b/qapi/char.json @@ -435,6 +435,21 @@ { 'struct' : 'ChardevReturn', 'data': { '*pty': 'str' } } +## +# @ChardevOptions: +# +# Command line options for creating a character device backend +# +# @id: the chardev's ID, must be unique +# @backend: backend type and parameters +# +# Since: 6.0 +## +{ 'struct': 'ChardevOptions', + 'data': { 'id': 'str', + 'backend': 'ChardevBackend' }, + 'aliases': [ { 'source': ['backend'] } ] } + ## # @chardev-add: # diff --git a/include/chardev/char.h b/include/chardev/char.h index 3b91645081..54fa2ed8e2 100644 --- a/include/chardev/char.h +++ b/include/chardev/char.h @@ -85,6 +85,15 @@ Chardev *qemu_chr_new_from_opts(QemuOpts *opts, GMainContext *context, Error **errp); +/** + * qemu_chr_new_cli: + * @options: Character device creation options as defined in QAPI + * + * Returns: on success: a new character backend + * otherwise: NULL; @errp specifies the error + */ +Chardev *qemu_chr_new_cli(ChardevOptions *options, Error **errp); + /** * qemu_chr_parse_common: * @opts: the options that still need parsing diff --git a/chardev/char.c b/chardev/char.c index de39e2d79b..9f00e475d4 100644 --- a/chardev/char.c +++ b/chardev/char.c @@ -1037,20 +1037,27 @@ Chardev *qemu_chardev_new(const char *id, const char *typename, return chardev_new(id, typename, backend, gcontext, errp); } -ChardevReturn *qmp_chardev_add(const char *id, ChardevBackend *backend, - Error **errp) +static Chardev *chardev_new_qapi(const char *id, ChardevBackend *backend, + Error **errp) { const ChardevClass *cc; - ChardevReturn *ret; - Chardev *chr; cc = char_get_class(ChardevBackendKind_str(backend->type), errp); if (!cc) { return NULL; } - chr = chardev_new(id, object_class_get_name(OBJECT_CLASS(cc)), - backend, NULL, errp); + return chardev_new(id, object_class_get_name(OBJECT_CLASS(cc)), + backend, NULL, errp); +} + +ChardevReturn *qmp_chardev_add(const char *id, ChardevBackend *backend, + Error **errp) +{ + ChardevReturn *ret; + Chardev *chr; + + chr = chardev_new_qapi(id, backend, errp); if (!chr) { return NULL; } @@ -1064,6 +1071,11 @@ ChardevReturn *qmp_chardev_add(const char *id, ChardevBackend *backend, return ret; } +Chardev *qemu_chr_new_cli(ChardevOptions *options, Error **errp) +{ + return chardev_new_qapi(options->id, options->backend, errp); +} + ChardevReturn *qmp_chardev_change(const char *id, ChardevBackend *backend, Error **errp) { -- 2.28.0