vbox: Cleanup vboxDumpDisks implementation

Primer the code for further changes:

* move variable declarations to the top of the function
* group together free/release statements
* error check and report VBOX API calls used
This commit is contained in:
Dawid Zamirski 2017-11-07 13:49:26 -05:00 committed by John Ferlan
parent a4919338ba
commit 08b995c8d0

View File

@ -3186,6 +3186,16 @@ vboxDumpDisks(virDomainDefPtr def, vboxDriverPtr data, IMachine *machine)
{ {
vboxArray mediumAttachments = VBOX_ARRAY_INITIALIZER; vboxArray mediumAttachments = VBOX_ARRAY_INITIALIZER;
int ret = -1, diskCount = 0; int ret = -1, diskCount = 0;
IMediumAttachment *mediumAttachment = NULL;
IMedium *medium = NULL;
IStorageController *controller = NULL;
PRUnichar *controllerName = NULL, *mediumLocUtf16 = NULL;
PRUint32 deviceType, storageBus;
PRInt32 devicePort, deviceSlot;
PRBool readOnly;
nsresult rc;
virDomainDiskDefPtr disk = NULL;
char *mediumLocUtf8 = NULL;
size_t sdCount = 0, i; size_t sdCount = 0, i;
def->ndisks = 0; def->ndisks = 0;
@ -3194,15 +3204,14 @@ vboxDumpDisks(virDomainDefPtr def, vboxDriverPtr data, IMachine *machine)
/* get the number of attachments */ /* get the number of attachments */
for (i = 0; i < mediumAttachments.count; i++) { for (i = 0; i < mediumAttachments.count; i++) {
IMediumAttachment *imediumattach = mediumAttachments.items[i]; mediumAttachment = mediumAttachments.items[i];
if (imediumattach) { if (!mediumAttachment)
IMedium *medium = NULL; continue;
gVBoxAPI.UIMediumAttachment.GetMedium(imediumattach, &medium); gVBoxAPI.UIMediumAttachment.GetMedium(mediumAttachment, &medium);
if (medium) { if (medium) {
def->ndisks++; def->ndisks++;
VBOX_RELEASE(medium); VBOX_RELEASE(medium);
}
} }
} }
@ -3211,7 +3220,7 @@ vboxDumpDisks(virDomainDefPtr def, vboxDriverPtr data, IMachine *machine)
goto cleanup; goto cleanup;
for (i = 0; i < def->ndisks; i++) { for (i = 0; i < def->ndisks; i++) {
virDomainDiskDefPtr disk = virDomainDiskDefNew(NULL); disk = virDomainDiskDefNew(NULL);
if (!disk) if (!disk)
goto cleanup; goto cleanup;
@ -3220,103 +3229,140 @@ vboxDumpDisks(virDomainDefPtr def, vboxDriverPtr data, IMachine *machine)
/* get the attachment details here */ /* get the attachment details here */
for (i = 0; i < mediumAttachments.count && diskCount < def->ndisks; i++) { for (i = 0; i < mediumAttachments.count && diskCount < def->ndisks; i++) {
IMediumAttachment *imediumattach = mediumAttachments.items[i]; mediumAttachment = mediumAttachments.items[i];
IStorageController *storageController = NULL; controller = NULL;
PRUnichar *storageControllerName = NULL; controllerName = NULL;
PRUint32 deviceType = DeviceType_Null; deviceType = DeviceType_Null;
PRUint32 storageBus = StorageBus_Null; storageBus = StorageBus_Null;
PRBool readOnly = PR_FALSE; readOnly = PR_FALSE;
IMedium *medium = NULL; medium = NULL;
PRUnichar *mediumLocUtf16 = NULL; mediumLocUtf16 = NULL;
char *mediumLocUtf8 = NULL; mediumLocUtf8 = NULL;
PRInt32 devicePort = 0; devicePort = 0;
PRInt32 deviceSlot = 0; deviceSlot = 0;
disk = def->disks[diskCount];
if (!imediumattach) if (!mediumAttachment)
continue; continue;
gVBoxAPI.UIMediumAttachment.GetMedium(imediumattach, &medium); rc = gVBoxAPI.UIMediumAttachment.GetMedium(mediumAttachment, &medium);
if (!medium) if (NS_FAILED(rc)) {
continue; virReportError(VIR_ERR_INTERNAL_ERROR,
_("Could not get IMedium, rc=%08x"), rc);
gVBoxAPI.UIMediumAttachment.GetController(imediumattach, &storageControllerName);
if (!storageControllerName) {
VBOX_RELEASE(medium);
continue;
}
gVBoxAPI.UIMachine.GetStorageControllerByName(machine,
storageControllerName,
&storageController);
VBOX_UTF16_FREE(storageControllerName);
if (!storageController) {
VBOX_RELEASE(medium);
continue;
}
gVBoxAPI.UIMedium.GetLocation(medium, &mediumLocUtf16);
VBOX_UTF16_TO_UTF8(mediumLocUtf16, &mediumLocUtf8);
VBOX_UTF16_FREE(mediumLocUtf16);
ignore_value(virDomainDiskSetSource(def->disks[diskCount],
mediumLocUtf8));
VBOX_UTF8_FREE(mediumLocUtf8);
if (!virDomainDiskGetSource(def->disks[diskCount])) {
VBOX_RELEASE(medium);
VBOX_RELEASE(storageController);
goto cleanup; goto cleanup;
} }
gVBoxAPI.UIStorageController.GetBus(storageController, &storageBus); if (!medium)
gVBoxAPI.UIMediumAttachment.GetPort(imediumattach, &devicePort); continue;
gVBoxAPI.UIMediumAttachment.GetDevice(imediumattach, &deviceSlot);
def->disks[diskCount]->dst = vboxGenerateMediumName(storageBus, rc = gVBoxAPI.UIMediumAttachment.GetController(mediumAttachment,
devicePort, &controllerName);
deviceSlot, if (NS_FAILED(rc)) {
sdCount); virReportError(VIR_ERR_INTERNAL_ERROR,
if (!def->disks[diskCount]->dst) { _("Failed to get storage controller name, rc=%08x"),
rc);
goto cleanup;
}
rc = gVBoxAPI.UIMachine.GetStorageControllerByName(machine,
controllerName,
&controller);
if (NS_FAILED(rc)) {
virReportError(VIR_ERR_INTERNAL_ERROR,
_("Could not get storage controller by name, rc=%08x"),
rc);
goto cleanup;
}
rc = gVBoxAPI.UIMedium.GetLocation(medium, &mediumLocUtf16);
if (NS_FAILED(rc)) {
virReportError(VIR_ERR_INTERNAL_ERROR,
_("Could not get medium storage location, rc=%08x"),
rc);
goto cleanup;
}
VBOX_UTF16_TO_UTF8(mediumLocUtf16, &mediumLocUtf8);
if (virDomainDiskSetSource(disk, mediumLocUtf8) < 0) {
virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
_("Could not set disk source"));
goto cleanup;
}
rc = gVBoxAPI.UIMediumAttachment.GetType(mediumAttachment, &deviceType);
if (NS_FAILED(rc)) {
virReportError(VIR_ERR_INTERNAL_ERROR,
_("Could not get device type, rc=%08x"), rc);
goto cleanup;
}
rc = gVBoxAPI.UIMediumAttachment.GetPort(mediumAttachment, &devicePort);
if (NS_FAILED(rc)) {
virReportError(VIR_ERR_INTERNAL_ERROR,
_("Could not get device port, rc=%08x"), rc);
goto cleanup;
}
rc = gVBoxAPI.UIMediumAttachment.GetDevice(mediumAttachment, &deviceSlot);
if (NS_FAILED(rc)) {
virReportError(VIR_ERR_INTERNAL_ERROR,
_("Could not get device slot, rc=%08x"), rc);
goto cleanup;
}
rc = gVBoxAPI.UIStorageController.GetBus(controller, &storageBus);
if (NS_FAILED(rc)) {
virReportError(VIR_ERR_INTERNAL_ERROR,
_("Could not get storage controller bus, rc=%08x"),
rc);
goto cleanup;
}
rc = gVBoxAPI.UIMedium.GetReadOnly(medium, &readOnly);
if (NS_FAILED(rc)) {
virReportError(VIR_ERR_INTERNAL_ERROR,
_("Could not get read only state, rc=%08x"), rc);
goto cleanup;
}
disk->dst = vboxGenerateMediumName(storageBus, devicePort, deviceSlot,
sdCount);
if (!disk->dst) {
virReportError(VIR_ERR_INTERNAL_ERROR, virReportError(VIR_ERR_INTERNAL_ERROR,
_("Could not generate medium name for the disk " _("Could not generate medium name for the disk "
"at: port:%d, slot:%d"), devicePort, deviceSlot); "at: port:%d, slot:%d"), devicePort, deviceSlot);
VBOX_RELEASE(medium);
VBOX_RELEASE(storageController);
goto cleanup; goto cleanup;
} }
if (storageBus == StorageBus_IDE) { if (storageBus == StorageBus_IDE) {
def->disks[diskCount]->bus = VIR_DOMAIN_DISK_BUS_IDE; disk->bus = VIR_DOMAIN_DISK_BUS_IDE;
} else if (storageBus == StorageBus_SATA) { } else if (storageBus == StorageBus_SATA) {
sdCount++; sdCount++;
def->disks[diskCount]->bus = VIR_DOMAIN_DISK_BUS_SATA; disk->bus = VIR_DOMAIN_DISK_BUS_SATA;
} else if (storageBus == StorageBus_SCSI) { } else if (storageBus == StorageBus_SCSI) {
sdCount++; sdCount++;
def->disks[diskCount]->bus = VIR_DOMAIN_DISK_BUS_SCSI; disk->bus = VIR_DOMAIN_DISK_BUS_SCSI;
} else if (storageBus == StorageBus_Floppy) { } else if (storageBus == StorageBus_Floppy) {
def->disks[diskCount]->bus = VIR_DOMAIN_DISK_BUS_FDC; disk->bus = VIR_DOMAIN_DISK_BUS_FDC;
} }
gVBoxAPI.UIMediumAttachment.GetType(imediumattach, &deviceType);
if (deviceType == DeviceType_HardDisk) if (deviceType == DeviceType_HardDisk)
def->disks[diskCount]->device = VIR_DOMAIN_DISK_DEVICE_DISK; disk->device = VIR_DOMAIN_DISK_DEVICE_DISK;
else if (deviceType == DeviceType_Floppy) else if (deviceType == DeviceType_Floppy)
def->disks[diskCount]->device = VIR_DOMAIN_DISK_DEVICE_FLOPPY; disk->device = VIR_DOMAIN_DISK_DEVICE_FLOPPY;
else if (deviceType == DeviceType_DVD) else if (deviceType == DeviceType_DVD)
def->disks[diskCount]->device = VIR_DOMAIN_DISK_DEVICE_CDROM; disk->device = VIR_DOMAIN_DISK_DEVICE_CDROM;
gVBoxAPI.UIMedium.GetReadOnly(medium, &readOnly);
if (readOnly == PR_TRUE) if (readOnly == PR_TRUE)
def->disks[diskCount]->src->readonly = true; disk->src->readonly = true;
virDomainDiskSetType(def->disks[diskCount], virDomainDiskSetType(disk, VIR_STORAGE_TYPE_FILE);
VIR_STORAGE_TYPE_FILE);
VBOX_RELEASE(medium);
VBOX_RELEASE(storageController);
diskCount++; diskCount++;
VBOX_UTF16_FREE(controllerName);
VBOX_UTF8_FREE(mediumLocUtf8);
VBOX_UTF16_FREE(mediumLocUtf16);
VBOX_RELEASE(medium);
VBOX_RELEASE(controller);
} }
ret = 0; ret = 0;
@ -3324,6 +3370,14 @@ vboxDumpDisks(virDomainDefPtr def, vboxDriverPtr data, IMachine *machine)
cleanup: cleanup:
gVBoxAPI.UArray.vboxArrayRelease(&mediumAttachments); gVBoxAPI.UArray.vboxArrayRelease(&mediumAttachments);
if (ret < 0) {
VBOX_UTF16_FREE(controllerName);
VBOX_UTF8_FREE(mediumLocUtf8);
VBOX_UTF16_FREE(mediumLocUtf16);
VBOX_RELEASE(medium);
VBOX_RELEASE(controller);
}
return ret; return ret;
} }