[libvirt] [PATCH V2] add console support in libxl
Daniel P. Berrange
berrange at redhat.com
Thu Jul 18 16:03:42 UTC 2013
On Thu, Jul 18, 2013 at 08:14:17PM +0800, 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.
>
> Signed-off-by: Bamvor Jian Zhang <bjzhang at suse.com>
> ---
> 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 | 88 ++++++++++++++++++++++++++++++++++
> src/libxl/libxl_conf.h | 3 ++
> src/libxl/libxl_driver.c | 122 +++++++++++++++++++++++++++++++++++++++++++++++
> 3 files changed, 213 insertions(+)
>
> +static int
> libxlMakeDomBuildInfo(virDomainDefPtr def, libxl_domain_config *d_config)
> {
> libxl_domain_build_info *b_info = &d_config->b_info;
> @@ -403,6 +487,10 @@ libxlMakeDomBuildInfo(virDomainDefPtr def, libxl_domain_config *d_config)
> if (VIR_STRDUP(b_info->u.hvm.boot, bootorder) < 0)
> goto error;
>
> + if (def->nserials &&
> + (libxlMakeChrdevStr(def->serials[0], &b_info->u.hvm.serial) < 0))
> + goto error;
If you're going to hardcode def->serials[0], then you should explicitly
report an error if 'def->nserials > 1'.
Also you should probably report an error if def->nparallels != 0, since
you don't support that at all.
> +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;
> + size_t i;
> + virDomainChrDefPtr chr = NULL;
> + libxlDomainObjPrivatePtr priv;
> + char *console = NULL;
> + size_t num = 0;
> + libxl_console_type type;
> +
> + virCheckFlags(VIR_DOMAIN_CONSOLE_SAFE |
> + VIR_DOMAIN_CONSOLE_FORCE, -1);
> +
> + 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 (dev_name) {
> + for (i = 0; !chr && i < vm->def->nconsoles; i++) {
> + if (vm->def->consoles[i]->info.alias &&
> + STREQ(dev_name, vm->def->consoles[i]->info.alias)) {
> + chr = vm->def->consoles[i];
> + num = i;
> + }
> + }
> + for (i = 0; !chr && i < vm->def->nserials; i++) {
> + if (STREQ(dev_name, vm->def->serials[i]->info.alias)) {
> + chr = vm->def->serials[i];
> + num = i;
> + }
> + }
> + for (i = 0; !chr && i < vm->def->nparallels; i++) {
> + if (STREQ(dev_name, vm->def->parallels[i]->info.alias)) {
> + chr = vm->def->parallels[i];
> + num = i;
> + }
> + }
Nothing in the libxl driver appears to ever set the info.alias string
names. So this code will crash on a NULL pointer. You should either
ensure the alias is set, or use STREQ_NULLABLE to handle NULL pointers.
> + } else {
> + if (vm->def->nconsoles)
> + chr = vm->def->consoles[0];
> + else if (vm->def->nserials)
> + chr = vm->def->serials[0];
> + }
Daniel
--
|: http://berrange.com -o- http://www.flickr.com/photos/dberrange/ :|
|: http://libvirt.org -o- http://virt-manager.org :|
|: http://autobuild.org -o- http://search.cpan.org/~danberr/ :|
|: http://entangle-photo.org -o- http://live.gnome.org/gtk-vnc :|
More information about the libvir-list
mailing list