mirror of https://github.com/xqemu/xqemu.git
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',
|
'*nodelay' : 'bool',
|
||||||
'*telnet' : 'bool' } }
|
'*telnet' : 'bool' } }
|
||||||
|
|
||||||
|
##
|
||||||
|
# @ChardevMux:
|
||||||
|
#
|
||||||
|
# Configuration info for mux chardevs.
|
||||||
|
#
|
||||||
|
# @chardev: name of the base chardev.
|
||||||
|
#
|
||||||
|
# Since: 1.5
|
||||||
|
##
|
||||||
|
{ 'type': 'ChardevMux', 'data': { 'chardev' : 'str' } }
|
||||||
|
|
||||||
##
|
##
|
||||||
# @ChardevBackend:
|
# @ChardevBackend:
|
||||||
#
|
#
|
||||||
|
@ -3198,7 +3209,8 @@
|
||||||
'parallel': 'ChardevHostdev',
|
'parallel': 'ChardevHostdev',
|
||||||
'socket' : 'ChardevSocket',
|
'socket' : 'ChardevSocket',
|
||||||
'pty' : 'ChardevDummy',
|
'pty' : 'ChardevDummy',
|
||||||
'null' : 'ChardevDummy' } }
|
'null' : 'ChardevDummy',
|
||||||
|
'mux' : 'ChardevMux' } }
|
||||||
|
|
||||||
##
|
##
|
||||||
# @ChardevReturn:
|
# @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);
|
ChardevBackend *backend = g_new0(ChardevBackend, 1);
|
||||||
ChardevReturn *ret = NULL;
|
ChardevReturn *ret = NULL;
|
||||||
const char *id = qemu_opts_id(opts);
|
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;
|
chr = NULL;
|
||||||
backend->kind = cd->kind;
|
backend->kind = cd->kind;
|
||||||
|
@ -3282,10 +3287,24 @@ CharDriverState *qemu_chr_new_from_opts(QemuOpts *opts,
|
||||||
goto qapi_out;
|
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)) {
|
if (error_is_set(errp)) {
|
||||||
goto qapi_out;
|
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);
|
chr = qemu_chr_find(id);
|
||||||
|
|
||||||
qapi_out:
|
qapi_out:
|
||||||
|
@ -3653,7 +3672,7 @@ ChardevReturn *qmp_chardev_add(const char *id, ChardevBackend *backend,
|
||||||
Error **errp)
|
Error **errp)
|
||||||
{
|
{
|
||||||
ChardevReturn *ret = g_new0(ChardevReturn, 1);
|
ChardevReturn *ret = g_new0(ChardevReturn, 1);
|
||||||
CharDriverState *chr = NULL;
|
CharDriverState *base, *chr = NULL;
|
||||||
|
|
||||||
chr = qemu_chr_find(id);
|
chr = qemu_chr_find(id);
|
||||||
if (chr) {
|
if (chr) {
|
||||||
|
@ -3691,6 +3710,15 @@ ChardevReturn *qmp_chardev_add(const char *id, ChardevBackend *backend,
|
||||||
case CHARDEV_BACKEND_KIND_NULL:
|
case CHARDEV_BACKEND_KIND_NULL:
|
||||||
chr = qemu_chr_open_null(NULL);
|
chr = qemu_chr_open_null(NULL);
|
||||||
break;
|
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:
|
default:
|
||||||
error_setg(errp, "unknown chardev backend (%d)", backend->kind);
|
error_setg(errp, "unknown chardev backend (%d)", backend->kind);
|
||||||
break;
|
break;
|
||||||
|
@ -3701,7 +3729,8 @@ ChardevReturn *qmp_chardev_add(const char *id, ChardevBackend *backend,
|
||||||
}
|
}
|
||||||
if (chr) {
|
if (chr) {
|
||||||
chr->label = g_strdup(id);
|
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);
|
QTAILQ_INSERT_TAIL(&chardevs, chr, next);
|
||||||
return ret;
|
return ret;
|
||||||
} else {
|
} else {
|
||||||
|
|
Loading…
Reference in New Issue