mirror of
https://gitlab.com/libvirt/libvirt.git
synced 2025-01-11 09:17:52 +03:00
libxl: support serial list
Add support for multi serial devices, after this patch virsh can be used to connect different serial devices of running domains. E.g. vish # console <xxx> --devname serial<xxx> Note: This depends on a xen/libxl bug fix to have libxl_console_get_tty(...) correctly returning the tty path (as opposed to always returning the first one). [0] https://lists.xen.org/archives/html/xen-devel/2016-08/msg00438.html Signed-off-by: Bob Liu <bob.liu@oracle.com>
This commit is contained in:
parent
70f83f9d52
commit
846a1c6473
@ -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) {
|
||||
|
@ -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);
|
||||
}
|
||||
|
@ -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];
|
||||
|
Loading…
Reference in New Issue
Block a user