mirror of
https://gitlab.com/libvirt/libvirt.git
synced 2025-03-07 17:28:15 +00:00
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
|
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;
|
size_t i;
|
||||||
nsresult rc = 0;
|
nsresult rc = 0;
|
||||||
PRUint32 maxPortPerInst[StorageBus_Floppy + 1] = {};
|
PRUint32 maxPortPerInst[StorageBus_Floppy + 1] = {};
|
||||||
@ -1049,9 +1048,6 @@ vboxAttachDrivesNew(virDomainDefPtr def, vboxDriverPtr data, IMachine *machine)
|
|||||||
PRUnichar *storageCtlName = NULL;
|
PRUnichar *storageCtlName = NULL;
|
||||||
bool error = false;
|
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 */
|
/* get the max port/slots/etc for the given storage bus */
|
||||||
error = !vboxGetMaxPortSlotValues(data->vboxObj, maxPortPerInst,
|
error = !vboxGetMaxPortSlotValues(data->vboxObj, maxPortPerInst,
|
||||||
maxSlotPerPort);
|
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
|
static void
|
||||||
vboxAttachSound(virDomainDefPtr def, IMachine *machine)
|
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
|
static int
|
||||||
_vboxDomainSnapshotRestore(virDomainPtr dom,
|
_vboxDomainSnapshotRestore(virDomainPtr dom,
|
||||||
IMachine *machine,
|
IMachine *machine,
|
||||||
@ -3808,7 +3324,6 @@ void NAME(InstallUniformedAPI)(vboxUniformedAPI *pVBoxAPI)
|
|||||||
pVBoxAPI->detachDevices = _detachDevices;
|
pVBoxAPI->detachDevices = _detachDevices;
|
||||||
pVBoxAPI->unregisterMachine = _unregisterMachine;
|
pVBoxAPI->unregisterMachine = _unregisterMachine;
|
||||||
pVBoxAPI->deleteConfig = _deleteConfig;
|
pVBoxAPI->deleteConfig = _deleteConfig;
|
||||||
pVBoxAPI->vboxAttachDrivesOld = _vboxAttachDrivesOld;
|
|
||||||
pVBoxAPI->vboxConvertState = _vboxConvertState;
|
pVBoxAPI->vboxConvertState = _vboxConvertState;
|
||||||
pVBoxAPI->dumpIDEHDDsOld = _dumpIDEHDDsOld;
|
pVBoxAPI->dumpIDEHDDsOld = _dumpIDEHDDsOld;
|
||||||
pVBoxAPI->dumpDVD = _dumpDVD;
|
pVBoxAPI->dumpDVD = _dumpDVD;
|
||||||
@ -3860,12 +3375,10 @@ void NAME(InstallUniformedAPI)(vboxUniformedAPI *pVBoxAPI)
|
|||||||
/* Get machine for the call to VBOX_SESSION_OPEN_EXISTING */
|
/* Get machine for the call to VBOX_SESSION_OPEN_EXISTING */
|
||||||
pVBoxAPI->getMachineForSession = 1;
|
pVBoxAPI->getMachineForSession = 1;
|
||||||
pVBoxAPI->detachDevicesExplicitly = 0;
|
pVBoxAPI->detachDevicesExplicitly = 0;
|
||||||
pVBoxAPI->vboxAttachDrivesUseOld = 0;
|
|
||||||
pVBoxAPI->supportScreenshot = 1;
|
pVBoxAPI->supportScreenshot = 1;
|
||||||
#else /* VBOX_API_VERSION < 4000000 */
|
#else /* VBOX_API_VERSION < 4000000 */
|
||||||
pVBoxAPI->getMachineForSession = 0;
|
pVBoxAPI->getMachineForSession = 0;
|
||||||
pVBoxAPI->detachDevicesExplicitly = 1;
|
pVBoxAPI->detachDevicesExplicitly = 1;
|
||||||
pVBoxAPI->vboxAttachDrivesUseOld = 1;
|
|
||||||
pVBoxAPI->supportScreenshot = 0;
|
pVBoxAPI->supportScreenshot = 0;
|
||||||
#endif /* VBOX_API_VERSION < 4000000 */
|
#endif /* VBOX_API_VERSION < 4000000 */
|
||||||
|
|
||||||
|
@ -605,7 +605,6 @@ typedef struct {
|
|||||||
bool detachDevicesExplicitly;
|
bool detachDevicesExplicitly;
|
||||||
bool chipsetType;
|
bool chipsetType;
|
||||||
bool accelerate2DVideo;
|
bool accelerate2DVideo;
|
||||||
bool vboxAttachDrivesUseOld;
|
|
||||||
bool oldMediumInterface;
|
bool oldMediumInterface;
|
||||||
bool vboxSnapshotRedefine;
|
bool vboxSnapshotRedefine;
|
||||||
bool supportScreenshot;
|
bool supportScreenshot;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user