{
virQEMUDriverConfigPtr cfg = virQEMUDriverGetConfig(driver);
virDomainChrDeviceState newstate;
+ virObjectEventPtr event = NULL;
virDomainDeviceDef dev;
if (connected)
dev.data.chr->targetType != VIR_DOMAIN_CHR_CHANNEL_TARGET_TYPE_VIRTIO)
goto endjob;
+ if (STREQ_NULLABLE(dev.data.chr->target.name, "org.qemu.guest_agent.0") &&
+ (event = virDomainEventAgentLifecycleNewFromObj(vm, newstate,
+ VIR_CONNECT_DOMAIN_EVENT_AGENT_LIFECYCLE_REASON_CHANNEL)))
+ qemuDomainEventQueue(driver, event);
+
dev.data.chr->state = newstate;
if (virDomainSaveStatus(driver->xmlopt, cfg->stateDir, vm) < 0)
static int
-qemuProcessRefreshChannelVirtioState(virDomainObjPtr vm,
- virHashTablePtr info)
+qemuProcessRefreshChannelVirtioState(virQEMUDriverPtr driver,
+ virDomainObjPtr vm,
+ virHashTablePtr info,
+ int booted)
{
size_t i;
+ int agentReason = VIR_CONNECT_DOMAIN_EVENT_AGENT_LIFECYCLE_REASON_CHANNEL;
qemuMonitorChardevInfoPtr entry;
+ virObjectEventPtr event = NULL;
char id[32];
+ if (booted)
+ agentReason = VIR_CONNECT_DOMAIN_EVENT_AGENT_LIFECYCLE_REASON_DOMAIN_STARTED;
+
for (i = 0; i < vm->def->nchannels; i++) {
virDomainChrDefPtr chr = vm->def->channels[i];
if (chr->targetType == VIR_DOMAIN_CHR_CHANNEL_TARGET_TYPE_VIRTIO) {
!entry->state)
continue;
+ if (entry->state != VIR_DOMAIN_CHR_DEVICE_STATE_DEFAULT &&
+ STREQ_NULLABLE(chr->target.name, "org.qemu.guest_agent.0") &&
+ (event = virDomainEventAgentLifecycleNewFromObj(vm, entry->state,
+ agentReason)))
+ qemuDomainEventQueue(driver, event);
+
chr->state = entry->state;
}
}
if (ret < 0)
goto cleanup;
- ret = qemuProcessRefreshChannelVirtioState(vm, info);
+ ret = qemuProcessRefreshChannelVirtioState(driver, vm, info, false);
cleanup:
virHashFree(info);
info)) < 0)
goto cleanup;
- if ((ret = qemuProcessRefreshChannelVirtioState(vm, info)) < 0)
+ if ((ret = qemuProcessRefreshChannelVirtioState(driver, vm, info,
+ true)) < 0)
goto cleanup;
}