diff --git a/src/libxl/libxl_domain.c b/src/libxl/libxl_domain.c index 91851172aec6973091d4153976190bf2107cb370..856cfb40305d7f50984efb8527a86f96bb6858cf 100644 --- a/src/libxl/libxl_domain.c +++ b/src/libxl/libxl_domain.c @@ -1149,6 +1149,42 @@ libxlDomainFreeMem(libxlDomainObjPrivatePtr priv, libxl_domain_config *d_config) return ret; } +static void +libxlConsoleCallback(libxl_ctx *ctx, libxl_event* ev, void *for_callback) +{ + virDomainObjPtr vm = for_callback; + libxlDomainObjPrivatePtr priv = vm->privateData; + size_t i; + + 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) { + libxl_console_type console_type; + char *console = NULL; + int ret; + + console_type = + (chr->targetType == VIR_DOMAIN_CHR_CONSOLE_TARGET_TYPE_SERIAL ? + LIBXL_CONSOLE_TYPE_SERIAL : LIBXL_CONSOLE_TYPE_PV); + ret = libxl_console_get_tty(priv->ctx, ev->domid, + chr->target.port, console_type, + &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); +} + + /* * Start a domain through libxenlight. * @@ -1173,6 +1209,7 @@ libxlDomainStart(libxlDriverPrivatePtr driver, virDomainObjPtr vm, libxl_domain_restore_params params; #endif virHostdevManagerPtr hostdev_mgr = driver->hostdevMgr; + libxl_asyncprogress_how aop_console_how; libxl_domain_config_init(&d_config); @@ -1242,17 +1279,21 @@ libxlDomainStart(libxlDriverPrivatePtr driver, virDomainObjPtr vm, /* Unlock virDomainObj while creating the domain */ virObjectUnlock(vm); + + aop_console_how.for_callback = vm; + aop_console_how.callback = libxlConsoleCallback; if (restore_fd < 0) { ret = libxl_domain_create_new(priv->ctx, &d_config, - &domid, NULL, NULL); + &domid, NULL, &aop_console_how); } else { #ifdef LIBXL_HAVE_DOMAIN_CREATE_RESTORE_PARAMS params.checkpointed_stream = 0; ret = libxl_domain_create_restore(priv->ctx, &d_config, &domid, - restore_fd, ¶ms, NULL, NULL); + restore_fd, ¶ms, NULL, + &aop_console_how); #else ret = libxl_domain_create_restore(priv->ctx, &d_config, &domid, - restore_fd, NULL, NULL); + restore_fd, NULL, &aop_console_how); #endif } virObjectLock(vm); diff --git a/src/libxl/libxl_driver.c b/src/libxl/libxl_driver.c index ce7b95a547dfd53e7a1c1c09c89905bc0fb95d0a..cd56cbcd7b4cf2db454b23fc0891703a1b03c551 100644 --- a/src/libxl/libxl_driver.c +++ b/src/libxl/libxl_driver.c @@ -3991,10 +3991,8 @@ libxlDomainOpenConsole(virDomainPtr dom, { virDomainObjPtr vm = NULL; int ret = -1; - libxl_console_type console_type; virDomainChrDefPtr chr = NULL; libxlDomainObjPrivatePtr priv; - char *console = NULL; virCheckFlags(VIR_DOMAIN_CONSOLE_FORCE, -1); @@ -4036,18 +4034,6 @@ libxlDomainOpenConsole(virDomainPtr dom, goto cleanup; } - console_type = - (chr->targetType == VIR_DOMAIN_CHR_CONSOLE_TARGET_TYPE_SERIAL ? - LIBXL_CONSOLE_TYPE_SERIAL : LIBXL_CONSOLE_TYPE_PV); - - ret = libxl_console_get_tty(priv->ctx, vm->def->id, chr->target.port, - console_type, &console); - if (ret) - goto cleanup; - - if (VIR_STRDUP(chr->source.data.file.path, console) < 0) - goto cleanup; - /* handle mutually exclusive access to console devices */ ret = virChrdevOpen(priv->devs, &chr->source, @@ -4061,7 +4047,6 @@ libxlDomainOpenConsole(virDomainPtr dom, } cleanup: - VIR_FREE(console); if (vm) virObjectUnlock(vm); return ret;