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.
*
libxl_domain_restore_params params;
#endif
virHostdevManagerPtr hostdev_mgr = driver->hostdevMgr;
+ libxl_asyncprogress_how aop_console_how;
libxl_domain_config_init(&d_config);
/* 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);
{
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);
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,
}
cleanup:
- VIR_FREE(console);
if (vm)
virObjectUnlock(vm);
return ret;