mirror of
https://gitlab.com/libvirt/libvirt.git
synced 2025-03-07 17:28:15 +00:00
libxl: use serial device for console when targetType is serial
When domXML contains only <console type='pty'> and no corresponding <serial>, the console is "stolen" [1] and used as the first <serial> device. When this "stolen" console is accessed from the libxl driver (in libxlConsoleCallback and libxlDomainOpenConsole), check if the targetType is VIR_DOMAIN_CHR_CONSOLE_TARGET_TYPE_SERIAL, and use the "stolen" device in def->serials[0] instead. Prior to this change, creating a domain with input XML containing only a <console> device and subsequently attempting to access its console with 'virsh console' would fail error: internal error: character device <null> is not using a PTY [1] See comments associated with virDomainDefAddConsoleCompat() in $LIBVIRT-SRC/src/conf/domain_conf.c:
This commit is contained in:
parent
a921699ad9
commit
76d5871648
@ -964,13 +964,17 @@ libxlConsoleCallback(libxl_ctx *ctx, libxl_event *ev, void *for_callback)
|
||||
virObjectLock(vm);
|
||||
for (i = 0; i < vm->def->nconsoles; i++) {
|
||||
virDomainChrDefPtr chr = vm->def->consoles[i];
|
||||
if (chr && chr->source.type == VIR_DOMAIN_CHR_TYPE_PTY) {
|
||||
if (i == 0 &&
|
||||
chr->targetType == VIR_DOMAIN_CHR_CONSOLE_TARGET_TYPE_SERIAL)
|
||||
chr = vm->def->serials[0];
|
||||
|
||||
if (chr->source.type == VIR_DOMAIN_CHR_TYPE_PTY) {
|
||||
libxl_console_type console_type;
|
||||
char *console = NULL;
|
||||
int ret;
|
||||
|
||||
console_type =
|
||||
(chr->targetType == VIR_DOMAIN_CHR_CONSOLE_TARGET_TYPE_SERIAL ?
|
||||
(chr->deviceType == VIR_DOMAIN_CHR_DEVICE_TYPE_SERIAL ?
|
||||
LIBXL_CONSOLE_TYPE_SERIAL : LIBXL_CONSOLE_TYPE_PV);
|
||||
ret = libxl_console_get_tty(ctx, ev->domid,
|
||||
chr->target.port, console_type,
|
||||
|
@ -4443,8 +4443,11 @@ libxlDomainOpenConsole(virDomainPtr dom,
|
||||
|
||||
priv = vm->privateData;
|
||||
|
||||
if (vm->def->nconsoles)
|
||||
if (vm->def->nconsoles) {
|
||||
chr = vm->def->consoles[0];
|
||||
if (chr->targetType == VIR_DOMAIN_CHR_CONSOLE_TARGET_TYPE_SERIAL)
|
||||
chr = vm->def->serials[0];
|
||||
}
|
||||
|
||||
if (!chr) {
|
||||
virReportError(VIR_ERR_INTERNAL_ERROR,
|
||||
|
Loading…
x
Reference in New Issue
Block a user