[libvirt] [PATCH 5/5] qemu: Implement virDomainOpenChannel API

Daniel P. Berrange berrange at redhat.com
Mon Dec 17 21:58:33 UTC 2012


On Thu, Dec 13, 2012 at 11:24:20AM -0500, John Eckersberg wrote:
> ---
>  src/qemu/qemu_driver.c | 73 ++++++++++++++++++++++++++++++++++++++++++++++++++
>  1 file changed, 73 insertions(+)
> 
> diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c
> index 441272d..bcd9c57 100644
> --- a/src/qemu/qemu_driver.c
> +++ b/src/qemu/qemu_driver.c
> @@ -12907,6 +12907,78 @@ cleanup:
>      return ret;
>  }
>  
> +static int
> +qemuDomainOpenChannel(virDomainPtr dom,
> +                      const char *name,
> +                      virStreamPtr st,
> +                      unsigned int flags)
> +{
> +    virDomainObjPtr vm = NULL;
> +    int ret = -1;
> +    int i;
> +    virDomainChrDefPtr chr = NULL;
> +    qemuDomainObjPrivatePtr priv;
> +
> +    virCheckFlags(VIR_DOMAIN_CHANNEL_FORCE, -1);
> +
> +    if (!(vm = qemuDomObjFromDomain(dom)))
> +        goto cleanup;
> +
> +    if (!virDomainObjIsActive(vm)) {
> +        virReportError(VIR_ERR_OPERATION_INVALID,
> +                       "%s", _("domain is not running"));
> +        goto cleanup;
> +    }
> +
> +    priv = vm->privateData;
> +
> +    if (name) {
> +        for (i = 0 ; !chr && i < vm->def->nchannels ; i++) {
> +            if (STREQ(name, vm->def->channels[i]->info.alias))
> +                chr = vm->def->channels[i];
> +
> +            if (vm->def->channels[i]->targetType == \
> +                VIR_DOMAIN_CHR_CHANNEL_TARGET_TYPE_VIRTIO &&
> +                STREQ(name, vm->def->channels[i]->target.name))
> +                chr = vm->def->channels[i];
> +        }
> +    } else {
> +        if (vm->def->nchannels)
> +            chr = vm->def->channels[0];
> +    }
> +
> +    if (!chr) {
> +        virReportError(VIR_ERR_INTERNAL_ERROR,
> +                       _("cannot find channel %s"),
> +                       NULLSTR(name));
> +        goto cleanup;
> +    }
> +
> +    if (chr->source.type != VIR_DOMAIN_CHR_TYPE_UNIX) {
> +        virReportError(VIR_ERR_INTERNAL_ERROR,
> +                       _("channel %s is not using a UNIX socket"),
> +                       NULLSTR(name));
> +        goto cleanup;
> +    }
> +
> +    /* handle mutually exclusive access to channel devices */
> +    ret = virChrdevOpen(priv->devs,
> +                        &chr->source,
> +                        st,
> +                        (flags & VIR_DOMAIN_CHANNEL_FORCE) != 0);
> +
> +    if (ret == 1) {
> +        virReportError(VIR_ERR_OPERATION_FAILED, "%s",
> +                       _("Active channel stream exists for this domain"));
> +        ret = -1;
> +    }
> +
> +cleanup:
> +    if (vm)
> +        virDomainObjUnlock(vm);
> +    return ret;
> +}
> +
>  static char *
>  qemuDiskPathToAlias(virDomainObjPtr vm, const char *path, int *idx)
>  {
> @@ -15062,6 +15134,7 @@ static virDriver qemuDriver = {
>      .nodeSetMemoryParameters = nodeSetMemoryParameters, /* 0.10.2 */
>      .nodeGetCPUMap = nodeGetCPUMap, /* 1.0.0 */
>      .domainFSTrim = qemuDomainFSTrim, /* 1.0.1 */
> +    .domainOpenChannel = qemuDomainOpenChannel, /* 1.0.1 */

s/1.0.1/1.0.2/


ACK

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