src/vbox/vbox_driver.c
src/vbox/vbox_common.c
src/vbox/vbox_network.c
+src/vbox/vbox_storage.c
src/vbox/vbox_snapshot_conf.c
src/vbox/vbox_tmpl.c
src/vmware/vmware_conf.c
HostNetworkInterfaceType_HostOnly = 2
};
+enum MediaState
+{
+ MediaState_NotCreated = 0,
+ MediaState_Created = 1,
+ MediaState_LockedRead = 2,
+ MediaState_LockedWrite = 3,
+ MediaState_Inaccessible = 4,
+ MediaState_Creating = 5,
+ MediaState_Deleting = 6
+};
+
# define VBOX_E_OBJECT_NOT_FOUND 0x80BB0001
# define VBOX_E_INVALID_VM_STATE 0x80BB0002
# define VBOX_E_VM_ERROR 0x80BB0003
typedef nsISupports IHost;
typedef nsISupports IHostNetworkInterface;
typedef nsISupports IDHCPServer;
+typedef IMedium IHardDisk;
/* Macros for all vbox drivers. */
VIR_LOG_INIT("vbox.vbox_storage");
+static vboxUniformedAPI gVBoxAPI;
+
/**
* The Storage Functions here on
*/
return ret;
}
+
+int vboxStoragePoolNumOfVolumes(virStoragePoolPtr pool)
+{
+ vboxGlobalData *data = pool->conn->privateData;
+ vboxArray hardDisks = VBOX_ARRAY_INITIALIZER;
+ PRUint32 hardDiskAccessible = 0;
+ nsresult rc;
+ size_t i;
+ int ret = -1;
+
+ if (!data->vboxObj) {
+ return ret;
+ }
+
+ rc = gVBoxAPI.UArray.vboxArrayGet(&hardDisks, data->vboxObj,
+ gVBoxAPI.UArray.handleGetHardDisks(data->vboxObj));
+ if (NS_FAILED(rc)) {
+ virReportError(VIR_ERR_INTERNAL_ERROR,
+ _("could not get number of volumes in the pool: %s, rc=%08x"),
+ pool->name, (unsigned)rc);
+ return ret;
+ }
+
+ for (i = 0; i < hardDisks.count; ++i) {
+ IHardDisk *hardDisk = hardDisks.items[i];
+ PRUint32 hddstate;
+
+ if (!hardDisk)
+ continue;
+
+ gVBoxAPI.UIMedium.GetState(hardDisk, &hddstate);
+ if (hddstate != MediaState_Inaccessible)
+ hardDiskAccessible++;
+ }
+
+ gVBoxAPI.UArray.vboxArrayRelease(&hardDisks);
+
+ ret = hardDiskAccessible;
+
+ return ret;
+}
* The Storage Functions here on
*/
-static int vboxStoragePoolNumOfVolumes(virStoragePoolPtr pool)
-{
- VBOX_OBJECT_CHECK(pool->conn, int, -1);
- vboxArray hardDisks = VBOX_ARRAY_INITIALIZER;
- PRUint32 hardDiskAccessible = 0;
- nsresult rc;
- size_t i;
-
- rc = vboxArrayGet(&hardDisks, data->vboxObj, data->vboxObj->vtbl->GetHardDisks);
- if (NS_SUCCEEDED(rc)) {
- for (i = 0; i < hardDisks.count; ++i) {
- IHardDisk *hardDisk = hardDisks.items[i];
- if (hardDisk) {
- PRUint32 hddstate;
-
- VBOX_MEDIUM_FUNC_ARG1(hardDisk, GetState, &hddstate);
- if (hddstate != MediaState_Inaccessible)
- hardDiskAccessible++;
- }
- }
-
- vboxArrayRelease(&hardDisks);
-
- ret = hardDiskAccessible;
- } else {
- ret = -1;
- virReportError(VIR_ERR_INTERNAL_ERROR,
- _("could not get number of volumes in the pool: %s, rc=%08x"),
- pool->name, (unsigned)rc);
- }
-
- return ret;
-}
-
static int vboxStoragePoolListVolumes(virStoragePoolPtr pool, char **const names, int nnames) {
VBOX_OBJECT_CHECK(pool->conn, int, -1);
vboxArray hardDisks = VBOX_ARRAY_INITIALIZER;
return vboxObj->vtbl->GetMachines;
}
+static void* _handleGetHardDisks(IVirtualBox *vboxObj)
+{
+ return vboxObj->vtbl->GetHardDisks;
+}
+
static void* _handleUSBGetDeviceFilters(IUSBCommon *USBCommon)
{
return USBCommon->vtbl->GetDeviceFilters;
return medium->vtbl->GetLocation(medium, location);
}
+static nsresult _mediumGetState(IMedium *medium, PRUint32 *state)
+{
+ return medium->vtbl->GetState(medium, state);
+}
+
static nsresult _mediumGetReadOnly(IMedium *medium ATTRIBUTE_UNUSED,
PRBool *readOnly ATTRIBUTE_UNUSED)
{
.vboxArrayGetWithIIDArg = _vboxArrayGetWithIIDArg,
.vboxArrayRelease = vboxArrayRelease,
.handleGetMachines = _handleGetMachines,
+ .handleGetHardDisks = _handleGetHardDisks,
.handleUSBGetDeviceFilters = _handleUSBGetDeviceFilters,
.handleMachineGetMediumAttachments = _handleMachineGetMediumAttachments,
.handleMachineGetSharedFolders = _handleMachineGetSharedFolders,
static vboxUniformedIMedium _UIMedium = {
.GetId = _mediumGetId,
.GetLocation = _mediumGetLocation,
+ .GetState = _mediumGetState,
.GetReadOnly = _mediumGetReadOnly,
.GetParent = _mediumGetParent,
.GetChildren = _mediumGetChildren,
void (*vboxArrayRelease)(vboxArray *array);
/* Generate function pointers for vboxArrayGet */
void* (*handleGetMachines)(IVirtualBox *vboxObj);
+ void* (*handleGetHardDisks)(IVirtualBox *vboxObj);
void* (*handleUSBGetDeviceFilters)(IUSBCommon *USBCommon);
void* (*handleMachineGetMediumAttachments)(IMachine *machine);
void* (*handleMachineGetSharedFolders)(IMachine *machine);
typedef struct {
nsresult (*GetId)(IMedium *medium, vboxIIDUnion *iidu);
nsresult (*GetLocation)(IMedium *medium, PRUnichar **location);
+ nsresult (*GetState)(IMedium *medium, PRUint32 *state);
nsresult (*GetReadOnly)(IMedium *medium, PRBool *readOnly);
nsresult (*GetParent)(IMedium *medium, IMedium **parent);
nsresult (*GetChildren)(IMedium *medium, PRUint32 *childrenSize, IMedium ***children);
int vboxConnectNumOfStoragePools(virConnectPtr conn);
int vboxConnectListStoragePools(virConnectPtr conn, char **const names, int nnames);
virStoragePoolPtr vboxStoragePoolLookupByName(virConnectPtr conn, const char *name);
+int vboxStoragePoolNumOfVolumes(virStoragePoolPtr pool);
/* Version specified functions for installing uniformed API */
void vbox22InstallUniformedAPI(vboxUniformedAPI *pVBoxAPI);