mirror of
https://github.com/libvirt/libvirt.git
synced 2025-02-25 18:55:26 -06:00
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:
parent
a4919338ba
commit
08b995c8d0
@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user