[libvirt] [PATCH 1/6] add VirtualBox 5 support to file vbox/vbox_tmpl.c

--- src/vbox/vbox_tmpl.c | 290 ++++++++++++++++++++++++++++++++------------------- 1 file changed, 183 insertions(+), 107 deletions(-) diff --git a/src/vbox/vbox_tmpl.c b/src/vbox/vbox_tmpl.c index 7a8205d..79ce001 100644 --- a/src/vbox/vbox_tmpl.c +++ b/src/vbox/vbox_tmpl.c @@ -69,6 +69,8 @@ # include "vbox_CAPI_v4_3.h" #elif VBOX_API_VERSION == 4003004 # include "vbox_CAPI_v4_3_4.h" +#elif VBOX_API_VERSION == 5000000 +# include "vbox_CAPI_v5_0.h" #else # error "Unsupport VBOX_API_VERSION" #endif @@ -228,18 +230,18 @@ static void nsIDtoChar(unsigned char *uuid, const nsID *iid) memcpy(uuidinterim, iid, VIR_UUID_BUFLEN); virUUIDFormat(uuidinterim, uuidstrsrc); - uuidstrdst[0] = uuidstrsrc[6]; - uuidstrdst[1] = uuidstrsrc[7]; - uuidstrdst[2] = uuidstrsrc[4]; - uuidstrdst[3] = uuidstrsrc[5]; - uuidstrdst[4] = uuidstrsrc[2]; - uuidstrdst[5] = uuidstrsrc[3]; - uuidstrdst[6] = uuidstrsrc[0]; - uuidstrdst[7] = uuidstrsrc[1]; + uuidstrdst[0] = uuidstrsrc[6]; + uuidstrdst[1] = uuidstrsrc[7]; + uuidstrdst[2] = uuidstrsrc[4]; + uuidstrdst[3] = uuidstrsrc[5]; + uuidstrdst[4] = uuidstrsrc[2]; + uuidstrdst[5] = uuidstrsrc[3]; + uuidstrdst[6] = uuidstrsrc[0]; + uuidstrdst[7] = uuidstrsrc[1]; - uuidstrdst[8] = uuidstrsrc[8]; + uuidstrdst[8] = uuidstrsrc[8]; - uuidstrdst[9] = uuidstrsrc[11]; + uuidstrdst[9] = uuidstrsrc[11]; uuidstrdst[10] = uuidstrsrc[12]; uuidstrdst[11] = uuidstrsrc[9]; uuidstrdst[12] = uuidstrsrc[10]; @@ -267,18 +269,18 @@ static void nsIDFromChar(nsID *iid, const unsigned char *uuid) virUUIDFormat(uuid, uuidstrsrc); - uuidstrdst[0] = uuidstrsrc[6]; - uuidstrdst[1] = uuidstrsrc[7]; - uuidstrdst[2] = uuidstrsrc[4]; - uuidstrdst[3] = uuidstrsrc[5]; - uuidstrdst[4] = uuidstrsrc[2]; - uuidstrdst[5] = uuidstrsrc[3]; - uuidstrdst[6] = uuidstrsrc[0]; - uuidstrdst[7] = uuidstrsrc[1]; + uuidstrdst[0] = uuidstrsrc[6]; + uuidstrdst[1] = uuidstrsrc[7]; + uuidstrdst[2] = uuidstrsrc[4]; + uuidstrdst[3] = uuidstrsrc[5]; + uuidstrdst[4] = uuidstrsrc[2]; + uuidstrdst[5] = uuidstrsrc[3]; + uuidstrdst[6] = uuidstrsrc[0]; + uuidstrdst[7] = uuidstrsrc[1]; - uuidstrdst[8] = uuidstrsrc[8]; + uuidstrdst[8] = uuidstrsrc[8]; - uuidstrdst[9] = uuidstrsrc[11]; + uuidstrdst[9] = uuidstrsrc[11]; uuidstrdst[10] = uuidstrsrc[12]; uuidstrdst[11] = uuidstrsrc[9]; uuidstrdst[12] = uuidstrsrc[10]; @@ -621,13 +623,12 @@ _vboxIIDFromArrayItem(vboxGlobalData *data, vboxIIDUnion *iidu, # if VBOX_API_VERSION < 4000000 /* Only 3.x will use this function. */ static bool vboxGetDeviceDetails(const char *deviceName, - PRUint32 *aMaxPortPerInst, - PRUint32 *aMaxSlotPerPort, - PRUint32 storageBus, - PRInt32 *deviceInst, - PRInt32 *devicePort, - PRInt32 *deviceSlot) -{ + PRUint32 *aMaxPortPerInst, + PRUint32 *aMaxSlotPerPort, + PRUint32 storageBus, + PRInt32 *deviceInst, + PRInt32 *devicePort, + PRInt32 *deviceSlot) { int total = 0; PRUint32 maxPortPerInst = 0; PRUint32 maxSlotPerPort = 0; @@ -829,8 +830,8 @@ _vboxAttachDrivesOld(virDomainDefPtr def, vboxGlobalData *data, IMachine *machin machine->vtbl->GetDVDDrive(machine, &dvdDrive); if (dvdDrive) { - IDVDImage *dvdImage = NULL; - PRUnichar *dvdfileUtf16 = NULL; + IDVDImage *dvdImage = NULL; + PRUnichar *dvdfileUtf16 = NULL; vboxIID dvduuid = VBOX_IID_INITIALIZER; vboxIID dvdemptyuuid = VBOX_IID_INITIALIZER; @@ -873,10 +874,10 @@ _vboxAttachDrivesOld(virDomainDefPtr def, vboxGlobalData *data, IMachine *machin } } else if (def->disks[i]->device == VIR_DOMAIN_DISK_DEVICE_DISK) { if (type == VIR_STORAGE_TYPE_FILE && src) { - IHardDisk *hardDisk = NULL; + IHardDisk *hardDisk = NULL; PRUnichar *hddfileUtf16 = NULL; vboxIID hdduuid = VBOX_IID_INITIALIZER; - PRUnichar *hddEmpty = NULL; + 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 @@ -930,8 +931,8 @@ _vboxAttachDrivesOld(virDomainDefPtr def, vboxGlobalData *data, IMachine *machin VIR_DEBUG("Not connecting harddisk to hdc as hdc" " is taken by CD/DVD Drive"); } else { - PRInt32 channel = 0; - PRInt32 device = 0; + PRInt32 channel = 0; + PRInt32 device = 0; PRUnichar *hddcnameUtf16 = NULL; char *hddcname; @@ -941,13 +942,13 @@ _vboxAttachDrivesOld(virDomainDefPtr def, vboxGlobalData *data, IMachine *machin if (STREQ(def->disks[i]->dst, "hda")) { channel = 0; - device = 0; + device = 0; } else if (STREQ(def->disks[i]->dst, "hdb")) { channel = 0; - device = 1; + device = 1; } else if (STREQ(def->disks[i]->dst, "hdd")) { channel = 1; - device = 1; + device = 1; } rc = machine->vtbl->AttachHardDisk(machine, @@ -982,8 +983,8 @@ _vboxAttachDrivesOld(virDomainDefPtr def, vboxGlobalData *data, IMachine *machin if (floppyDrive) { rc = floppyDrive->vtbl->SetEnabled(floppyDrive, 1); if (NS_SUCCEEDED(rc)) { - IFloppyImage *floppyImage = NULL; - PRUnichar *fdfileUtf16 = NULL; + IFloppyImage *floppyImage = NULL; + PRUnichar *fdfileUtf16 = NULL; vboxIID fduuid = VBOX_IID_INITIALIZER; vboxIID fdemptyuuid = VBOX_IID_INITIALIZER; @@ -1038,7 +1039,7 @@ static void _vboxAttachDrivesOld(virDomainDefPtr def, vboxGlobalData *data, IMachine *machine) { size_t i; - nsresult rc = 0; + nsresult rc; PRUint32 maxPortPerInst[StorageBus_Floppy + 1] = {}; PRUint32 maxSlotPerPort[StorageBus_Floppy + 1] = {}; @@ -1110,14 +1111,14 @@ _vboxAttachDrivesOld(virDomainDefPtr def, vboxGlobalData *data, IMachine *machin ? "True" : "False")); if (type == VIR_STORAGE_TYPE_FILE && src) { - IMedium *medium = NULL; - PRUnichar *mediumUUID = NULL; + 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; + PRUint32 storageBus = StorageBus_Null; + PRUint32 deviceType = DeviceType_Null; + PRInt32 deviceInst = 0; + PRInt32 devicePort = 0; + PRInt32 deviceSlot = 0; VBOX_UTF8_TO_UTF16(src, &mediumFileUtf16); @@ -1311,7 +1312,9 @@ _vboxDomainSnapshotRestore(virDomainPtr dom, ISnapshot *snapshot) { vboxGlobalData *data = dom->conn->privateData; +# if VBOX_API_VERSION < 5000000 IConsole *console = NULL; +# endif /*VBOX_API_VERSION < 5000000*/ IProgress *progress = NULL; PRUint32 state; nsresult rc; @@ -1344,16 +1347,22 @@ _vboxDomainSnapshotRestore(virDomainPtr dom, } rc = VBOX_SESSION_OPEN(domiid.value, machine); +# if VBOX_API_VERSION < 5000000 if (NS_SUCCEEDED(rc)) rc = data->vboxSession->vtbl->GetConsole(data->vboxSession, &console); +# endif /*VBOX_API_VERSION < 5000000*/ if (NS_FAILED(rc)) { virReportError(VIR_ERR_INTERNAL_ERROR, _("could not open VirtualBox session with domain %s"), dom->name); goto cleanup; } - +# if VBOX_API_VERSION < 5000000 rc = console->vtbl->RestoreSnapshot(console, snapshot, &progress); +# elif VBOX_API_VERSION >= 5000000 /*VBOX_API_VERSION < 5000000*/ + rc = machine->vtbl->RestoreSnapshot(machine, snapshot, &progress); +# endif /*VBOX_API_VERSION >= 5000000*/ + if (NS_FAILED(rc) || !progress) { if (rc == VBOX_E_INVALID_VM_STATE) { virReportError(VIR_ERR_OPERATION_INVALID, "%s", @@ -1378,7 +1387,9 @@ _vboxDomainSnapshotRestore(virDomainPtr dom, cleanup: VBOX_RELEASE(progress); +# if VBOX_API_VERSION < 5000000 VBOX_RELEASE(console); +# endif /*VBOX_API_VERSION < 5000000*/ VBOX_SESSION_CLOSE(); vboxIIDUnalloc(&domiid); return ret; @@ -1406,8 +1417,8 @@ vboxCallbackOnMachineStateChange(IVirtualBoxCallback *pThis ATTRIBUTE_UNUSED, PRUnichar *machineId, PRUint32 state) { virDomainPtr dom = NULL; - int event = 0; - int detail = 0; + int event = 0; + int detail = 0; vboxDriverLock(g_pVBoxGlobalData); @@ -1415,7 +1426,7 @@ vboxCallbackOnMachineStateChange(IVirtualBoxCallback *pThis ATTRIBUTE_UNUSED, DEBUGPRUnichar("machineId", machineId); if (machineId) { - char *machineIdUtf8 = NULL; + char *machineIdUtf8 = NULL; unsigned char uuid[VIR_UUID_BUFLEN]; g_pVBoxGlobalData->pFuncs->pfnUtf16ToUtf8(machineId, &machineIdUtf8); @@ -1426,31 +1437,31 @@ vboxCallbackOnMachineStateChange(IVirtualBoxCallback *pThis ATTRIBUTE_UNUSED, virObjectEventPtr ev; if (state == MachineState_Starting) { - event = VIR_DOMAIN_EVENT_STARTED; + event = VIR_DOMAIN_EVENT_STARTED; detail = VIR_DOMAIN_EVENT_STARTED_BOOTED; } else if (state == MachineState_Restoring) { - event = VIR_DOMAIN_EVENT_STARTED; + event = VIR_DOMAIN_EVENT_STARTED; detail = VIR_DOMAIN_EVENT_STARTED_RESTORED; } else if (state == MachineState_Paused) { - event = VIR_DOMAIN_EVENT_SUSPENDED; + event = VIR_DOMAIN_EVENT_SUSPENDED; detail = VIR_DOMAIN_EVENT_SUSPENDED_PAUSED; } else if (state == MachineState_Running) { - event = VIR_DOMAIN_EVENT_RESUMED; + event = VIR_DOMAIN_EVENT_RESUMED; detail = VIR_DOMAIN_EVENT_RESUMED_UNPAUSED; } else if (state == MachineState_PoweredOff) { - event = VIR_DOMAIN_EVENT_STOPPED; + event = VIR_DOMAIN_EVENT_STOPPED; detail = VIR_DOMAIN_EVENT_STOPPED_SHUTDOWN; } else if (state == MachineState_Stopping) { - event = VIR_DOMAIN_EVENT_STOPPED; + event = VIR_DOMAIN_EVENT_STOPPED; detail = VIR_DOMAIN_EVENT_STOPPED_DESTROYED; } else if (state == MachineState_Aborted) { - event = VIR_DOMAIN_EVENT_STOPPED; + event = VIR_DOMAIN_EVENT_STOPPED; detail = VIR_DOMAIN_EVENT_STOPPED_CRASHED; } else if (state == MachineState_Saving) { - event = VIR_DOMAIN_EVENT_STOPPED; + event = VIR_DOMAIN_EVENT_STOPPED; detail = VIR_DOMAIN_EVENT_STOPPED_SAVED; } else { - event = VIR_DOMAIN_EVENT_STOPPED; + event = VIR_DOMAIN_EVENT_STOPPED; detail = VIR_DOMAIN_EVENT_STOPPED_SHUTDOWN; } @@ -1525,8 +1536,8 @@ vboxCallbackOnMachineRegistered(IVirtualBoxCallback *pThis ATTRIBUTE_UNUSED, PRUnichar *machineId, PRBool registered) { virDomainPtr dom = NULL; - int event = 0; - int detail = 0; + int event = 0; + int detail = 0; vboxDriverLock(g_pVBoxGlobalData); @@ -1534,7 +1545,7 @@ vboxCallbackOnMachineRegistered(IVirtualBoxCallback *pThis ATTRIBUTE_UNUSED, DEBUGPRUnichar("machineId", machineId); if (machineId) { - char *machineIdUtf8 = NULL; + char *machineIdUtf8 = NULL; unsigned char uuid[VIR_UUID_BUFLEN]; g_pVBoxGlobalData->pFuncs->pfnUtf16ToUtf8(machineId, &machineIdUtf8); @@ -1551,10 +1562,10 @@ vboxCallbackOnMachineRegistered(IVirtualBoxCallback *pThis ATTRIBUTE_UNUSED, * to show the VIR_DOMAIN_EVENT_UNDEFINED event */ if (registered) { - event = VIR_DOMAIN_EVENT_DEFINED; + event = VIR_DOMAIN_EVENT_DEFINED; detail = VIR_DOMAIN_EVENT_DEFINED_ADDED; } else { - event = VIR_DOMAIN_EVENT_UNDEFINED; + event = VIR_DOMAIN_EVENT_UNDEFINED; detail = VIR_DOMAIN_EVENT_UNDEFINED_REMOVED; } @@ -1750,7 +1761,7 @@ vboxConnectDomainEventRegister(virConnectPtr conn, virFreeCallback freecb) { vboxGlobalData *data = conn->privateData; - int vboxRet = -1; + int vboxRet = -1; nsresult rc; int ret = -1; @@ -1854,7 +1865,7 @@ static int vboxConnectDomainEventRegisterAny(virConnectPtr conn, virFreeCallback freecb) { vboxGlobalData *data = conn->privateData; - int vboxRet = -1; + int vboxRet = -1; nsresult rc; int ret = -1; @@ -2160,26 +2171,26 @@ _dumpIDEHDDsOld(virDomainDefPtr def, vboxGlobalData *data, IMachine *machine) { - PRInt32 hddNum = 0; - IHardDisk *hardDiskPM = NULL; - IHardDisk *hardDiskPS = NULL; - IHardDisk *hardDiskSS = NULL; - const char *hddBus = "IDE"; - PRUnichar *hddBusUtf16 = NULL; + PRInt32 hddNum = 0; + IHardDisk *hardDiskPM = NULL; + IHardDisk *hardDiskPS = NULL; + IHardDisk *hardDiskSS = NULL; + const char *hddBus = "IDE"; + PRUnichar *hddBusUtf16 = NULL; /* dump IDE hdds if present */ VBOX_UTF8_TO_UTF16(hddBus, &hddBusUtf16); def->ndisks = 0; - machine->vtbl->GetHardDisk(machine, hddBusUtf16, 0, 0, &hardDiskPM); + machine->vtbl->GetHardDisk(machine, hddBusUtf16, 0, 0, &hardDiskPM); if (hardDiskPM) def->ndisks++; - machine->vtbl->GetHardDisk(machine, hddBusUtf16, 0, 1, &hardDiskPS); + machine->vtbl->GetHardDisk(machine, hddBusUtf16, 0, 1, &hardDiskPS); if (hardDiskPS) def->ndisks++; - machine->vtbl->GetHardDisk(machine, hddBusUtf16, 1, 1, &hardDiskSS); + machine->vtbl->GetHardDisk(machine, hddBusUtf16, 1, 1, &hardDiskSS); if (hardDiskSS) def->ndisks++; @@ -2199,8 +2210,8 @@ _dumpIDEHDDsOld(virDomainDefPtr def, if (hardDiskPM) { PRUnichar *hddlocationUtf16 = NULL; - char *hddlocation = NULL; - PRUint32 hddType = HardDiskType_Normal; + char *hddlocation = NULL; + PRUint32 hddType = HardDiskType_Normal; hardDiskPM->vtbl->imedium.GetLocation((IMedium *)hardDiskPM, &hddlocationUtf16); VBOX_UTF16_TO_UTF8(hddlocationUtf16, &hddlocation); @@ -2221,8 +2232,8 @@ _dumpIDEHDDsOld(virDomainDefPtr def, if (hardDiskPS) { PRUnichar *hddlocationUtf16 = NULL; - char *hddlocation = NULL; - PRUint32 hddType = HardDiskType_Normal; + char *hddlocation = NULL; + PRUint32 hddType = HardDiskType_Normal; hardDiskPS->vtbl->imedium.GetLocation((IMedium *)hardDiskPS, &hddlocationUtf16); VBOX_UTF16_TO_UTF8(hddlocationUtf16, &hddlocation); @@ -2243,8 +2254,8 @@ _dumpIDEHDDsOld(virDomainDefPtr def, if (hardDiskSS) { PRUnichar *hddlocationUtf16 = NULL; - char *hddlocation = NULL; - PRUint32 hddType = HardDiskType_Normal; + char *hddlocation = NULL; + PRUint32 hddType = HardDiskType_Normal; hardDiskSS->vtbl->imedium.GetLocation((IMedium *)hardDiskSS, &hddlocationUtf16); VBOX_UTF16_TO_UTF8(hddlocationUtf16, &hddlocation); @@ -2269,10 +2280,10 @@ _dumpDVD(virDomainDefPtr def, vboxGlobalData *data, IMachine *machine) { - IDVDDrive *dvdDrive = NULL; - IDVDImage *dvdImage = NULL; + IDVDDrive *dvdDrive = NULL; + IDVDImage *dvdImage = NULL; PRUnichar *locationUtf16 = NULL; - char *location = NULL; + char *location = NULL; /* dump CDROM/DVD if the drive is attached and has DVD/CD in it */ @@ -2323,8 +2334,8 @@ _dumpDVD(virDomainDefPtr def, static int _attachDVD(vboxGlobalData *data, IMachine *machine, const char *src) { - IDVDDrive *dvdDrive = NULL; - IDVDImage *dvdImage = NULL; + IDVDDrive *dvdDrive = NULL; + IDVDImage *dvdImage = NULL; PRUnichar *dvdfileUtf16 = NULL; vboxIID dvduuid = VBOX_IID_INITIALIZER; vboxIID dvdemptyuuid = VBOX_IID_INITIALIZER; @@ -2410,10 +2421,10 @@ _dumpFloppy(virDomainDefPtr def, { IFloppyDrive *floppyDrive = NULL; IFloppyImage *floppyImage = NULL; - PRUnichar *locationUtf16 = NULL; - char *location = NULL; - PRBool enabled = PR_FALSE; - PRUint32 state = DriveState_Null; + PRUnichar *locationUtf16 = NULL; + char *location = NULL; + PRBool enabled = PR_FALSE; + PRUint32 state = DriveState_Null; /* dump Floppy if the drive is attached and has floppy in it */ machine->vtbl->GetFloppyDrive(machine, &floppyDrive); @@ -2466,8 +2477,8 @@ static int _attachFloppy(vboxGlobalData *data, IMachine *machine, const char *src) { IFloppyDrive *floppyDrive; - IFloppyImage *floppyImage = NULL; - PRUnichar *fdfileUtf16 = NULL; + IFloppyImage *floppyImage = NULL; + PRUnichar *fdfileUtf16 = NULL; vboxIID fduuid = VBOX_IID_INITIALIZER; vboxIID fdemptyuuid = VBOX_IID_INITIALIZER; nsresult rc; @@ -2812,7 +2823,7 @@ _virtualboxCreateMachine(vboxGlobalData *data, virDomainDefPtr def, IMachine **m { vboxIID iid = VBOX_IID_INITIALIZER; PRUnichar *machineNameUtf16 = NULL; - nsresult rc = -1; + nsresult rc; VBOX_UTF8_TO_UTF16(def->name, &machineNameUtf16); vboxIIDFromUUID(&iid, def->uuid); @@ -2825,7 +2836,7 @@ _virtualboxCreateMachine(vboxGlobalData *data, virDomainDefPtr def, IMachine **m iid.value, machine); #elif VBOX_API_VERSION < 4000000 /* 3002000 <= VBOX_API_VERSION < 4000000 */ - PRBool override = PR_FALSE; + PRBool override = PR_FALSE; rc = data->vboxObj->vtbl->CreateMachine(data->vboxObj, machineNameUtf16, NULL, @@ -2834,7 +2845,7 @@ _virtualboxCreateMachine(vboxGlobalData *data, virDomainDefPtr def, IMachine **m override, machine); #elif VBOX_API_VERSION >= 4000000 && VBOX_API_VERSION < 4002000 - PRBool override = PR_FALSE; + PRBool override = PR_FALSE; rc = data->vboxObj->vtbl->CreateMachine(data->vboxObj, NULL, machineNameUtf16, @@ -2843,12 +2854,18 @@ _virtualboxCreateMachine(vboxGlobalData *data, virDomainDefPtr def, IMachine **m override, machine); #else /* VBOX_API_VERSION >= 4002000 */ - char *createFlags = NULL; + const char *flagsUUIDPrefix = "UUID="; + const char *flagsForceOverwrite = "forceOverwrite=0"; + const char *flagsSeparator = ","; + char createFlags[strlen(flagsUUIDPrefix) + VIR_UUID_STRING_BUFLEN + strlen(flagsSeparator) + strlen(flagsForceOverwrite) + 1]; PRUnichar *createFlagsUtf16 = NULL; - if (virAsprintf(&createFlags, - "UUID=%s,forceOverwrite=0", uuidstr) < 0) - goto cleanup; + snprintf(createFlags, sizeof(createFlags), "%s%s%s%s", + flagsUUIDPrefix, + uuidstr, + flagsSeparator, + flagsForceOverwrite + ); VBOX_UTF8_TO_UTF16(createFlags, &createFlagsUtf16); rc = data->vboxObj->vtbl->CreateMachine(data->vboxObj, NULL, @@ -2858,8 +2875,6 @@ _virtualboxCreateMachine(vboxGlobalData *data, virDomainDefPtr def, IMachine **m nsnull, createFlagsUtf16, machine); - cleanup: - VIR_FREE(createFlags); #endif /* VBOX_API_VERSION >= 4002000 */ } VBOX_UTF16_FREE(machineNameUtf16); @@ -2874,7 +2889,12 @@ _virtualboxCreateHardDisk(IVirtualBox *vboxObj, PRUnichar *format, /* In vbox 2.2 and 3.0, this function will create a IHardDisk object. * In vbox 3.1 and later, this function will create a IMedium object. */ +#if VBOX_API_VERSION < 5000000 return vboxObj->vtbl->CreateHardDisk(vboxObj, format, location, hardDisk); +#elif VBOX_API_VERSION >= 5000000 /*VBOX_API_VERSION >= 5000000*/ + return vboxObj->vtbl->CreateMedium(vboxObj, format, location, AccessMode_ReadWrite, DeviceType_HardDisk, hardDisk); +#endif /*VBOX_API_VERSION >= 5000000*/ + } static nsresult @@ -3366,7 +3386,23 @@ _sessionGetMachine(ISession *session, IMachine **machine) static nsresult _consoleSaveState(IConsole *console, IProgress **progress) { +#if VBOX_API_VERSION < 5000000 return console->vtbl->SaveState(console, progress); +#else /*VBOX_API_VERSION < 5000000*/ + IMachine *machine; + nsresult rc; + + rc = console->vtbl->GetMachine(console, &machine); + + if (NS_SUCCEEDED(rc)) + rc = machine->vtbl->SaveState(machine, progress); + else + virReportError(VIR_ERR_INTERNAL_ERROR, + _("unable to get machine from console. (error %d)"), rc); + + return rc; + +#endif /*VBOX_API_VERSION >= 5000000*/ } static nsresult @@ -3414,7 +3450,25 @@ static nsresult _consoleTakeSnapshot(IConsole *console, PRUnichar *name, PRUnichar *description, IProgress **progress) { +#if VBOX_API_VERSION < 5000000 return console->vtbl->TakeSnapshot(console, name, description, progress); +#else + IMachine *machine; + nsresult rc; + PRUnichar *id = NULL; + bool bpause = true; /*NO live snapshot*/ + + rc = console->vtbl->GetMachine(console, &machine); + + if (NS_SUCCEEDED(rc)) + rc = machine->vtbl->TakeSnapshot(machine, name, description, bpause, &id, progress); + else + virReportError(VIR_ERR_INTERNAL_ERROR, + _("unable to get machine from console. (error %d)"), rc); + + VBOX_RELEASE(machine); + return rc; +#endif /* VBOX_API_VERSION >= 5000000 */ } static nsresult @@ -3422,9 +3476,24 @@ _consoleDeleteSnapshot(IConsole *console, vboxIIDUnion *iidu, IProgress **progre { #if VBOX_API_VERSION < 3001000 return console->vtbl->DiscardSnapshot(console, IID_MEMBER(value), progress); -#else /* VBOX_API_VERSION >= 3001000 */ +#elif VBOX_API_VERSION >= 3001000 && VBOX_API_VERSION < 5000000 /* VBOX_API_VERSION >= 3001000 */ return console->vtbl->DeleteSnapshot(console, IID_MEMBER(value), progress); -#endif /* VBOX_API_VERSION >= 3001000 */ +#else /* VBOX_API_VERSION >= 5000000 */ + IMachine *machine; + nsresult rc; + + rc = console->vtbl->GetMachine(console, &machine); + + if (NS_SUCCEEDED(rc)) + rc = machine->vtbl->DeleteSnapshot(machine, IID_MEMBER(value), progress); + else + virReportError(VIR_ERR_INTERNAL_ERROR, + _("unable to get machine from console. (error %d)"), rc); + + VBOX_RELEASE(machine); + + return rc; +#endif /* VBOX_API_VERSION >= 5000000 */ } static nsresult @@ -4342,11 +4411,18 @@ _displayGetScreenResolution(IDisplay *display ATTRIBUTE_UNUSED, #elif VBOX_API_VERSION < 4003000 return display->vtbl->GetScreenResolution(display, screenId, width, height, bitsPerPixel); -#else /* VBOX_API_VERSION >= 4003000 */ +#elif VBOX_API_VERSION < 5000000 /* VBOX_API_VERSION >= 4003000 */ return display->vtbl->GetScreenResolution(display, screenId, width, height, bitsPerPixel, xOrigin, yOrigin); -#endif /* VBOX_API_VERSION >= 4003000 */ +#else /*VBOX_API_VERSION >= 5000000 */ + PRUint32 gms; + + return display->vtbl->GetScreenResolution(display, screenId, width, + height, bitsPerPixel, + xOrigin, yOrigin, &gms); +#endif /* VBOX_API_VERSION >= 5000000 */ + } static nsresult @@ -4357,10 +4433,10 @@ _displayTakeScreenShotPNGToArray(IDisplay *display ATTRIBUTE_UNUSED, PRUint32 *screenDataSize ATTRIBUTE_UNUSED, PRUint8** screenData ATTRIBUTE_UNUSED) { -#if VBOX_API_VERSION < 4000000 +#if VBOX_API_VERSION < 4000000 || VBOX_API_VERSION >= 5000000 vboxUnsupported(); return 0; -#else /* VBOX_API_VERSION >= 4000000 */ +#else /* VBOX_API_VERSION >= 4000000 && VBOX_API_VERSION < 5000000 */ return display->vtbl->TakeScreenShotPNGToArray(display, screenId, width, height, screenDataSize, screenData); -- 2.7.4

--- src/vbox/vbox_V5_0.c | 13 +++++++++++++ 1 file changed, 13 insertions(+) create mode 100644 src/vbox/vbox_V5_0.c diff --git a/src/vbox/vbox_V5_0.c b/src/vbox/vbox_V5_0.c new file mode 100644 index 0000000..4293944 --- /dev/null +++ b/src/vbox/vbox_V5_0.c @@ -0,0 +1,13 @@ +/** @file vbox_V5_0.c + * C file to include support for multiple versions of VirtualBox + * at runtime. + */ + +#include <config.h> + +/** The API Version */ +#define VBOX_API_VERSION 5000000 +/** Version specific prefix. */ +#define NAME(name) vbox50##name + +#include "vbox_tmpl.c" -- 2.7.4

On 09.06.2016 13:07, Martin Pietsch wrote:
--- src/vbox/vbox_V5_0.c | 13 +++++++++++++ 1 file changed, 13 insertions(+) create mode 100644 src/vbox/vbox_V5_0.c
diff --git a/src/vbox/vbox_V5_0.c b/src/vbox/vbox_V5_0.c new file mode 100644 index 0000000..4293944 --- /dev/null +++ b/src/vbox/vbox_V5_0.c @@ -0,0 +1,13 @@ +/** @file vbox_V5_0.c + * C file to include support for multiple versions of VirtualBox + * at runtime. + */ + +#include <config.h> + +/** The API Version */ +#define VBOX_API_VERSION 5000000 +/** Version specific prefix. */ +#define NAME(name) vbox50##name + +#include "vbox_tmpl.c"
I believe this one should also update src/Makefile.am and add the .c file into the list (just like 5/6 is doing). .h should be added to the list in either 6/6 or alternatively, you can introduce .c and .h files in separate patches to the repository, and then adjust Makefile and other files to work them in. The idea is that after each single patch 'make all syntax-check check' passes without any error. Michal

--- src/vbox/vbox_uniformed_api.h | 1 + 1 file changed, 1 insertion(+) diff --git a/src/vbox/vbox_uniformed_api.h b/src/vbox/vbox_uniformed_api.h index a469968..74e9ac0 100644 --- a/src/vbox/vbox_uniformed_api.h +++ b/src/vbox/vbox_uniformed_api.h @@ -628,5 +628,6 @@ void vbox42InstallUniformedAPI(vboxUniformedAPI *pVBoxAPI); void vbox42_20InstallUniformedAPI(vboxUniformedAPI *pVBoxAPI); void vbox43InstallUniformedAPI(vboxUniformedAPI *pVBoxAPI); void vbox43_4InstallUniformedAPI(vboxUniformedAPI *pVBoxAPI); +void vbox50InstallUniformedAPI(vboxUniformedAPI *pVBoxAPI); #endif /* VBOX_UNIFORMED_API_H */ -- 2.7.4

--- src/vbox/vbox_storage.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/vbox/vbox_storage.c b/src/vbox/vbox_storage.c index 6584cd0..c849505 100644 --- a/src/vbox/vbox_storage.c +++ b/src/vbox/vbox_storage.c @@ -908,6 +908,8 @@ virStorageDriverPtr vboxGetStorageDriver(uint32_t uVersion) vbox43InstallUniformedAPI(&gVBoxAPI); } else if (uVersion >= 4003004 && uVersion < 4003051) { vbox43_4InstallUniformedAPI(&gVBoxAPI); + } else if (uVersion >= 4003051 && uVersion < 5000051) { + vbox50InstallUniformedAPI(&gVBoxAPI); } else { return NULL; } -- 2.7.4

On 09.06.2016 13:07, Martin Pietsch wrote:
--- src/vbox/vbox_storage.c | 2 ++ 1 file changed, 2 insertions(+)
diff --git a/src/vbox/vbox_storage.c b/src/vbox/vbox_storage.c index 6584cd0..c849505 100644 --- a/src/vbox/vbox_storage.c +++ b/src/vbox/vbox_storage.c @@ -908,6 +908,8 @@ virStorageDriverPtr vboxGetStorageDriver(uint32_t uVersion) vbox43InstallUniformedAPI(&gVBoxAPI); } else if (uVersion >= 4003004 && uVersion < 4003051) { vbox43_4InstallUniformedAPI(&gVBoxAPI); + } else if (uVersion >= 4003051 && uVersion < 5000051) { + vbox50InstallUniformedAPI(&gVBoxAPI); } else { return NULL; }
I've got a test error after this patch: 12) Test driver "vbox" ... 2016-06-14 10:18:33.095+0000: 28982: debug : virDriverLoadModule:54 : Module load vbox 2016-06-14 10:18:33.095+0000: 28982: debug : virUpdateSelfLastChanged:2558 : Setting self last changed to 1465899470 for '/some/path/libvirt.git/src/.libs/libvirt_driver_vbox.so' 2016-06-14 10:18:33.095+0000: 28982: error : virDriverLoadModule:73 : failed to load module /some/path/libvirt.git/src/.libs/libvirt_driver_vbox.so /some/path/libvirt.git/src/.libs/libvirt_driver_vbox.so: undefined symbol: vbox50InstallUniformedAPI FAILED Michal

--- src/Makefile.am | 1 + 1 file changed, 1 insertion(+) diff --git a/src/Makefile.am b/src/Makefile.am index 8c83b0c..83af3b7 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -783,6 +783,7 @@ VBOX_DRIVER_SOURCES = \ vbox/vbox_V4_2_20.c vbox/vbox_CAPI_v4_2_20.h \ vbox/vbox_V4_3.c vbox/vbox_CAPI_v4_3.h \ vbox/vbox_V4_3_4.c vbox/vbox_CAPI_v4_3_4.h \ + vbox/vbox_V5_0.c vbox/vbox_CAPI_v5_0.h \ vbox/vbox_common.c vbox/vbox_common.h \ vbox/vbox_uniformed_api.h \ vbox/vbox_get_driver.h \ -- 2.7.4

On 09.06.2016 13:07, Martin Pietsch wrote:
--- src/Makefile.am | 1 + 1 file changed, 1 insertion(+)
diff --git a/src/Makefile.am b/src/Makefile.am index 8c83b0c..83af3b7 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -783,6 +783,7 @@ VBOX_DRIVER_SOURCES = \ vbox/vbox_V4_2_20.c vbox/vbox_CAPI_v4_2_20.h \ vbox/vbox_V4_3.c vbox/vbox_CAPI_v4_3.h \ vbox/vbox_V4_3_4.c vbox/vbox_CAPI_v4_3_4.h \ + vbox/vbox_V5_0.c vbox/vbox_CAPI_v5_0.h \ vbox/vbox_common.c vbox/vbox_common.h \ vbox/vbox_uniformed_api.h \ vbox/vbox_get_driver.h \
I've got a compilation error after this patch: CC vbox/libvirt_driver_vbox_impl_la-vbox_V5_0.lo In file included from vbox/vbox_V5_0.c:13:0: vbox/vbox_tmpl.c:73:29: fatal error: vbox_CAPI_v5_0.h: No such file or directory # include "vbox_CAPI_v5_0.h" ^ compilation terminated. This is the problem I'm describing in 2/6. Michal

On 09.06.2016 13:07, Martin Pietsch wrote:
--- src/vbox/vbox_tmpl.c | 290 ++++++++++++++++++++++++++++++++------------------- 1 file changed, 183 insertions(+), 107 deletions(-)
When sending multiple patches it's considered good practice to thread them under a cover letter.
diff --git a/src/vbox/vbox_tmpl.c b/src/vbox/vbox_tmpl.c index 7a8205d..79ce001 100644 --- a/src/vbox/vbox_tmpl.c +++ b/src/vbox/vbox_tmpl.c @@ -69,6 +69,8 @@ # include "vbox_CAPI_v4_3.h" #elif VBOX_API_VERSION == 4003004 # include "vbox_CAPI_v4_3_4.h" +#elif VBOX_API_VERSION == 5000000 +# include "vbox_CAPI_v5_0.h" #else # error "Unsupport VBOX_API_VERSION" #endif @@ -228,18 +230,18 @@ static void nsIDtoChar(unsigned char *uuid, const nsID *iid) memcpy(uuidinterim, iid, VIR_UUID_BUFLEN); virUUIDFormat(uuidinterim, uuidstrsrc);
- uuidstrdst[0] = uuidstrsrc[6]; - uuidstrdst[1] = uuidstrsrc[7]; - uuidstrdst[2] = uuidstrsrc[4]; - uuidstrdst[3] = uuidstrsrc[5]; - uuidstrdst[4] = uuidstrsrc[2]; - uuidstrdst[5] = uuidstrsrc[3]; - uuidstrdst[6] = uuidstrsrc[0]; - uuidstrdst[7] = uuidstrsrc[1]; + uuidstrdst[0] = uuidstrsrc[6]; + uuidstrdst[1] = uuidstrsrc[7]; + uuidstrdst[2] = uuidstrsrc[4]; + uuidstrdst[3] = uuidstrsrc[5]; + uuidstrdst[4] = uuidstrsrc[2]; + uuidstrdst[5] = uuidstrsrc[3]; + uuidstrdst[6] = uuidstrsrc[0]; + uuidstrdst[7] = uuidstrsrc[1];
- uuidstrdst[8] = uuidstrsrc[8]; + uuidstrdst[8] = uuidstrsrc[8];
- uuidstrdst[9] = uuidstrsrc[11]; + uuidstrdst[9] = uuidstrsrc[11]; uuidstrdst[10] = uuidstrsrc[12]; uuidstrdst[11] = uuidstrsrc[9]; uuidstrdst[12] = uuidstrsrc[10];
There is plenty of white space changes that make no sense. Just like this one. I think it should be dropped. Michal
participants (2)
-
Martin Pietsch
-
Michal Privoznik