mirror of
https://gitlab.com/libvirt/libvirt.git
synced 2025-03-07 17:28:15 +00:00
qemu: Implement virDomainOpenChannel API
This commit is contained in:
parent
66a0664974
commit
346e43ecfd
@ -12593,6 +12593,78 @@ cleanup:
|
|||||||
return ret;
|
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 *
|
static char *
|
||||||
qemuDiskPathToAlias(virDomainObjPtr vm, const char *path, int *idx)
|
qemuDiskPathToAlias(virDomainObjPtr vm, const char *path, int *idx)
|
||||||
{
|
{
|
||||||
@ -14694,6 +14766,7 @@ static virDriver qemuDriver = {
|
|||||||
.nodeSetMemoryParameters = nodeSetMemoryParameters, /* 0.10.2 */
|
.nodeSetMemoryParameters = nodeSetMemoryParameters, /* 0.10.2 */
|
||||||
.nodeGetCPUMap = nodeGetCPUMap, /* 1.0.0 */
|
.nodeGetCPUMap = nodeGetCPUMap, /* 1.0.0 */
|
||||||
.domainFSTrim = qemuDomainFSTrim, /* 1.0.1 */
|
.domainFSTrim = qemuDomainFSTrim, /* 1.0.1 */
|
||||||
|
.domainOpenChannel = qemuDomainOpenChannel, /* 1.0.2 */
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user