diff --git a/src/libxl/libxl_conf.c b/src/libxl/libxl_conf.c index 5ba59b052f5015506e058069ba4fdb3a4233e087..306e44151b65d8b1d129200b79959ba18c79058b 100644 --- a/src/libxl/libxl_conf.c +++ b/src/libxl/libxl_conf.c @@ -431,14 +431,31 @@ libxlMakeDomBuildInfo(virDomainDefPtr def, } if (def->nserials) { - if (def->nserials > 1) { + if (def->nserials == 1) { + if (libxlMakeChrdevStr(def->serials[0], &b_info->u.hvm.serial) < + 0) + return -1; + } else { +#ifdef LIBXL_HAVE_BUILDINFO_SERIAL_LIST + if (VIR_ALLOC_N(b_info->u.hvm.serial_list, def->nserials + 1) < + 0) + return -1; + for (i = 0; i < def->nserials; i++) { + if (libxlMakeChrdevStr(def->serials[i], + &b_info->u.hvm.serial_list[i]) < 0) + { + libxl_string_list_dispose(&b_info->u.hvm.serial_list); + return -1; + } + } + b_info->u.hvm.serial_list[i] = NULL; +#else virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", _("Only one serial device is supported by libxl")); return -1; +#endif } - if (libxlMakeChrdevStr(def->serials[0], &b_info->u.hvm.serial) < 0) - return -1; } if (def->nparallels) { diff --git a/src/libxl/libxl_domain.c b/src/libxl/libxl_domain.c index 57ef23518b06d5dd0354bc455d5a0030c8ce6cd1..a85dd75946e52a3e748d7bf00db80d7954de833f 100644 --- a/src/libxl/libxl_domain.c +++ b/src/libxl/libxl_domain.c @@ -983,18 +983,20 @@ libxlConsoleCallback(libxl_ctx *ctx, libxl_event *ev, void *for_callback) { virDomainObjPtr vm = for_callback; size_t i; + virDomainChrDefPtr chr; + char *console = NULL; + int ret; virObjectLock(vm); for (i = 0; i < vm->def->nconsoles; i++) { - virDomainChrDefPtr chr = vm->def->consoles[i]; + chr = vm->def->consoles[i]; + 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->deviceType == VIR_DOMAIN_CHR_DEVICE_TYPE_SERIAL ? @@ -1012,6 +1014,27 @@ libxlConsoleCallback(libxl_ctx *ctx, libxl_event *ev, void *for_callback) VIR_FREE(console); } } + for (i = 0; i < vm->def->nserials; i++) { + chr = vm->def->serials[i]; + + ignore_value(virAsprintf(&chr->info.alias, "serial%zd", i)); + if (chr->source.type == VIR_DOMAIN_CHR_TYPE_PTY) { + if (chr->source.data.file.path) + continue; + ret = libxl_console_get_tty(ctx, ev->domid, + chr->target.port, + LIBXL_CONSOLE_TYPE_SERIAL, + &console); + if (!ret) { + VIR_FREE(chr->source.data.file.path); + if (console && console[0] != '\0') { + ignore_value(VIR_STRDUP(chr->source.data.file.path, + console)); + } + } + VIR_FREE(console); + } + } virObjectUnlock(vm); libxl_event_free(ctx, ev); } diff --git a/src/libxl/libxl_driver.c b/src/libxl/libxl_driver.c index 3ffaa7429c155fd8c07bc1758f80b75d681e1c11..480fef92c0e67a30b0b836702dfcafa255cf2fe1 100644 --- a/src/libxl/libxl_driver.c +++ b/src/libxl/libxl_driver.c @@ -4679,13 +4679,6 @@ libxlDomainOpenConsole(virDomainPtr dom, virCheckFlags(VIR_DOMAIN_CONSOLE_FORCE, -1); - if (dev_name) { - /* XXX support device aliases in future */ - virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", - _("Named device aliases are not supported")); - goto cleanup; - } - if (!(vm = libxlDomObjFromDomain(dom))) goto cleanup; @@ -4701,8 +4694,16 @@ libxlDomainOpenConsole(virDomainPtr dom, } priv = vm->privateData; + if (dev_name) { + size_t i; - if (vm->def->nconsoles) { + for (i = 0; !chr && i < vm->def->nserials; i++) { + if (STREQ(dev_name, vm->def->serials[i]->info.alias)) { + chr = vm->def->serials[i]; + break; + } + } + } else if (vm->def->nconsoles) { chr = vm->def->consoles[0]; if (chr->targetType == VIR_DOMAIN_CHR_CONSOLE_TARGET_TYPE_SERIAL) chr = vm->def->serials[0];