"virtio-rng",
"rng-random", /* 130 */
+ "rng-egd",
);
struct _virQEMUCaps {
{ "usb-net", QEMU_CAPS_DEVICE_USB_NET},
{ "virtio-rng-pci", QEMU_CAPS_DEVICE_VIRTIO_RNG },
{ "rng-random", QEMU_CAPS_OBJECT_RNG_RANDOM },
+ { "rng-egd", QEMU_CAPS_OBJECT_RNG_EGD },
};
QEMU_CAPS_DEVICE_VIRTIO_RNG = 129, /* virtio-rng device */
QEMU_CAPS_OBJECT_RNG_RANDOM = 130, /* the rng-random backend for
virtio rng */
+ QEMU_CAPS_OBJECT_RNG_EGD = 131, /* EGD protocol daemon for rng */
QEMU_CAPS_LAST, /* this must always be the last item */
};
virQEMUCapsPtr qemuCaps)
{
virBuffer buf = VIR_BUFFER_INITIALIZER;
+ char *backend = NULL;
int ret = -1;
switch ((enum virDomainRNGBackend) dev->backend) {
break;
case VIR_DOMAIN_RNG_BACKEND_EGD:
- virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
- _("egd RNG backend not yet implemented"));
- goto cleanup;
+
+ if (!virQEMUCapsGet(qemuCaps, QEMU_CAPS_OBJECT_RNG_EGD)) {
+ virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
+ _("this qemu doesn't support the rng-egd "
+ "backend"));
+ goto cleanup;
+ }
+
+ if (!(backend = qemuBuildChrChardevStr(dev->source.chardev,
+ dev->info.alias, qemuCaps)))
+ goto cleanup;
+
+ virCommandAddArgList(cmd, "-chardev", backend, NULL);
+
+ virCommandAddArg(cmd, "-object");
+ virCommandAddArgFormat(cmd, "rng-egd,chardev=char%s,id=%s",
+ dev->info.alias, dev->info.alias);
break;
case VIR_DOMAIN_RNG_BACKEND_LAST:
cleanup:
virBufferFreeAndReset(&buf);
+ VIR_FREE(backend);
return ret;
}