mirror of https://github.com/xqemu/xqemu.git
chardev: add error reporting for qemu_chr_new_from_opts
Signed-off-by: Gerd Hoffmann <kraxel@redhat.com>
This commit is contained in:
parent
249d41720b
commit
bd2d80b2b7
|
@ -89,7 +89,8 @@ struct CharDriverState {
|
||||||
* Returns: a new character backend
|
* Returns: a new character backend
|
||||||
*/
|
*/
|
||||||
CharDriverState *qemu_chr_new_from_opts(QemuOpts *opts,
|
CharDriverState *qemu_chr_new_from_opts(QemuOpts *opts,
|
||||||
void (*init)(struct CharDriverState *s));
|
void (*init)(struct CharDriverState *s),
|
||||||
|
Error **errp);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @qemu_chr_new:
|
* @qemu_chr_new:
|
||||||
|
|
24
qemu-char.c
24
qemu-char.c
|
@ -2779,19 +2779,20 @@ static const struct {
|
||||||
};
|
};
|
||||||
|
|
||||||
CharDriverState *qemu_chr_new_from_opts(QemuOpts *opts,
|
CharDriverState *qemu_chr_new_from_opts(QemuOpts *opts,
|
||||||
void (*init)(struct CharDriverState *s))
|
void (*init)(struct CharDriverState *s),
|
||||||
|
Error **errp)
|
||||||
{
|
{
|
||||||
CharDriverState *chr;
|
CharDriverState *chr;
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
if (qemu_opts_id(opts) == NULL) {
|
if (qemu_opts_id(opts) == NULL) {
|
||||||
fprintf(stderr, "chardev: no id specified\n");
|
error_setg(errp, "chardev: no id specified\n");
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (qemu_opt_get(opts, "backend") == 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));
|
qemu_opts_id(opts));
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
for (i = 0; i < ARRAY_SIZE(backend_table); i++) {
|
for (i = 0; i < ARRAY_SIZE(backend_table); i++) {
|
||||||
|
@ -2799,15 +2800,15 @@ CharDriverState *qemu_chr_new_from_opts(QemuOpts *opts,
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
if (i == ARRAY_SIZE(backend_table)) {
|
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"));
|
qemu_opt_get(opts, "backend"));
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
chr = backend_table[i].open(opts);
|
chr = backend_table[i].open(opts);
|
||||||
if (!chr) {
|
if (!chr) {
|
||||||
fprintf(stderr, "chardev: opening backend \"%s\" failed\n",
|
error_setg(errp, "chardev: opening backend \"%s\" failed\n",
|
||||||
qemu_opt_get(opts, "backend"));
|
qemu_opt_get(opts, "backend"));
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2837,6 +2838,7 @@ CharDriverState *qemu_chr_new(const char *label, const char *filename, void (*in
|
||||||
const char *p;
|
const char *p;
|
||||||
CharDriverState *chr;
|
CharDriverState *chr;
|
||||||
QemuOpts *opts;
|
QemuOpts *opts;
|
||||||
|
Error *err = NULL;
|
||||||
|
|
||||||
if (strstart(filename, "chardev:", &p)) {
|
if (strstart(filename, "chardev:", &p)) {
|
||||||
return qemu_chr_find(p);
|
return qemu_chr_find(p);
|
||||||
|
@ -2846,7 +2848,11 @@ CharDriverState *qemu_chr_new(const char *label, const char *filename, void (*in
|
||||||
if (!opts)
|
if (!opts)
|
||||||
return NULL;
|
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)) {
|
if (chr && qemu_opt_get_bool(opts, "mux", 0)) {
|
||||||
monitor_init(chr, MONITOR_USE_READLINE);
|
monitor_init(chr, MONITOR_USE_READLINE);
|
||||||
}
|
}
|
||||||
|
|
9
vl.c
9
vl.c
|
@ -2238,11 +2238,14 @@ static int device_init_func(QemuOpts *opts, void *opaque)
|
||||||
|
|
||||||
static int chardev_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);
|
qemu_chr_new_from_opts(opts, NULL, &local_err);
|
||||||
if (!chr)
|
if (error_is_set(&local_err)) {
|
||||||
|
fprintf(stderr, "%s\n", error_get_pretty(local_err));
|
||||||
|
error_free(local_err);
|
||||||
return -1;
|
return -1;
|
||||||
|
}
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue