On 06/06/2013 02:30 PM, Michal Privoznik wrote:
> The chardev alias assignment is going to be needed in a separate
> places, so it should be moved into a separate function rather
> than copying code randomly around.
> ---
> src/qemu/qemu_command.c | 66
> ++++++++++++++++++++++++++++++++++++++++++++++---
> src/qemu/qemu_command.h | 3 +++
> 2 files changed, 65 insertions(+), 4 deletions(-)
>
> diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c
> index c4a162a..39b9d24 100644
> --- a/src/qemu/qemu_command.c
> +++ b/src/qemu/qemu_command.c
> @@ -891,6 +891,64 @@
> qemuAssignDeviceControllerAlias(virDomainControllerDefPtr controller)
> return 0;
> }
>
> +int
> +qemuAssignDeviceChrAlias(virDomainDefPtr def,
> + virDomainChrDefPtr chr,
> + size_t idx)
> +{
> + virDomainChrDefPtr **arrPtr;
> + size_t *cntPtr;
> + const char *prefix;
> +
> + if (virDomainChrGetDomainPtrs(def, chr, &arrPtr, &cntPtr) < 0)
> + return -1;
> +
> + switch ((enum virDomainChrDeviceType) chr->deviceType) {
> + case VIR_DOMAIN_CHR_DEVICE_TYPE_PARALLEL:
> + prefix = "parallel";
> + break;
> +
> + case VIR_DOMAIN_CHR_DEVICE_TYPE_SERIAL:
> + prefix = "serial";
> + break;
> +
> + case VIR_DOMAIN_CHR_DEVICE_TYPE_CONSOLE:
> + prefix = "console";
> + break;
> +
> + case VIR_DOMAIN_CHR_DEVICE_TYPE_CHANNEL:
> + prefix = "channel";
> + break;
> +
> + default:
> + virReportError(VIR_ERR_OPERATION_INVALID,
> + _("Unsupported device type '%d'"),
> + chr->deviceType);
> + return -1;
> + }
If you put _TYPE_LAST here you can drop the error message.
> +
> + if (idx == -1) {
> + size_t i;
> + idx = 0;
> + for (i = 0; i < *cntPtr; i++) {
> + int thisidx;
> + if ((thisidx = qemuDomainDeviceAliasIndex(&(*arrPtr)[i]->info,
> prefix)) < 0) {
> + virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
> + _("Unable to determine device index for
> character device"));
> + return -1;
> + }
> + if (thisidx >= idx)
> + idx = thisidx + 1;
> + }
> + }
> +
> + if (virAsprintf(&chr->info.alias, "%s%zu", prefix, idx) < 0) {
> + virReportOOMError();
> + return -1;
> + }
> +
> + return 0;
> +}
>
> int
> qemuAssignDeviceAliases(virDomainDefPtr def, virQEMUCapsPtr qemuCaps)
> @@ -946,19 +1004,19 @@ qemuAssignDeviceAliases(virDomainDefPtr def,
> virQEMUCapsPtr qemuCaps)
> goto no_memory;
> }
> for (i = 0; i < def->nparallels; i++) {
> - if (virAsprintf(&def->parallels[i]->info.alias, "parallel%d", i) < 0)
> + if (qemuAssignDeviceChrAlias(def, def->parallels[i], i) < 0)
> goto no_memory;
> }
> for (i = 0; i < def->nserials; i++) {
> - if (virAsprintf(&def->serials[i]->info.alias, "serial%d", i) < 0)
> + if (qemuAssignDeviceChrAlias(def, def->serials[i], i) < 0)
> goto no_memory;
> }
> for (i = 0; i < def->nchannels; i++) {
> - if (virAsprintf(&def->channels[i]->info.alias, "channel%d", i) < 0)
> + if (qemuAssignDeviceChrAlias(def, def->channels[i], i) < 0)
> goto no_memory;
> }
> for (i = 0; i < def->nconsoles; i++) {
> - if (virAsprintf(&def->consoles[i]->info.alias, "console%d", i) < 0)
> + if (qemuAssignDeviceChrAlias(def, def->consoles[i], i) < 0)
> goto no_memory;
Double OOM reporting in all four cases.
--
libvir-list mailing list
[email protected]
https://www.redhat.com/mailman/listinfo/libvir-list