[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] [PULL 08/41] char: move QemuOpts->ChardevBackend translatio
From: |
Paolo Bonzini |
Subject: |
[Qemu-devel] [PULL 08/41] char: move QemuOpts->ChardevBackend translation to a separate func |
Date: |
Thu, 13 Jul 2017 16:24:01 +0200 |
From: Anton Nefedov <address@hidden>
parse function will be used by the following patch
Signed-off-by: Anton Nefedov <address@hidden>
Message-Id: <address@hidden>
Reviewed-by: Marc-André Lureau <address@hidden>
Signed-off-by: Paolo Bonzini <address@hidden>
---
chardev/char.c | 81 ++++++++++++++++++++++++++++++++++++----------------------
1 file changed, 51 insertions(+), 30 deletions(-)
diff --git a/chardev/char.c b/chardev/char.c
index 2b679a2..839eff6 100644
--- a/chardev/char.c
+++ b/chardev/char.c
@@ -556,17 +556,23 @@ help_string_append(const char *name, void *opaque)
g_string_append_printf(str, "\n%s", name);
}
-Chardev *qemu_chr_new_from_opts(QemuOpts *opts,
- Error **errp)
+static const char *chardev_alias_translate(const char *name)
+{
+ int i;
+ for (i = 0; i < (int)ARRAY_SIZE(chardev_alias_table); i++) {
+ if (g_strcmp0(chardev_alias_table[i].alias, name) == 0) {
+ return chardev_alias_table[i].typename;
+ }
+ }
+ return name;
+}
+
+static ChardevBackend *qemu_chr_parse_opts(QemuOpts *opts, Error **errp)
{
Error *local_err = NULL;
const ChardevClass *cc;
- Chardev *chr;
- int i;
ChardevBackend *backend = NULL;
- const char *name = qemu_opt_get(opts, "backend");
- const char *id = qemu_opts_id(opts);
- char *bid = NULL;
+ const char *name = chardev_alias_translate(qemu_opt_get(opts, "backend"));
if (name == NULL) {
error_setg(errp, "chardev: \"%s\" missing backend",
@@ -574,7 +580,40 @@ Chardev *qemu_chr_new_from_opts(QemuOpts *opts,
return NULL;
}
- if (is_help_option(name)) {
+ cc = char_get_class(name, errp);
+ if (cc == NULL) {
+ return NULL;
+ }
+
+ backend = g_new0(ChardevBackend, 1);
+ backend->type = CHARDEV_BACKEND_KIND_NULL;
+
+ if (cc->parse) {
+ cc->parse(opts, backend, &local_err);
+ if (local_err) {
+ error_propagate(errp, local_err);
+ qapi_free_ChardevBackend(backend);
+ return NULL;
+ }
+ } else {
+ ChardevCommon *ccom = g_new0(ChardevCommon, 1);
+ qemu_chr_parse_common(opts, ccom);
+ backend->u.null.data = ccom; /* Any ChardevCommon member would work */
+ }
+
+ return backend;
+}
+
+Chardev *qemu_chr_new_from_opts(QemuOpts *opts, Error **errp)
+{
+ const ChardevClass *cc;
+ Chardev *chr = NULL;
+ ChardevBackend *backend = NULL;
+ const char *name = chardev_alias_translate(qemu_opt_get(opts, "backend"));
+ const char *id = qemu_opts_id(opts);
+ char *bid = NULL;
+
+ if (name && is_help_option(name)) {
GString *str = g_string_new("");
chardev_name_foreach(help_string_append, str);
@@ -589,38 +628,20 @@ Chardev *qemu_chr_new_from_opts(QemuOpts *opts,
return NULL;
}
- for (i = 0; i < (int)ARRAY_SIZE(chardev_alias_table); i++) {
- if (g_strcmp0(chardev_alias_table[i].alias, name) == 0) {
- name = chardev_alias_table[i].typename;
- break;
- }
+ backend = qemu_chr_parse_opts(opts, errp);
+ if (backend == NULL) {
+ return NULL;
}
cc = char_get_class(name, errp);
if (cc == NULL) {
- return NULL;
+ goto out;
}
- 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;
- if (cc->parse) {
- cc->parse(opts, backend, &local_err);
- if (local_err) {
- error_propagate(errp, local_err);
- goto out;
- }
- } else {
- ChardevCommon *ccom = g_new0(ChardevCommon, 1);
- qemu_chr_parse_common(opts, ccom);
- backend->u.null.data = ccom; /* Any ChardevCommon member would work */
- }
-
chr = qemu_chardev_new(bid ? bid : id,
object_class_get_name(OBJECT_CLASS(cc)),
backend, errp);
--
1.8.3.1
- [Qemu-devel] [PULL 00/41] Misc patches for QEMU 2.10 soft freeze, Paolo Bonzini, 2017/07/13
- [Qemu-devel] [PULL 04/41] MAINTAINERS: update Xen entries, Paolo Bonzini, 2017/07/13
- [Qemu-devel] [PULL 03/41] MAINTAINERS: update KVM entries, Paolo Bonzini, 2017/07/13
- [Qemu-devel] [PULL 01/41] build: add -Wexpansion-to-defined, Paolo Bonzini, 2017/07/13
- [Qemu-devel] [PULL 06/41] MAINTAINERS: add entry for "Unimplemented" device, Paolo Bonzini, 2017/07/13
- [Qemu-devel] [PULL 02/41] MAINTAINERS: update TCG entries, Paolo Bonzini, 2017/07/13
- [Qemu-devel] [PULL 07/41] chardev: block during sync read, Paolo Bonzini, 2017/07/13
- [Qemu-devel] [PULL 05/41] MAINTAINERS: update TCI entry, Paolo Bonzini, 2017/07/13
- [Qemu-devel] [PULL 08/41] char: move QemuOpts->ChardevBackend translation to a separate func,
Paolo Bonzini <=
- [Qemu-devel] [PULL 10/41] char: chardevice hotswap, Paolo Bonzini, 2017/07/13
- [Qemu-devel] [PULL 13/41] test-char: destroy chardev-udp after test, Paolo Bonzini, 2017/07/13
- [Qemu-devel] [PULL 12/41] char: avoid chardevice direct access, Paolo Bonzini, 2017/07/13
- [Qemu-devel] [PULL 16/41] test-char: add hotswap test, Paolo Bonzini, 2017/07/13
- [Qemu-devel] [PULL 14/41] test-char: split char_udp_test, Paolo Bonzini, 2017/07/13
- [Qemu-devel] [PULL 17/41] hmp: add hmp analogue for qmp-chardev-change, Paolo Bonzini, 2017/07/13
- [Qemu-devel] [PULL 15/41] test-char: split char_file_test, Paolo Bonzini, 2017/07/13
- [Qemu-devel] [PULL 19/41] serial: move TIOCM update to a separate function, Paolo Bonzini, 2017/07/13
- [Qemu-devel] [PULL 21/41] exec: use qemu_ram_ptr_length to access guest ram, Paolo Bonzini, 2017/07/13
- [Qemu-devel] [PULL 23/41] mttcg/i386: Patch instruction using async_safe_* framework, Paolo Bonzini, 2017/07/13