Bamvor Jian Zhang wrote: > this patch introduce the console api in libxl driver for both pv and > hvm guest. and import and update the libxlMakeChrdevStr function > which was deleted in commit dfa1e1dd. > ACK, looks good to me now. Unless there are other review comments, I'll commit this once 1.1.1 is released. Regards, Jim > Signed-off-by: Bamvor Jian Zhang <bjzhang@xxxxxxxx> > --- > Changes since V4: > 1), using proper error instead of VIR_ERR_INTERNAL_ERROR. > 2), treat safe as unsupported flags in libxl openConsole api. > 3), some format and minor logic changes. > > Changes since V3: > implicity forbit dev_name pass to libxl driver due to only one > console supported by libxl. > > Changes since V2: > 1), forbid parallel configure because libxl do not support it > 2), only support one serial on libxl driver. > 3), also remove console code in libxl driver, AFAICS serial is enough for > connecting to libxl console. > > Changes since V1: > 1), add virDomainOpenConsoleEnsureACL > 3), remove virReportOOMErrorFull when virAsprintf fail. > 4), change size_t for non-nagetive number in libxlDomainOpenConsole > size_t i; > size_t num = 0; > 5), fix for make check > (1), replace virAsprintf with VIR_STRDUP in two places > (2), delete space. > > src/libxl/libxl_conf.c | 104 +++++++++++++++++++++++++++++++++++++++++++++++ > src/libxl/libxl_conf.h | 3 ++ > src/libxl/libxl_driver.c | 93 ++++++++++++++++++++++++++++++++++++++++++ > 3 files changed, 200 insertions(+) > > diff --git a/src/libxl/libxl_conf.c b/src/libxl/libxl_conf.c > index 5273a26..827dfdd 100644 > --- a/src/libxl/libxl_conf.c > +++ b/src/libxl/libxl_conf.c > @@ -331,6 +331,92 @@ error: > } > > static int > +libxlMakeChrdevStr(virDomainChrDefPtr def, char **buf) > +{ > + virDomainChrSourceDef srcdef = def->source; > + const char *type = virDomainChrTypeToString(srcdef.type); > + > + if (!type) { > + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, > + "%s", _("unknown chrdev type")); > + return -1; > + } > + > + switch (srcdef.type) { > + case VIR_DOMAIN_CHR_TYPE_NULL: > + case VIR_DOMAIN_CHR_TYPE_STDIO: > + case VIR_DOMAIN_CHR_TYPE_VC: > + case VIR_DOMAIN_CHR_TYPE_PTY: > + if (VIR_STRDUP(*buf, type) < 0) > + return -1; > + break; > + > + case VIR_DOMAIN_CHR_TYPE_FILE: > + case VIR_DOMAIN_CHR_TYPE_PIPE: > + if (virAsprintf(buf, "%s:%s", type, srcdef.data.file.path) < 0) > + return -1; > + break; > + > + case VIR_DOMAIN_CHR_TYPE_DEV: > + if (VIR_STRDUP(*buf, srcdef.data.file.path) < 0) > + return -1; > + break; > + > + case VIR_DOMAIN_CHR_TYPE_UDP: { > + const char *connectHost = srcdef.data.udp.connectHost; > + const char *bindHost = srcdef.data.udp.bindHost; > + const char *bindService = srcdef.data.udp.bindService; > + > + if (connectHost == NULL) > + connectHost = ""; > + if (bindHost == NULL) > + bindHost = ""; > + if (bindService == NULL) > + bindService = "0"; > + > + if (virAsprintf(buf, "udp:%s:%s@%s:%s", > + connectHost, > + srcdef.data.udp.connectService, > + bindHost, > + bindService) < 0) > + return -1; > + break; > + } > + > + case VIR_DOMAIN_CHR_TYPE_TCP: { > + const char *prefix; > + > + if (srcdef.data.tcp.protocol == VIR_DOMAIN_CHR_TCP_PROTOCOL_TELNET) > + prefix = "telnet"; > + else > + prefix = "tcp"; > + > + if (virAsprintf(buf, "%s:%s:%s%s", > + prefix, > + srcdef.data.tcp.host, > + srcdef.data.tcp.service, > + srcdef.data.tcp.listen ? ",server,nowait" : "") < 0) > + return -1; > + break; > + } > + > + case VIR_DOMAIN_CHR_TYPE_UNIX: > + if (virAsprintf(buf, "unix:%s%s", > + srcdef.data.nix.path, > + srcdef.data.nix.listen ? ",server,nowait" : "") < 0) > + return -1; > + break; > + > + default: > + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, > + _("unsupported chardev '%s'"), type); > + return -1; > + } > + > + return 0; > +} > + > +static int > libxlMakeDomBuildInfo(virDomainObjPtr vm, libxl_domain_config *d_config) > { > virDomainDefPtr def = vm->def; > @@ -411,6 +497,24 @@ libxlMakeDomBuildInfo(virDomainObjPtr vm, libxl_domain_config *d_config) > if (VIR_STRDUP(b_info->u.hvm.boot, bootorder) < 0) > goto error; > > + if (def->nserials) { > + if (def->nserials > 1) { > + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, > + "%s", > + _("Only one serial device is supported by libxl")); > + goto error; > + } > + if (libxlMakeChrdevStr(def->serials[0], &b_info->u.hvm.serial) < 0) > + goto error; > + } > + > + if (def->nparallels) { > + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, > + "%s", > + _("Parallel devices are not supported by libxl")); > + goto error; > + } > + > /* > * The following comment and calculation were taken directly from > * libxenlight's internal function libxl_get_required_shadow_memory(): > diff --git a/src/libxl/libxl_conf.h b/src/libxl/libxl_conf.h > index 942cdd5..aa57710 100644 > --- a/src/libxl/libxl_conf.h > +++ b/src/libxl/libxl_conf.h > @@ -34,6 +34,7 @@ > # include "configmake.h" > # include "virportallocator.h" > # include "virobject.h" > +# include "virchrdev.h" > > > # define LIBXL_VNC_PORT_MIN 5900 > @@ -94,6 +95,8 @@ struct _libxlDomainObjPrivate { > > /* per domain libxl ctx */ > libxl_ctx *ctx; > + /* console */ > + virChrdevsPtr devs; > libxl_evgen_domain_death *deathW; > > /* list of libxl timeout registrations */ > diff --git a/src/libxl/libxl_driver.c b/src/libxl/libxl_driver.c > index 98b1985..0d42062 100644 > --- a/src/libxl/libxl_driver.c > +++ b/src/libxl/libxl_driver.c > @@ -417,6 +417,9 @@ libxlDomainObjPrivateAlloc(void) > > libxl_osevent_register_hooks(priv->ctx, &libxl_event_callbacks, priv); > > + if (!(priv->devs = virChrdevAlloc())) > + return NULL; > + > return priv; > } > > @@ -428,6 +431,7 @@ libxlDomainObjPrivateDispose(void *obj) > if (priv->deathW) > libxl_evdisable_domain_death(priv->ctx, priv->deathW); > > + virChrdevFree(priv->devs); > libxl_ctx_free(priv->ctx); > } > > @@ -4493,6 +4497,94 @@ cleanup: > return ret; > } > > + > +static int > +libxlDomainOpenConsole(virDomainPtr dom, > + const char *dev_name, > + virStreamPtr st, > + unsigned int flags) > +{ > + libxlDriverPrivatePtr driver = dom->conn->privateData; > + virDomainObjPtr vm = NULL; > + int ret = -1; > + virDomainChrDefPtr chr = NULL; > + libxlDomainObjPrivatePtr priv; > + char *console = NULL; > + > + 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; > + } > + > + libxlDriverLock(driver); > + vm = virDomainObjListFindByUUID(driver->domains, dom->uuid); > + libxlDriverUnlock(driver); > + if (!vm) { > + char uuidstr[VIR_UUID_STRING_BUFLEN]; > + virUUIDFormat(dom->uuid, uuidstr); > + virReportError(VIR_ERR_NO_DOMAIN, > + _("No domain with matching uuid '%s'"), uuidstr); > + goto cleanup; > + } > + > + if (virDomainOpenConsoleEnsureACL(dom->conn, vm->def) < 0) > + goto cleanup; > + > + if (!virDomainObjIsActive(vm)) { > + virReportError(VIR_ERR_OPERATION_INVALID, > + "%s", _("domain is not running")); > + goto cleanup; > + } > + > + priv = vm->privateData; > + > + if (vm->def->nserials) > + chr = vm->def->serials[0]; > + > + if (!chr) { > + virReportError(VIR_ERR_INTERNAL_ERROR, > + _("cannot find character device %s"), > + NULLSTR(dev_name)); > + goto cleanup; > + } > + > + if (chr->source.type != VIR_DOMAIN_CHR_TYPE_PTY) { > + virReportError(VIR_ERR_INTERNAL_ERROR, > + _("character device %s is not using a PTY"), > + NULLSTR(dev_name)); > + goto cleanup; > + } > + > + ret = libxl_primary_console_get_tty(priv->ctx, vm->def->id, &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, > + st, > + (flags & VIR_DOMAIN_CONSOLE_FORCE) != 0); > + > + if (ret == 1) { > + virReportError(VIR_ERR_OPERATION_FAILED, "%s", > + _("Active console session exists for this domain")); > + ret = -1; > + } > + > +cleanup: > + VIR_FREE(console); > + if (vm) > + virObjectUnlock(vm); > + return ret; > +} > + > static int > libxlDomainSetSchedulerParameters(virDomainPtr dom, virTypedParameterPtr params, > int nparams) > @@ -4875,6 +4967,7 @@ static virDriver libxlDriver = { > .domainManagedSave = libxlDomainManagedSave, /* 0.9.2 */ > .domainHasManagedSaveImage = libxlDomainHasManagedSaveImage, /* 0.9.2 */ > .domainManagedSaveRemove = libxlDomainManagedSaveRemove, /* 0.9.2 */ > + .domainOpenConsole = libxlDomainOpenConsole, /* 1.1.2 */ > .domainIsActive = libxlDomainIsActive, /* 0.9.0 */ > .domainIsPersistent = libxlDomainIsPersistent, /* 0.9.0 */ > .domainIsUpdated = libxlDomainIsUpdated, /* 0.9.0 */ > -- libvir-list mailing list libvir-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/libvir-list