The class kind is only necessary to lookup the chardev name in qmp_chardev_add() after calling qemu_chr_new_from_opts(). However, qemu_chr_new_from_opts() can be changed to use a non-qmp function using the chardev class typename. Introduce qemu_chardev_add() to be called from qemu_chr_new_from_opts() and remove the class chardev kind field.
Signed-off-by: Marc-André Lureau <marcandre.lur...@redhat.com> --- backends/baum.c | 1 - backends/msmouse.c | 1 - backends/testdev.c | 1 - qemu-char.c | 96 ++++++++++++++++++++++----------------------------- spice-qemu-char.c | 2 -- ui/console.c | 1 - ui/gtk.c | 1 - include/sysemu/char.h | 1 - 8 files changed, 42 insertions(+), 62 deletions(-) diff --git a/backends/baum.c b/backends/baum.c index e4c4c53486..64dbeb1a5f 100644 --- a/backends/baum.c +++ b/backends/baum.c @@ -671,7 +671,6 @@ static void char_braille_class_init(ObjectClass *oc, void *data) { ChardevClass *cc = CHARDEV_CLASS(oc); - cc->kind = CHARDEV_BACKEND_KIND_BRAILLE; cc->open = baum_chr_open; cc->chr_write = baum_chr_write; cc->chr_accept_input = baum_chr_accept_input; diff --git a/backends/msmouse.c b/backends/msmouse.c index 28689b3e29..d2c3162f1e 100644 --- a/backends/msmouse.c +++ b/backends/msmouse.c @@ -169,7 +169,6 @@ static void char_msmouse_class_init(ObjectClass *oc, void *data) { ChardevClass *cc = CHARDEV_CLASS(oc); - cc->kind = CHARDEV_BACKEND_KIND_MSMOUSE; cc->open = msmouse_chr_open; cc->chr_write = msmouse_chr_write; cc->chr_accept_input = msmouse_chr_accept_input; diff --git a/backends/testdev.c b/backends/testdev.c index 243454aaa3..7df9248a13 100644 --- a/backends/testdev.c +++ b/backends/testdev.c @@ -111,7 +111,6 @@ static void char_testdev_class_init(ObjectClass *oc, void *data) { ChardevClass *cc = CHARDEV_CLASS(oc); - cc->kind = CHARDEV_BACKEND_KIND_TESTDEV; cc->chr_write = testdev_chr_write; } diff --git a/qemu-char.c b/qemu-char.c index 9a4028059e..4708b85c2e 100644 --- a/qemu-char.c +++ b/qemu-char.c @@ -566,7 +566,6 @@ static void char_null_class_init(ObjectClass *oc, void *data) cc->open = null_chr_open; cc->chr_write = null_chr_write; - cc->kind = CHARDEV_BACKEND_KIND_NULL; } static const TypeInfo char_null_type_info = { @@ -1703,7 +1702,6 @@ static void char_pty_class_init(ObjectClass *oc, void *data) { ChardevClass *cc = CHARDEV_CLASS(oc); - cc->kind = CHARDEV_BACKEND_KIND_PTY; cc->open = char_pty_open; cc->chr_write = char_pty_chr_write; cc->chr_update_read_handler = pty_chr_update_read_handler; @@ -2453,7 +2451,6 @@ static void char_console_class_init(ObjectClass *oc, void *data) { ChardevClass *cc = CHARDEV_CLASS(oc); - cc->kind = CHARDEV_BACKEND_KIND_CONSOLE; cc->open = qemu_chr_open_win_con; } @@ -3832,7 +3829,6 @@ static void char_stdio_class_init(ObjectClass *oc, void *data) { ChardevClass *cc = CHARDEV_CLASS(oc); - cc->kind = CHARDEV_BACKEND_KIND_STDIO; cc->parse = qemu_chr_parse_stdio; cc->open = qemu_chr_open_stdio; #ifdef _WIN32 @@ -3907,7 +3903,6 @@ static void char_pipe_class_init(ObjectClass *oc, void *data) { ChardevClass *cc = CHARDEV_CLASS(oc); - cc->kind = CHARDEV_BACKEND_KIND_PIPE; cc->parse = qemu_chr_parse_pipe; cc->open = qemu_chr_open_pipe; } @@ -3942,7 +3937,6 @@ static void char_ringbuf_class_init(ObjectClass *oc, void *data) { ChardevClass *cc = CHARDEV_CLASS(oc); - cc->kind = CHARDEV_BACKEND_KIND_RINGBUF; cc->parse = qemu_chr_parse_ringbuf; cc->open = qemu_chr_open_ringbuf; cc->chr_write = ringbuf_chr_write; @@ -3957,17 +3951,9 @@ static const TypeInfo char_ringbuf_type_info = { }; /* Bug-compatibility: */ -static void char_memory_class_init(ObjectClass *oc, void *data) -{ - ChardevClass *cc = CHARDEV_CLASS(oc); - - cc->kind = CHARDEV_BACKEND_KIND_MEMORY; -} - static const TypeInfo char_memory_type_info = { .name = TYPE_CHARDEV_MEMORY, .parent = TYPE_CHARDEV_RINGBUF, - .class_init = char_memory_class_init, }; static void qemu_chr_parse_mux(QemuOpts *opts, ChardevBackend *backend, @@ -3989,7 +3975,6 @@ static void char_mux_class_init(ObjectClass *oc, void *data) { ChardevClass *cc = CHARDEV_CLASS(oc); - cc->kind = CHARDEV_BACKEND_KIND_MUX; cc->parse = qemu_chr_parse_mux; cc->open = qemu_chr_open_mux; cc->chr_write = mux_chr_write; @@ -4161,6 +4146,26 @@ static const ChardevClass *char_get_class(const char *driver, Error **errp) return cc; } +static Chardev *qemu_chardev_add(const char *id, const char *typename, + ChardevBackend *backend, Error **errp) +{ + Chardev *chr; + + chr = qemu_chr_find(id); + if (chr) { + error_setg(errp, "Chardev '%s' already exists", id); + return NULL; + } + + chr = qemu_chardev_new(id, typename, backend, errp); + if (!chr) { + return NULL; + } + + QTAILQ_INSERT_TAIL(&chardevs, chr, next); + return chr; +} + static const struct ChardevAlias { const char *typename; const char *alias; @@ -4180,8 +4185,7 @@ Chardev *qemu_chr_new_from_opts(QemuOpts *opts, const ChardevClass *cc; Chardev *chr; int i; - ChardevReturn *ret = NULL; - ChardevBackend *backend; + ChardevBackend *backend = NULL; const char *id = qemu_opts_id(opts); const char *bname = qemu_opt_get(opts, "backend"); char *bid = NULL; @@ -4189,7 +4193,7 @@ Chardev *qemu_chr_new_from_opts(QemuOpts *opts, if (bname == NULL) { error_setg(errp, "chardev: \"%s\" missing backend", qemu_opts_id(opts)); - goto err; + return NULL; } if (is_help_option(bname)) { @@ -4208,7 +4212,7 @@ Chardev *qemu_chr_new_from_opts(QemuOpts *opts, if (id == NULL) { error_setg(errp, "chardev: no id specified"); - goto err; + return NULL; } for (i = 0; i < ARRAY_SIZE(chardev_alias_table); i++) { @@ -4220,22 +4224,22 @@ Chardev *qemu_chr_new_from_opts(QemuOpts *opts, cc = char_get_class(bname, errp); if (cc == NULL) { - goto err; + return NULL; } backend = g_new0(ChardevBackend, 1); + backend->type = CHARDEV_BACKEND_KIND_NULL; if (qemu_opt_get_bool(opts, "mux", 0)) { bid = g_strdup_printf("%s-base", id); } chr = NULL; - backend->type = cc->kind; if (cc->parse) { cc->parse(opts, backend, &local_err); if (local_err) { error_propagate(errp, local_err); - goto qapi_out; + goto out; } } else { ChardevCommon *ccom = g_new0(ChardevCommon, 1); @@ -4243,37 +4247,33 @@ Chardev *qemu_chr_new_from_opts(QemuOpts *opts, backend->u.null.data = ccom; /* Any ChardevCommon member would work */ } - ret = qmp_chardev_add(bid ? bid : id, backend, errp); - if (!ret) { - goto qapi_out; + chr = qemu_chardev_add(bid ? bid : id, + object_class_get_name(OBJECT_CLASS(cc)), + backend, errp); + if (chr == NULL) { + goto out; } if (bid) { + Chardev *mux; qapi_free_ChardevBackend(backend); - qapi_free_ChardevReturn(ret); backend = g_new0(ChardevBackend, 1); - backend->u.mux.data = g_new0(ChardevMux, 1); backend->type = CHARDEV_BACKEND_KIND_MUX; + backend->u.mux.data = g_new0(ChardevMux, 1); backend->u.mux.data->chardev = g_strdup(bid); - ret = qmp_chardev_add(id, backend, errp); - if (!ret) { - chr = qemu_chr_find(bid); + mux = qemu_chardev_add(id, TYPE_CHARDEV_MUX, backend, errp); + if (mux == NULL) { qemu_chr_delete(chr); chr = NULL; - goto qapi_out; + goto out; } + chr = mux; } - chr = qemu_chr_find(id); - -qapi_out: +out: qapi_free_ChardevBackend(backend); - qapi_free_ChardevReturn(ret); g_free(bid); return chr; - -err: - return NULL; } Chardev *qemu_chr_new_noreplay(const char *label, const char *filename) @@ -4678,7 +4678,6 @@ static void char_parallel_class_init(ObjectClass *oc, void *data) { ChardevClass *cc = CHARDEV_CLASS(oc); - cc->kind = CHARDEV_BACKEND_KIND_PARALLEL; cc->parse = qemu_chr_parse_parallel; cc->open = qmp_chardev_open_parallel; #if defined(__linux__) @@ -4721,7 +4720,6 @@ static void char_file_class_init(ObjectClass *oc, void *data) { ChardevClass *cc = CHARDEV_CLASS(oc); - cc->kind = CHARDEV_BACKEND_KIND_FILE; cc->parse = qemu_chr_parse_file_out; cc->open = qmp_chardev_open_file; } @@ -4742,7 +4740,6 @@ static void char_serial_class_init(ObjectClass *oc, void *data) { ChardevClass *cc = CHARDEV_CLASS(oc); - cc->kind = CHARDEV_BACKEND_KIND_SERIAL; cc->parse = qemu_chr_parse_serial; cc->open = qmp_chardev_open_serial; #ifndef _WIN32 @@ -4903,7 +4900,6 @@ static void char_socket_class_init(ObjectClass *oc, void *data) { ChardevClass *cc = CHARDEV_CLASS(oc); - cc->kind = CHARDEV_BACKEND_KIND_SOCKET; cc->parse = qemu_chr_parse_socket; cc->open = qmp_chardev_open_socket; cc->chr_wait_connected = tcp_chr_wait_connected; @@ -4957,7 +4953,6 @@ static void char_udp_class_init(ObjectClass *oc, void *data) { ChardevClass *cc = CHARDEV_CLASS(oc); - cc->kind = CHARDEV_BACKEND_KIND_UDP; cc->parse = qemu_chr_parse_udp; cc->open = qmp_chardev_open_udp; cc->chr_write = udp_chr_write; @@ -5016,24 +5011,18 @@ Chardev *qemu_chardev_new(const char *id, const char *typename, ChardevReturn *qmp_chardev_add(const char *id, ChardevBackend *backend, Error **errp) { - const ChardevClass *cc; ChardevReturn *ret; + const ChardevClass *cc; Chardev *chr; - chr = qemu_chr_find(id); - if (chr) { - error_setg(errp, "Chardev '%s' already exists", id); - return NULL; - } - cc = char_get_class(ChardevBackendKind_lookup[backend->type], errp); - if (!cc) { + if (cc == NULL) { return NULL; } - chr = qemu_chardev_new(id, object_class_get_name(OBJECT_CLASS(cc)), + chr = qemu_chardev_add(id, object_class_get_name(OBJECT_CLASS(cc)), backend, errp); - if (!chr) { + if (chr == NULL) { return NULL; } @@ -5043,7 +5032,6 @@ ChardevReturn *qmp_chardev_add(const char *id, ChardevBackend *backend, ret->has_pty = true; } - QTAILQ_INSERT_TAIL(&chardevs, chr, next); return ret; } diff --git a/spice-qemu-char.c b/spice-qemu-char.c index 298a951681..dbc81ba4f6 100644 --- a/spice-qemu-char.c +++ b/spice-qemu-char.c @@ -379,7 +379,6 @@ static void char_spicevmc_class_init(ObjectClass *oc, void *data) { ChardevClass *cc = CHARDEV_CLASS(oc); - cc->kind = CHARDEV_BACKEND_KIND_SPICEVMC; cc->parse = qemu_chr_parse_spice_vmc; cc->open = qemu_chr_open_spice_vmc; cc->chr_set_fe_open = spice_vmc_set_fe_open; @@ -395,7 +394,6 @@ static void char_spiceport_class_init(ObjectClass *oc, void *data) { ChardevClass *cc = CHARDEV_CLASS(oc); - cc->kind = CHARDEV_BACKEND_KIND_SPICEPORT; cc->parse = qemu_chr_parse_spice_port; cc->open = qemu_chr_open_spice_port; cc->chr_set_fe_open = spice_port_set_fe_open; diff --git a/ui/console.c b/ui/console.c index 712fa1aec1..1b66868a08 100644 --- a/ui/console.c +++ b/ui/console.c @@ -2176,7 +2176,6 @@ static void char_vc_class_init(ObjectClass *oc, void *data) { ChardevClass *cc = CHARDEV_CLASS(oc); - cc->kind = CHARDEV_BACKEND_KIND_VC; cc->parse = qemu_chr_parse_vc; cc->open = vc_open; cc->chr_write = vc_chr_write; diff --git a/ui/gtk.c b/ui/gtk.c index aa3412d09c..8aa8edbf40 100644 --- a/ui/gtk.c +++ b/ui/gtk.c @@ -1727,7 +1727,6 @@ static void char_gd_vc_class_init(ObjectClass *oc, void *data) { ChardevClass *cc = CHARDEV_CLASS(oc); - cc->kind = CHARDEV_BACKEND_KIND_VC; cc->parse = qemu_chr_parse_vc; cc->open = gd_vc_open; cc->chr_write = gd_vc_chr_write; diff --git a/include/sysemu/char.h b/include/sysemu/char.h index 203e8e84e3..297add973c 100644 --- a/include/sysemu/char.h +++ b/include/sysemu/char.h @@ -472,7 +472,6 @@ typedef struct ChardevClass { ObjectClass parent_class; bool internal; /* TODO: eventually use TYPE_USER_CREATABLE */ - ChardevBackendKind kind; void (*parse)(QemuOpts *opts, ChardevBackend *backend, Error **errp); void (*open)(Chardev *chr, ChardevBackend *backend, -- 2.11.0