}
}
-#if VBOX_API_VERSION < 3001000
-
-static void
-_vboxAttachDrivesOld(virDomainDefPtr def, vboxDriverPtr data, IMachine *machine)
-{
- size_t i;
- nsresult rc;
-
- if (def->ndisks == 0)
- return;
-
- for (i = 0; i < def->ndisks; i++) {
- const char *src = virDomainDiskGetSource(def->disks[i]);
- int type = virDomainDiskGetType(def->disks[i]);
- int format = virDomainDiskGetFormat(def->disks[i]);
-
- VIR_DEBUG("disk(%zu) type: %d", i, type);
- VIR_DEBUG("disk(%zu) device: %d", i, def->disks[i]->device);
- VIR_DEBUG("disk(%zu) bus: %d", i, def->disks[i]->bus);
- VIR_DEBUG("disk(%zu) src: %s", i, src);
- VIR_DEBUG("disk(%zu) dst: %s", i, def->disks[i]->dst);
- VIR_DEBUG("disk(%zu) driverName: %s", i,
- virDomainDiskGetDriver(def->disks[i]));
- VIR_DEBUG("disk(%zu) driverType: %s", i,
- virStorageFileFormatTypeToString(format));
- VIR_DEBUG("disk(%zu) cachemode: %d", i, def->disks[i]->cachemode);
- VIR_DEBUG("disk(%zu) readonly: %s", i, (def->disks[i]->src->readonly
- ? "True" : "False"));
- VIR_DEBUG("disk(%zu) shared: %s", i, (def->disks[i]->src->shared
- ? "True" : "False"));
-
- if (def->disks[i]->device == VIR_DOMAIN_DISK_DEVICE_CDROM) {
- if (type == VIR_STORAGE_TYPE_FILE && src) {
- IDVDDrive *dvdDrive = NULL;
- /* Currently CDROM/DVD Drive is always IDE
- * Secondary Master so neglecting the following
- * parameters:
- * def->disks[i]->bus
- * def->disks[i]->dst
- */
-
- machine->vtbl->GetDVDDrive(machine, &dvdDrive);
- if (dvdDrive) {
- IDVDImage *dvdImage = NULL;
- PRUnichar *dvdfileUtf16 = NULL;
- vboxIID dvduuid = VBOX_IID_INITIALIZER;
- vboxIID dvdemptyuuid = VBOX_IID_INITIALIZER;
-
- VBOX_UTF8_TO_UTF16(src, &dvdfileUtf16);
-
- data->vboxObj->vtbl->FindDVDImage(data->vboxObj,
- dvdfileUtf16, &dvdImage);
- if (!dvdImage) {
- data->vboxObj->vtbl->OpenDVDImage(data->vboxObj,
- dvdfileUtf16,
- dvdemptyuuid.value,
- &dvdImage);
- }
- if (dvdImage) {
- rc = dvdImage->vtbl->imedium.GetId((IMedium *)dvdImage,
- &dvduuid.value);
- if (NS_FAILED(rc)) {
- virReportError(VIR_ERR_INTERNAL_ERROR,
- _("can't get the uuid of the file to "
- "be attached to cdrom: %s, rc=%08x"),
- src, (unsigned)rc);
- } else {
- rc = dvdDrive->vtbl->MountImage(dvdDrive, dvduuid.value);
- if (NS_FAILED(rc)) {
- virReportError(VIR_ERR_INTERNAL_ERROR,
- _("could not attach the file to cdrom: %s, rc=%08x"),
- src, (unsigned)rc);
- } else {
- DEBUGIID("CD/DVDImage UUID:", dvduuid.value);
- }
- }
-
- VBOX_MEDIUM_RELEASE(dvdImage);
- }
- vboxIIDUnalloc(&dvduuid);
- VBOX_UTF16_FREE(dvdfileUtf16);
- VBOX_RELEASE(dvdDrive);
- }
- } else if (type == VIR_STORAGE_TYPE_BLOCK) {
- }
- } else if (def->disks[i]->device == VIR_DOMAIN_DISK_DEVICE_DISK) {
- if (type == VIR_STORAGE_TYPE_FILE && src) {
- IHardDisk *hardDisk = NULL;
- PRUnichar *hddfileUtf16 = NULL;
- vboxIID hdduuid = VBOX_IID_INITIALIZER;
- PRUnichar *hddEmpty = NULL;
- /* Current Limitation: Harddisk can't be connected to
- * Secondary Master as Secondary Master is always used
- * for CD/DVD Drive, so don't connect the harddisk if it
- * is requested to be connected to Secondary master
- */
-
- VBOX_UTF8_TO_UTF16(src, &hddfileUtf16);
- VBOX_UTF8_TO_UTF16("", &hddEmpty);
-
- data->vboxObj->vtbl->FindHardDisk(data->vboxObj, hddfileUtf16,
- &hardDisk);
-
- if (!hardDisk) {
-# if VBOX_API_VERSION == 2002000
- data->vboxObj->vtbl->OpenHardDisk(data->vboxObj,
- hddfileUtf16,
- AccessMode_ReadWrite,
- &hardDisk);
-# else
- data->vboxObj->vtbl->OpenHardDisk(data->vboxObj,
- hddfileUtf16,
- AccessMode_ReadWrite,
- 0,
- hddEmpty,
- 0,
- hddEmpty,
- &hardDisk);
-# endif
- }
-
- if (hardDisk) {
- rc = hardDisk->vtbl->imedium.GetId((IMedium *)hardDisk,
- &hdduuid.value);
- if (NS_FAILED(rc)) {
- virReportError(VIR_ERR_INTERNAL_ERROR,
- _("can't get the uuid of the file to be "
- "attached as harddisk: %s, rc=%08x"),
- src, (unsigned)rc);
- } else {
- if (def->disks[i]->src->readonly) {
- hardDisk->vtbl->SetType(hardDisk,
- HardDiskType_Immutable);
- VIR_DEBUG("setting harddisk to readonly");
- } else if (!def->disks[i]->src->readonly) {
- hardDisk->vtbl->SetType(hardDisk,
- HardDiskType_Normal);
- VIR_DEBUG("setting harddisk type to normal");
- }
- if (def->disks[i]->bus == VIR_DOMAIN_DISK_BUS_IDE) {
- if (STREQ(def->disks[i]->dst, "hdc")) {
- VIR_DEBUG("Not connecting harddisk to hdc as hdc"
- " is taken by CD/DVD Drive");
- } else {
- PRInt32 channel = 0;
- PRInt32 device = 0;
- PRUnichar *hddcnameUtf16 = NULL;
-
- char *hddcname;
- ignore_value(VIR_STRDUP(hddcname, "IDE"));
- VBOX_UTF8_TO_UTF16(hddcname, &hddcnameUtf16);
- VIR_FREE(hddcname);
-
- if (STREQ(def->disks[i]->dst, "hda")) {
- channel = 0;
- device = 0;
- } else if (STREQ(def->disks[i]->dst, "hdb")) {
- channel = 0;
- device = 1;
- } else if (STREQ(def->disks[i]->dst, "hdd")) {
- channel = 1;
- device = 1;
- }
-
- rc = machine->vtbl->AttachHardDisk(machine,
- hdduuid.value,
- hddcnameUtf16,
- channel,
- device);
- VBOX_UTF16_FREE(hddcnameUtf16);
-
- if (NS_FAILED(rc)) {
- virReportError(VIR_ERR_INTERNAL_ERROR,
- _("could not attach the file as "
- "harddisk: %s, rc=%08x"),
- src, (unsigned)rc);
- } else {
- DEBUGIID("Attached HDD with UUID", hdduuid.value);
- }
- }
- }
- }
- VBOX_MEDIUM_RELEASE(hardDisk);
- }
- vboxIIDUnalloc(&hdduuid);
- VBOX_UTF16_FREE(hddEmpty);
- VBOX_UTF16_FREE(hddfileUtf16);
- } else if (type == VIR_STORAGE_TYPE_BLOCK) {
- }
- } else if (def->disks[i]->device == VIR_DOMAIN_DISK_DEVICE_FLOPPY) {
- if (type == VIR_STORAGE_TYPE_FILE && src) {
- IFloppyDrive *floppyDrive;
- machine->vtbl->GetFloppyDrive(machine, &floppyDrive);
- if (floppyDrive) {
- rc = floppyDrive->vtbl->SetEnabled(floppyDrive, 1);
- if (NS_SUCCEEDED(rc)) {
- IFloppyImage *floppyImage = NULL;
- PRUnichar *fdfileUtf16 = NULL;
- vboxIID fduuid = VBOX_IID_INITIALIZER;
- vboxIID fdemptyuuid = VBOX_IID_INITIALIZER;
-
- VBOX_UTF8_TO_UTF16(src, &fdfileUtf16);
- rc = data->vboxObj->vtbl->FindFloppyImage(data->vboxObj,
- fdfileUtf16,
- &floppyImage);
-
- if (!floppyImage) {
- data->vboxObj->vtbl->OpenFloppyImage(data->vboxObj,
- fdfileUtf16,
- fdemptyuuid.value,
- &floppyImage);
- }
-
- if (floppyImage) {
- rc = floppyImage->vtbl->imedium.GetId((IMedium *)floppyImage,
- &fduuid.value);
- if (NS_FAILED(rc)) {
- virReportError(VIR_ERR_INTERNAL_ERROR,
- _("can't get the uuid of the file to "
- "be attached to floppy drive: %s, rc=%08x"),
- src, (unsigned)rc);
- } else {
- rc = floppyDrive->vtbl->MountImage(floppyDrive,
- fduuid.value);
- if (NS_FAILED(rc)) {
- virReportError(VIR_ERR_INTERNAL_ERROR,
- _("could not attach the file to "
- "floppy drive: %s, rc=%08x"),
- src, (unsigned)rc);
- } else {
- DEBUGIID("floppyImage UUID", fduuid.value);
- }
- }
- VBOX_MEDIUM_RELEASE(floppyImage);
- }
- vboxIIDUnalloc(&fduuid);
- VBOX_UTF16_FREE(fdfileUtf16);
- }
- VBOX_RELEASE(floppyDrive);
- }
- } else if (type == VIR_STORAGE_TYPE_BLOCK) {
- }
- }
- }
-}
-
-#elif VBOX_API_VERSION < 4000000
-
-static void
-_vboxAttachDrivesOld(virDomainDefPtr def, vboxDriverPtr data, IMachine *machine)
-{
- size_t i;
- nsresult rc = 0;
-
- PRUint32 maxPortPerInst[StorageBus_Floppy + 1] = {};
- PRUint32 maxSlotPerPort[StorageBus_Floppy + 1] = {};
- PRUnichar *storageCtlName = NULL;
- bool error = false;
-
- /* get the max port/slots/etc for the given storage bus */
- error = !vboxGetMaxPortSlotValues(data->vboxObj, maxPortPerInst,
- maxSlotPerPort);
-
- /* add a storage controller for the mediums to be attached */
- /* this needs to change when multiple controller are supported for
- * ver > 3.1 */
- {
- IStorageController *storageCtl = NULL;
- PRUnichar *sName = NULL;
-
- VBOX_UTF8_TO_UTF16("IDE Controller", &sName);
- machine->vtbl->AddStorageController(machine,
- sName,
- StorageBus_IDE,
- &storageCtl);
- VBOX_UTF16_FREE(sName);
- VBOX_RELEASE(storageCtl);
-
- VBOX_UTF8_TO_UTF16("SATA Controller", &sName);
- machine->vtbl->AddStorageController(machine,
- sName,
- StorageBus_SATA,
- &storageCtl);
- VBOX_UTF16_FREE(sName);
- VBOX_RELEASE(storageCtl);
-
- VBOX_UTF8_TO_UTF16("SCSI Controller", &sName);
- machine->vtbl->AddStorageController(machine,
- sName,
- StorageBus_SCSI,
- &storageCtl);
- VBOX_UTF16_FREE(sName);
- VBOX_RELEASE(storageCtl);
-
- VBOX_UTF8_TO_UTF16("Floppy Controller", &sName);
- machine->vtbl->AddStorageController(machine,
- sName,
- StorageBus_Floppy,
- &storageCtl);
- VBOX_UTF16_FREE(sName);
- VBOX_RELEASE(storageCtl);
- }
-
- for (i = 0; i < def->ndisks && !error; i++) {
- const char *src = virDomainDiskGetSource(def->disks[i]);
- int type = virDomainDiskGetType(def->disks[i]);
- int format = virDomainDiskGetFormat(def->disks[i]);
-
- VIR_DEBUG("disk(%zu) type: %d", i, type);
- VIR_DEBUG("disk(%zu) device: %d", i, def->disks[i]->device);
- VIR_DEBUG("disk(%zu) bus: %d", i, def->disks[i]->bus);
- VIR_DEBUG("disk(%zu) src: %s", i, src);
- VIR_DEBUG("disk(%zu) dst: %s", i, def->disks[i]->dst);
- VIR_DEBUG("disk(%zu) driverName: %s", i,
- virDomainDiskGetDriver(def->disks[i]));
- VIR_DEBUG("disk(%zu) driverType: %s", i,
- virStorageFileFormatTypeToString(format));
- VIR_DEBUG("disk(%zu) cachemode: %d", i, def->disks[i]->cachemode);
- VIR_DEBUG("disk(%zu) readonly: %s", i, (def->disks[i]->src->readonly
- ? "True" : "False"));
- VIR_DEBUG("disk(%zu) shared: %s", i, (def->disks[i]->src->shared
- ? "True" : "False"));
-
- if (type == VIR_STORAGE_TYPE_FILE && src) {
- IMedium *medium = NULL;
- PRUnichar *mediumUUID = NULL;
- PRUnichar *mediumFileUtf16 = NULL;
- PRUint32 storageBus = StorageBus_Null;
- PRUint32 deviceType = DeviceType_Null;
- PRInt32 deviceInst = 0;
- PRInt32 devicePort = 0;
- PRInt32 deviceSlot = 0;
-
- VBOX_UTF8_TO_UTF16(src, &mediumFileUtf16);
-
- if (def->disks[i]->device == VIR_DOMAIN_DISK_DEVICE_DISK) {
- deviceType = DeviceType_HardDisk;
- data->vboxObj->vtbl->FindHardDisk(data->vboxObj,
- mediumFileUtf16, &medium);
- } else if (def->disks[i]->device == VIR_DOMAIN_DISK_DEVICE_CDROM) {
- deviceType = DeviceType_DVD;
- data->vboxObj->vtbl->FindDVDImage(data->vboxObj,
- mediumFileUtf16, &medium);
- } else if (def->disks[i]->device == VIR_DOMAIN_DISK_DEVICE_FLOPPY) {
- deviceType = DeviceType_Floppy;
- data->vboxObj->vtbl->FindFloppyImage(data->vboxObj,
- mediumFileUtf16, &medium);
- } else {
- VBOX_UTF16_FREE(mediumFileUtf16);
- continue;
- }
-
- if (!medium) {
- PRUnichar *mediumEmpty = NULL;
-
- VBOX_UTF8_TO_UTF16("", &mediumEmpty);
-
- if (def->disks[i]->device == VIR_DOMAIN_DISK_DEVICE_DISK) {
- rc = data->vboxObj->vtbl->OpenHardDisk(data->vboxObj,
- mediumFileUtf16,
- AccessMode_ReadWrite,
- false,
- mediumEmpty,
- false,
- mediumEmpty,
- &medium);
- } else if (def->disks[i]->device ==
- VIR_DOMAIN_DISK_DEVICE_CDROM) {
- rc = data->vboxObj->vtbl->OpenDVDImage(data->vboxObj,
- mediumFileUtf16,
- mediumEmpty,
- &medium);
- } else if (def->disks[i]->device ==
- VIR_DOMAIN_DISK_DEVICE_FLOPPY) {
- rc = data->vboxObj->vtbl->OpenFloppyImage(data->vboxObj,
- mediumFileUtf16,
- mediumEmpty,
- &medium);
- } else {
- rc = 0;
- }
- VBOX_UTF16_FREE(mediumEmpty);
- }
-
- if (!medium) {
- virReportError(VIR_ERR_INTERNAL_ERROR,
- _("Failed to attach the following disk/dvd/floppy "
- "to the machine: %s, rc=%08x"),
- src, (unsigned)rc);
- VBOX_UTF16_FREE(mediumFileUtf16);
- continue;
- }
-
- rc = medium->vtbl->GetId(medium, &mediumUUID);
- if (NS_FAILED(rc)) {
- virReportError(VIR_ERR_INTERNAL_ERROR,
- _("can't get the uuid of the file to be attached "
- "as harddisk/dvd/floppy: %s, rc=%08x"),
- src, (unsigned)rc);
- VBOX_RELEASE(medium);
- VBOX_UTF16_FREE(mediumFileUtf16);
- continue;
- }
-
- if (def->disks[i]->device == VIR_DOMAIN_DISK_DEVICE_DISK) {
- if (def->disks[i]->src->readonly) {
- medium->vtbl->SetType(medium, MediumType_Immutable);
- VIR_DEBUG("setting harddisk to immutable");
- } else if (!def->disks[i]->src->readonly) {
- medium->vtbl->SetType(medium, MediumType_Normal);
- VIR_DEBUG("setting harddisk type to normal");
- }
- }
-
- if (def->disks[i]->bus == VIR_DOMAIN_DISK_BUS_IDE) {
- VBOX_UTF8_TO_UTF16("IDE Controller", &storageCtlName);
- storageBus = StorageBus_IDE;
- } else if (def->disks[i]->bus == VIR_DOMAIN_DISK_BUS_SATA) {
- VBOX_UTF8_TO_UTF16("SATA Controller", &storageCtlName);
- storageBus = StorageBus_SATA;
- } else if (def->disks[i]->bus == VIR_DOMAIN_DISK_BUS_SCSI) {
- VBOX_UTF8_TO_UTF16("SCSI Controller", &storageCtlName);
- storageBus = StorageBus_SCSI;
- } else if (def->disks[i]->bus == VIR_DOMAIN_DISK_BUS_FDC) {
- VBOX_UTF8_TO_UTF16("Floppy Controller", &storageCtlName);
- storageBus = StorageBus_Floppy;
- }
-
- /* get the device details i.e instance, port and slot */
- if (!vboxGetDeviceDetails(def->disks[i]->dst,
- maxPortPerInst,
- maxSlotPerPort,
- storageBus,
- &deviceInst,
- &devicePort,
- &deviceSlot)) {
- virReportError(VIR_ERR_INTERNAL_ERROR,
- _("can't get the port/slot number of "
- "harddisk/dvd/floppy to be attached: "
- "%s, rc=%08x"),
- src, (unsigned)rc);
- VBOX_RELEASE(medium);
- VBOX_UTF16_FREE(mediumUUID);
- VBOX_UTF16_FREE(mediumFileUtf16);
- continue;
- }
-
- /* attach the harddisk/dvd/Floppy to the storage controller */
- rc = machine->vtbl->AttachDevice(machine,
- storageCtlName,
- devicePort,
- deviceSlot,
- deviceType,
- mediumUUID);
-
- if (NS_FAILED(rc)) {
- virReportError(VIR_ERR_INTERNAL_ERROR,
- _("could not attach the file as "
- "harddisk/dvd/floppy: %s, rc=%08x"),
- src, (unsigned)rc);
- } else {
- DEBUGIID("Attached HDD/DVD/Floppy with UUID", mediumUUID);
- }
-
- VBOX_RELEASE(medium);
- VBOX_UTF16_FREE(mediumUUID);
- VBOX_UTF16_FREE(mediumFileUtf16);
- VBOX_UTF16_FREE(storageCtlName);
- }
- }
-}
-
-#else /* VBOX_API_VERSION >= 4000000 */
-
-static void
-_vboxAttachDrivesOld(virDomainDefPtr def ATTRIBUTE_UNUSED,
- vboxDriverPtr data ATTRIBUTE_UNUSED,
- IMachine *machine ATTRIBUTE_UNUSED)
-{
- vboxUnsupported();
-}
-
-#endif /* VBOX_API_VERSION >= 4000000 */
-
static int
_vboxDomainSnapshotRestore(virDomainPtr dom,
IMachine *machine,
pVBoxAPI->detachDevices = _detachDevices;
pVBoxAPI->unregisterMachine = _unregisterMachine;
pVBoxAPI->deleteConfig = _deleteConfig;
- pVBoxAPI->vboxAttachDrivesOld = _vboxAttachDrivesOld;
pVBoxAPI->vboxConvertState = _vboxConvertState;
pVBoxAPI->dumpIDEHDDsOld = _dumpIDEHDDsOld;
pVBoxAPI->dumpDVD = _dumpDVD;
/* Get machine for the call to VBOX_SESSION_OPEN_EXISTING */
pVBoxAPI->getMachineForSession = 1;
pVBoxAPI->detachDevicesExplicitly = 0;
- pVBoxAPI->vboxAttachDrivesUseOld = 0;
pVBoxAPI->supportScreenshot = 1;
#else /* VBOX_API_VERSION < 4000000 */
pVBoxAPI->getMachineForSession = 0;
pVBoxAPI->detachDevicesExplicitly = 1;
- pVBoxAPI->vboxAttachDrivesUseOld = 1;
pVBoxAPI->supportScreenshot = 0;
#endif /* VBOX_API_VERSION < 4000000 */