mirror of https://gitee.com/openkylin/libvirt.git
vbox: remove _vboxAttachDrivesOld
and fold vboxAttachDrivesNew into vboxAttachDrives
This commit is contained in:
parent
c8d7e90fd6
commit
c7c286c6bd
|
@ -1039,9 +1039,8 @@ vboxSetBootDeviceOrder(virDomainDefPtr def, vboxDriverPtr data,
|
|||
}
|
||||
|
||||
static void
|
||||
vboxAttachDrivesNew(virDomainDefPtr def, vboxDriverPtr data, IMachine *machine)
|
||||
vboxAttachDrives(virDomainDefPtr def, vboxDriverPtr data, IMachine *machine)
|
||||
{
|
||||
/* AttachDrives for 3.0 and later */
|
||||
size_t i;
|
||||
nsresult rc = 0;
|
||||
PRUint32 maxPortPerInst[StorageBus_Floppy + 1] = {};
|
||||
|
@ -1049,9 +1048,6 @@ vboxAttachDrivesNew(virDomainDefPtr def, vboxDriverPtr data, IMachine *machine)
|
|||
PRUnichar *storageCtlName = NULL;
|
||||
bool error = false;
|
||||
|
||||
if (gVBoxAPI.vboxAttachDrivesUseOld)
|
||||
VIR_WARN("This function may not work in current vbox version");
|
||||
|
||||
/* get the max port/slots/etc for the given storage bus */
|
||||
error = !vboxGetMaxPortSlotValues(data->vboxObj, maxPortPerInst,
|
||||
maxSlotPerPort);
|
||||
|
@ -1247,45 +1243,6 @@ vboxAttachDrivesNew(virDomainDefPtr def, vboxDriverPtr data, IMachine *machine)
|
|||
}
|
||||
}
|
||||
|
||||
static void
|
||||
vboxAttachDrives(virDomainDefPtr def, vboxDriverPtr data, IMachine *machine)
|
||||
{
|
||||
/* Here, About the vboxAttachDrives. In fact,there is
|
||||
* three different implementations. We name it as
|
||||
* v1, v2 and v3.
|
||||
*
|
||||
* The first version(v1) is only used in vbox 2.2 and 3.0,
|
||||
* v2 is used by 3.1 and 3.2, and v3 is used for later
|
||||
* vbox versions. In sight of implementation, the v1 is
|
||||
* totally different with v2 and v3. The v2 shares the same
|
||||
* outline with v3, meanwhile the API they used has much
|
||||
* difference.
|
||||
*
|
||||
* It seems we have no thing to do with old versions such as
|
||||
* v1 and v2 when developing new vbox drivers. What's more,
|
||||
* most of the vbox APIs used in v1 and v2 is incompatible with
|
||||
* new vbox versions. It is a burden to put these APIs into
|
||||
* vboxUniformedAPI, I prefer not to do that.
|
||||
*
|
||||
* After balancing the code size and the complied code size,
|
||||
* I put my solution here. The v1 and v2 is a version specified
|
||||
* code, which only be generated for first four version. The v3
|
||||
* will be put in vbox_common.c, it be complied only once, then
|
||||
* be used by all next vbox drivers.
|
||||
*
|
||||
* Check the flag vboxAttachDrivesUseOld can tell you which
|
||||
* implementation to use. When the flag is set, we need use
|
||||
* the old version though gVBoxAPI.vboxAttachDrivesOld. It
|
||||
* will automatically point to v1 or v2 deponds on you version.
|
||||
* If the flag is clear, just call vboxAttachDrivesNew, which
|
||||
* is the v3 implementation.
|
||||
*/
|
||||
if (gVBoxAPI.vboxAttachDrivesUseOld)
|
||||
gVBoxAPI.vboxAttachDrivesOld(def, data, machine);
|
||||
else
|
||||
vboxAttachDrivesNew(def, data, machine);
|
||||
}
|
||||
|
||||
static void
|
||||
vboxAttachSound(virDomainDefPtr def, IMachine *machine)
|
||||
{
|
||||
|
|
|
@ -324,490 +324,6 @@ static virDomainState _vboxConvertState(PRUint32 state)
|
|||
}
|
||||
}
|
||||
|
||||
#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,
|
||||
|
@ -3808,7 +3324,6 @@ void NAME(InstallUniformedAPI)(vboxUniformedAPI *pVBoxAPI)
|
|||
pVBoxAPI->detachDevices = _detachDevices;
|
||||
pVBoxAPI->unregisterMachine = _unregisterMachine;
|
||||
pVBoxAPI->deleteConfig = _deleteConfig;
|
||||
pVBoxAPI->vboxAttachDrivesOld = _vboxAttachDrivesOld;
|
||||
pVBoxAPI->vboxConvertState = _vboxConvertState;
|
||||
pVBoxAPI->dumpIDEHDDsOld = _dumpIDEHDDsOld;
|
||||
pVBoxAPI->dumpDVD = _dumpDVD;
|
||||
|
@ -3860,12 +3375,10 @@ void NAME(InstallUniformedAPI)(vboxUniformedAPI *pVBoxAPI)
|
|||
/* 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 */
|
||||
|
||||
|
|
|
@ -605,7 +605,6 @@ typedef struct {
|
|||
bool detachDevicesExplicitly;
|
||||
bool chipsetType;
|
||||
bool accelerate2DVideo;
|
||||
bool vboxAttachDrivesUseOld;
|
||||
bool oldMediumInterface;
|
||||
bool vboxSnapshotRedefine;
|
||||
bool supportScreenshot;
|
||||
|
|
Loading…
Reference in New Issue