diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c index 625d955275..0553cb7fa0 100644 --- a/src/qemu/qemu_command.c +++ b/src/qemu/qemu_command.c @@ -5490,12 +5490,15 @@ qemuBuildRNGBackendChrdevStr(virLogManagerPtr logManager, int qemuBuildRNGBackendProps(virDomainRNGDefPtr rng, virQEMUCapsPtr qemuCaps, - const char **type, virJSONValuePtr *props) { + char *objAlias = NULL; char *charBackendAlias = NULL; int ret = -1; + if (virAsprintf(&objAlias, "obj%s", rng->info.alias) < 0) + goto cleanup; + switch ((virDomainRNGBackend) rng->backend) { case VIR_DOMAIN_RNG_BACKEND_RANDOM: if (!virQEMUCapsGet(qemuCaps, QEMU_CAPS_OBJECT_RNG_RANDOM)) { @@ -5505,11 +5508,11 @@ qemuBuildRNGBackendProps(virDomainRNGDefPtr rng, goto cleanup; } - *type = "rng-random"; - - if (virJSONValueObjectCreate(props, "s:filename", rng->source.file, - NULL) < 0) + if (qemuMonitorCreateObjectProps(props, "rng-random", objAlias, + "s:filename", rng->source.file, + NULL) < 0) goto cleanup; + break; case VIR_DOMAIN_RNG_BACKEND_EGD: @@ -5520,13 +5523,12 @@ qemuBuildRNGBackendProps(virDomainRNGDefPtr rng, goto cleanup; } - *type = "rng-egd"; - if (!(charBackendAlias = qemuAliasChardevFromDevAlias(rng->info.alias))) goto cleanup; - if (virJSONValueObjectCreate(props, "s:chardev", charBackendAlias, - NULL) < 0) + if (qemuMonitorCreateObjectProps(props, "rng-egd", objAlias, + "s:chardev", charBackendAlias, + NULL) < 0) goto cleanup; break; @@ -5540,35 +5542,12 @@ qemuBuildRNGBackendProps(virDomainRNGDefPtr rng, ret = 0; cleanup: + VIR_FREE(objAlias); VIR_FREE(charBackendAlias); return ret; } -static char * -qemuBuildRNGBackendStr(virDomainRNGDefPtr rng, - virQEMUCapsPtr qemuCaps) -{ - const char *type = NULL; - char *alias = NULL; - virJSONValuePtr props = NULL; - char *ret = NULL; - - if (virAsprintf(&alias, "obj%s", rng->info.alias) < 0) - goto cleanup; - - if (qemuBuildRNGBackendProps(rng, qemuCaps, &type, &props) < 0) - goto cleanup; - - ret = virQEMUBuildObjectCommandlineFromJSONType(type, alias, props); - - cleanup: - VIR_FREE(alias); - virJSONValueFree(props); - return ret; -} - - char * qemuBuildRNGDevStr(const virDomainDef *def, virDomainRNGDefPtr dev, @@ -5636,8 +5615,11 @@ qemuBuildRNGCommandLine(virLogManagerPtr logManager, size_t i; for (i = 0; i < def->nrngs; i++) { + virJSONValuePtr props; + virBuffer buf = VIR_BUFFER_INITIALIZER; virDomainRNGDefPtr rng = def->rngs[i]; char *tmp; + int rc; if (!rng->info.alias) { virReportError(VIR_ERR_INTERNAL_ERROR, "%s", @@ -5656,12 +5638,17 @@ qemuBuildRNGCommandLine(virLogManagerPtr logManager, VIR_FREE(tmp); } - /* add the RNG source backend */ - if (!(tmp = qemuBuildRNGBackendStr(rng, qemuCaps))) + if (qemuBuildRNGBackendProps(rng, qemuCaps, &props) < 0) return -1; - virCommandAddArgList(cmd, "-object", tmp, NULL); - VIR_FREE(tmp); + rc = virQEMUBuildObjectCommandlineFromJSON(&buf, props); + virJSONValueFree(props); + + if (rc < 0) + return -1; + + virCommandAddArg(cmd, "-object"); + virCommandAddArgBuffer(cmd, &buf); /* add the device */ if (!(tmp = qemuBuildRNGDevStr(def, rng, qemuCaps))) diff --git a/src/qemu/qemu_command.h b/src/qemu/qemu_command.h index 9a7fed2934..b47caf7ec0 100644 --- a/src/qemu/qemu_command.h +++ b/src/qemu/qemu_command.h @@ -142,7 +142,6 @@ char *qemuBuildRNGDevStr(const virDomainDef *def, virQEMUCapsPtr qemuCaps); int qemuBuildRNGBackendProps(virDomainRNGDefPtr rng, virQEMUCapsPtr qemuCaps, - const char **type, virJSONValuePtr *props); int qemuOpenPCIConfig(virDomainHostdevDefPtr dev); diff --git a/src/qemu/qemu_hotplug.c b/src/qemu/qemu_hotplug.c index f8b456cc3a..1027005a65 100644 --- a/src/qemu/qemu_hotplug.c +++ b/src/qemu/qemu_hotplug.c @@ -1979,11 +1979,8 @@ qemuDomainAttachRNGDevice(virQEMUDriverPtr driver, bool teardowncgroup = false; bool teardowndevice = false; bool chardevAdded = false; - bool objAdded = false; virJSONValuePtr props = NULL; - const char *type; int ret = -1; - int rv; if (qemuAssignDeviceRNGAlias(vm->def, rng) < 0) goto cleanup; @@ -2007,10 +2004,7 @@ qemuDomainAttachRNGDevice(virQEMUDriverPtr driver, if (!(devstr = qemuBuildRNGDevStr(vm->def, rng, priv->qemuCaps))) goto cleanup; - if (qemuBuildRNGBackendProps(rng, priv->qemuCaps, &type, &props) < 0) - goto cleanup; - - if (virAsprintf(&objAlias, "obj%s", rng->info.alias) < 0) + if (qemuBuildRNGBackendProps(rng, priv->qemuCaps, &props) < 0) goto cleanup; if (!(charAlias = qemuAliasChardevFromDevAlias(rng->info.alias))) @@ -2032,11 +2026,8 @@ qemuDomainAttachRNGDevice(virQEMUDriverPtr driver, goto exit_monitor; chardevAdded = true; - rv = qemuMonitorAddObjectType(priv->mon, type, objAlias, props); - props = NULL; /* qemuMonitorAddObjectType consumes */ - if (rv < 0) + if (qemuMonitorAddObject(priv->mon, &props, &objAlias) < 0) goto exit_monitor; - objAdded = true; if (qemuMonitorAddDevice(priv->mon, devstr) < 0) goto exit_monitor; @@ -2071,7 +2062,7 @@ qemuDomainAttachRNGDevice(virQEMUDriverPtr driver, exit_monitor: virErrorPreserveLast(&orig_err); - if (objAdded) + if (objAlias) ignore_value(qemuMonitorDelObject(priv->mon, objAlias)); if (rng->backend == VIR_DOMAIN_RNG_BACKEND_EGD && chardevAdded) ignore_value(qemuMonitorDetachCharDev(priv->mon, charAlias));