Message ID | 1496152683-102751-2-git-send-email-anton.nefedov@virtuozzo.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
On Tue, May 30, 2017 at 6:09 PM Anton Nefedov <anton.nefedov@virtuozzo.com> wrote: > parse function will be used by the following patch > > Signed-off-by: Anton Nefedov <anton.nefedov@virtuozzo.com> > Reviewed-by: Vladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com> > Reviewed-by: Marc-André Lureau <marcandre.lureau@redhat.com> --- > chardev/char.c | 70 > ++++++++++++++++++++++++++++++++++++---------------------- > 1 file changed, 44 insertions(+), 26 deletions(-) > > diff --git a/chardev/char.c b/chardev/char.c > index 4e24dc3..3a0f543 100644 > --- a/chardev/char.c > +++ b/chardev/char.c > @@ -854,17 +854,13 @@ 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 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; > > if (name == NULL) { > error_setg(errp, "chardev: \"%s\" missing backend", > @@ -872,21 +868,6 @@ Chardev *qemu_chr_new_from_opts(QemuOpts *opts, > return NULL; > } > > - if (is_help_option(name)) { > - GString *str = g_string_new(""); > - > - chardev_name_foreach(help_string_append, str); > - > - error_report("Available chardev backend types: %s", str->str); > - g_string_free(str, true); > - exit(0); > - } > - > - if (id == NULL) { > - error_setg(errp, "chardev: no id specified"); > - return NULL; > - } > - > for (i = 0; i < ARRAY_SIZE(chardev_alias_table); i++) { > if (g_strcmp0(chardev_alias_table[i].alias, name) == 0) { > name = chardev_alias_table[i].typename; > @@ -902,16 +883,12 @@ Chardev *qemu_chr_new_from_opts(QemuOpts *opts, > 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; > + qapi_free_ChardevBackend(backend); > + return NULL; > } > } else { > ChardevCommon *ccom = g_new0(ChardevCommon, 1); > @@ -919,6 +896,47 @@ Chardev *qemu_chr_new_from_opts(QemuOpts *opts, > 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 = 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); > + > + error_report("Available chardev backend types: %s", str->str); > + g_string_free(str, true); > + exit(0); > + } > + > + if (id == NULL) { > + error_setg(errp, "chardev: no id specified"); > + return NULL; > + } > + > + backend = qemu_chr_parse_opts(opts, errp); > + if (backend == NULL) { > + return NULL; > + } > + > + cc = char_get_class(name, errp); > + if (cc == NULL) { > + goto out; > + } > + > + if (qemu_opt_get_bool(opts, "mux", 0)) { > + bid = g_strdup_printf("%s-base", id); > + } > + > chr = qemu_chardev_new(bid ? bid : id, > object_class_get_name(OBJECT_CLASS(cc)), > backend, errp); > -- > 2.7.4 > > > -- Marc-André Lureau
diff --git a/chardev/char.c b/chardev/char.c index 4e24dc3..3a0f543 100644 --- a/chardev/char.c +++ b/chardev/char.c @@ -854,17 +854,13 @@ 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 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; if (name == NULL) { error_setg(errp, "chardev: \"%s\" missing backend", @@ -872,21 +868,6 @@ Chardev *qemu_chr_new_from_opts(QemuOpts *opts, return NULL; } - if (is_help_option(name)) { - GString *str = g_string_new(""); - - chardev_name_foreach(help_string_append, str); - - error_report("Available chardev backend types: %s", str->str); - g_string_free(str, true); - exit(0); - } - - if (id == NULL) { - error_setg(errp, "chardev: no id specified"); - return NULL; - } - for (i = 0; i < ARRAY_SIZE(chardev_alias_table); i++) { if (g_strcmp0(chardev_alias_table[i].alias, name) == 0) { name = chardev_alias_table[i].typename; @@ -902,16 +883,12 @@ Chardev *qemu_chr_new_from_opts(QemuOpts *opts, 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; + qapi_free_ChardevBackend(backend); + return NULL; } } else { ChardevCommon *ccom = g_new0(ChardevCommon, 1); @@ -919,6 +896,47 @@ Chardev *qemu_chr_new_from_opts(QemuOpts *opts, 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 = 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); + + error_report("Available chardev backend types: %s", str->str); + g_string_free(str, true); + exit(0); + } + + if (id == NULL) { + error_setg(errp, "chardev: no id specified"); + return NULL; + } + + backend = qemu_chr_parse_opts(opts, errp); + if (backend == NULL) { + return NULL; + } + + cc = char_get_class(name, errp); + if (cc == NULL) { + goto out; + } + + if (qemu_opt_get_bool(opts, "mux", 0)) { + bid = g_strdup_printf("%s-base", id); + } + chr = qemu_chardev_new(bid ? bid : id, object_class_get_name(OBJECT_CLASS(cc)), backend, errp);