Commit bd2d80b2 authored by Gerd Hoffmann's avatar Gerd Hoffmann
Browse files

chardev: add error reporting for qemu_chr_new_from_opts



Signed-off-by: default avatarGerd Hoffmann <kraxel@redhat.com>
parent 249d4172
Loading
Loading
Loading
Loading
+2 −1
Original line number Diff line number Diff line
@@ -89,7 +89,8 @@ struct CharDriverState {
 * Returns: a new character backend
 */
CharDriverState *qemu_chr_new_from_opts(QemuOpts *opts,
                                    void (*init)(struct CharDriverState *s));
                                    void (*init)(struct CharDriverState *s),
                                    Error **errp);

/**
 * @qemu_chr_new:
+15 −9
Original line number Diff line number Diff line
@@ -2779,18 +2779,19 @@ static const struct {
};

CharDriverState *qemu_chr_new_from_opts(QemuOpts *opts,
                                    void (*init)(struct CharDriverState *s))
                                    void (*init)(struct CharDriverState *s),
                                    Error **errp)
{
    CharDriverState *chr;
    int i;

    if (qemu_opts_id(opts) == NULL) {
        fprintf(stderr, "chardev: no id specified\n");
        error_setg(errp, "chardev: no id specified\n");
        return NULL;
    }

    if (qemu_opt_get(opts, "backend") == NULL) {
        fprintf(stderr, "chardev: \"%s\" missing backend\n",
        error_setg(errp, "chardev: \"%s\" missing backend\n",
                   qemu_opts_id(opts));
        return NULL;
    }
@@ -2799,14 +2800,14 @@ CharDriverState *qemu_chr_new_from_opts(QemuOpts *opts,
            break;
    }
    if (i == ARRAY_SIZE(backend_table)) {
        fprintf(stderr, "chardev: backend \"%s\" not found\n",
        error_setg(errp, "chardev: backend \"%s\" not found\n",
                   qemu_opt_get(opts, "backend"));
        return NULL;
    }

    chr = backend_table[i].open(opts);
    if (!chr) {
        fprintf(stderr, "chardev: opening backend \"%s\" failed\n",
        error_setg(errp, "chardev: opening backend \"%s\" failed\n",
                   qemu_opt_get(opts, "backend"));
        return NULL;
    }
@@ -2837,6 +2838,7 @@ CharDriverState *qemu_chr_new(const char *label, const char *filename, void (*in
    const char *p;
    CharDriverState *chr;
    QemuOpts *opts;
    Error *err = NULL;

    if (strstart(filename, "chardev:", &p)) {
        return qemu_chr_find(p);
@@ -2846,7 +2848,11 @@ CharDriverState *qemu_chr_new(const char *label, const char *filename, void (*in
    if (!opts)
        return NULL;

    chr = qemu_chr_new_from_opts(opts, init);
    chr = qemu_chr_new_from_opts(opts, init, &err);
    if (error_is_set(&err)) {
        fprintf(stderr, "%s\n", error_get_pretty(err));
        error_free(err);
    }
    if (chr && qemu_opt_get_bool(opts, "mux", 0)) {
        monitor_init(chr, MONITOR_USE_READLINE);
    }
+6 −3
Original line number Diff line number Diff line
@@ -2238,11 +2238,14 @@ static int device_init_func(QemuOpts *opts, void *opaque)

static int chardev_init_func(QemuOpts *opts, void *opaque)
{
    CharDriverState *chr;
    Error *local_err = NULL;

    chr = qemu_chr_new_from_opts(opts, NULL);
    if (!chr)
    qemu_chr_new_from_opts(opts, NULL, &local_err);
    if (error_is_set(&local_err)) {
        fprintf(stderr, "%s\n", error_get_pretty(local_err));
        error_free(local_err);
        return -1;
    }
    return 0;
}