chardev: add mux chardev support to qapi
This adds mux chardev support to the qapi and also makes the qapi-based chardev creation path handle the "mux=on" option correctly.
This commit is contained in:
parent
2c5f488293
commit
edb2fb3cc8
@ -3184,6 +3184,17 @@
|
||||
'*nodelay' : 'bool',
|
||||
'*telnet' : 'bool' } }
|
||||
|
||||
##
|
||||
# @ChardevMux:
|
||||
#
|
||||
# Configuration info for mux chardevs.
|
||||
#
|
||||
# @chardev: name of the base chardev.
|
||||
#
|
||||
# Since: 1.5
|
||||
##
|
||||
{ 'type': 'ChardevMux', 'data': { 'chardev' : 'str' } }
|
||||
|
||||
##
|
||||
# @ChardevBackend:
|
||||
#
|
||||
@ -3198,7 +3209,8 @@
|
||||
'parallel': 'ChardevHostdev',
|
||||
'socket' : 'ChardevSocket',
|
||||
'pty' : 'ChardevDummy',
|
||||
'null' : 'ChardevDummy' } }
|
||||
'null' : 'ChardevDummy',
|
||||
'mux' : 'ChardevMux' } }
|
||||
|
||||
##
|
||||
# @ChardevReturn:
|
||||
|
35
qemu-char.c
35
qemu-char.c
@ -3273,6 +3273,11 @@ CharDriverState *qemu_chr_new_from_opts(QemuOpts *opts,
|
||||
ChardevBackend *backend = g_new0(ChardevBackend, 1);
|
||||
ChardevReturn *ret = NULL;
|
||||
const char *id = qemu_opts_id(opts);
|
||||
const char *bid = NULL;
|
||||
|
||||
if (qemu_opt_get_bool(opts, "mux", 0)) {
|
||||
bid = g_strdup_printf("%s-base", id);
|
||||
}
|
||||
|
||||
chr = NULL;
|
||||
backend->kind = cd->kind;
|
||||
@ -3282,10 +3287,24 @@ CharDriverState *qemu_chr_new_from_opts(QemuOpts *opts,
|
||||
goto qapi_out;
|
||||
}
|
||||
}
|
||||
ret = qmp_chardev_add(qemu_opts_id(opts), backend, errp);
|
||||
ret = qmp_chardev_add(bid ? bid : id, backend, errp);
|
||||
if (error_is_set(errp)) {
|
||||
goto qapi_out;
|
||||
}
|
||||
|
||||
if (bid) {
|
||||
qapi_free_ChardevBackend(backend);
|
||||
qapi_free_ChardevReturn(ret);
|
||||
backend = g_new0(ChardevBackend, 1);
|
||||
backend->mux = g_new0(ChardevMux, 1);
|
||||
backend->kind = CHARDEV_BACKEND_KIND_MUX;
|
||||
backend->mux->chardev = g_strdup(bid);
|
||||
ret = qmp_chardev_add(id, backend, errp);
|
||||
if (error_is_set(errp)) {
|
||||
goto qapi_out;
|
||||
}
|
||||
}
|
||||
|
||||
chr = qemu_chr_find(id);
|
||||
|
||||
qapi_out:
|
||||
@ -3653,7 +3672,7 @@ ChardevReturn *qmp_chardev_add(const char *id, ChardevBackend *backend,
|
||||
Error **errp)
|
||||
{
|
||||
ChardevReturn *ret = g_new0(ChardevReturn, 1);
|
||||
CharDriverState *chr = NULL;
|
||||
CharDriverState *base, *chr = NULL;
|
||||
|
||||
chr = qemu_chr_find(id);
|
||||
if (chr) {
|
||||
@ -3691,6 +3710,15 @@ ChardevReturn *qmp_chardev_add(const char *id, ChardevBackend *backend,
|
||||
case CHARDEV_BACKEND_KIND_NULL:
|
||||
chr = qemu_chr_open_null(NULL);
|
||||
break;
|
||||
case CHARDEV_BACKEND_KIND_MUX:
|
||||
base = qemu_chr_find(backend->mux->chardev);
|
||||
if (base == NULL) {
|
||||
error_setg(errp, "mux: base chardev %s not found",
|
||||
backend->mux->chardev);
|
||||
break;
|
||||
}
|
||||
chr = qemu_chr_open_mux(base);
|
||||
break;
|
||||
default:
|
||||
error_setg(errp, "unknown chardev backend (%d)", backend->kind);
|
||||
break;
|
||||
@ -3701,7 +3729,8 @@ ChardevReturn *qmp_chardev_add(const char *id, ChardevBackend *backend,
|
||||
}
|
||||
if (chr) {
|
||||
chr->label = g_strdup(id);
|
||||
chr->avail_connections = 1;
|
||||
chr->avail_connections =
|
||||
(backend->kind == CHARDEV_BACKEND_KIND_MUX) ? MAX_MUX : 1;
|
||||
QTAILQ_INSERT_TAIL(&chardevs, chr, next);
|
||||
return ret;
|
||||
} else {
|
||||
|
Loading…
Reference in New Issue
Block a user