diff --git a/src/vbox/vbox_common.h b/src/vbox/vbox_common.h index b5a035381d..9f5385ba55 100644 --- a/src/vbox/vbox_common.h +++ b/src/vbox/vbox_common.h @@ -265,6 +265,19 @@ enum MediumVariant MediumVariant_Diff = 0x20000 }; +enum HostNetworkInterfaceStatus +{ + HostNetworkInterfaceStatus_Unknown = 0, + HostNetworkInterfaceStatus_Up = 1, + HostNetworkInterfaceStatus_Down = 2 +}; + +enum HostNetworkInterfaceType +{ + HostNetworkInterfaceType_Bridged = 1, + HostNetworkInterfaceType_HostOnly = 2 +}; + # define VBOX_E_OBJECT_NOT_FOUND 0x80BB0001 # define VBOX_E_INVALID_VM_STATE 0x80BB0002 # define VBOX_E_VM_ERROR 0x80BB0003 @@ -302,5 +315,7 @@ typedef nsISupports IStorageController; typedef nsISupports ISharedFolder; typedef nsISupports ISnapshot; typedef nsISupports IDisplay; +typedef nsISupports IHost; +typedef nsISupports IHostNetworkInterface; #endif /* VBOX_COMMON_H */ diff --git a/src/vbox/vbox_network.c b/src/vbox/vbox_network.c index 7f5e2d480c..206ef0f5e8 100644 --- a/src/vbox/vbox_network.c +++ b/src/vbox/vbox_network.c @@ -33,6 +33,16 @@ VIR_LOG_INIT("vbox.vbox_network"); +#define VBOX_RELEASE(arg) \ + do { \ + if (arg) { \ + gVBoxAPI.nsUISupports.Release((void *)arg); \ + (arg) = NULL; \ + } \ + } while (0) + +static vboxUniformedAPI gVBoxAPI; + /** * The Network Functions here on */ @@ -65,3 +75,48 @@ int vboxNetworkClose(virConnectPtr conn) conn->networkPrivateData = NULL; return 0; } + +int vboxConnectNumOfNetworks(virConnectPtr conn) +{ + vboxGlobalData *data = conn->privateData; + vboxArray networkInterfaces = VBOX_ARRAY_INITIALIZER; + IHost *host = NULL; + size_t i = 0; + int ret = -1; + + if (!data->vboxObj) + return ret; + + gVBoxAPI.UIVirtualBox.GetHost(data->vboxObj, &host); + if (!host) + return ret; + + gVBoxAPI.UArray.vboxArrayGet(&networkInterfaces, host, + gVBoxAPI.UArray.handleHostGetNetworkInterfaces(host)); + + ret = 0; + for (i = 0; i < networkInterfaces.count; i++) { + IHostNetworkInterface *networkInterface = networkInterfaces.items[i]; + PRUint32 status = HostNetworkInterfaceStatus_Unknown; + PRUint32 interfaceType = 0; + + if (!networkInterface) + continue; + + gVBoxAPI.UIHNInterface.GetInterfaceType(networkInterface, &interfaceType); + if (interfaceType != HostNetworkInterfaceType_HostOnly) + continue; + + gVBoxAPI.UIHNInterface.GetStatus(networkInterface, &status); + + if (status == HostNetworkInterfaceStatus_Up) + ret++; + } + + gVBoxAPI.UArray.vboxArrayRelease(&networkInterfaces); + + VBOX_RELEASE(host); + + VIR_DEBUG("numActive: %d", ret); + return ret; +} diff --git a/src/vbox/vbox_tmpl.c b/src/vbox/vbox_tmpl.c index 06b8722ed8..324e5d6590 100644 --- a/src/vbox/vbox_tmpl.c +++ b/src/vbox/vbox_tmpl.c @@ -2060,40 +2060,6 @@ _registerDomainEvent(virDriverPtr driver) * The Network Functions here on */ -static int vboxConnectNumOfNetworks(virConnectPtr conn) -{ - VBOX_OBJECT_HOST_CHECK(conn, int, 0); - vboxArray networkInterfaces = VBOX_ARRAY_INITIALIZER; - size_t i = 0; - - vboxArrayGet(&networkInterfaces, host, host->vtbl->GetNetworkInterfaces); - - for (i = 0; i < networkInterfaces.count; i++) { - IHostNetworkInterface *networkInterface = networkInterfaces.items[i]; - - if (networkInterface) { - PRUint32 interfaceType = 0; - - networkInterface->vtbl->GetInterfaceType(networkInterface, &interfaceType); - if (interfaceType == HostNetworkInterfaceType_HostOnly) { - PRUint32 status = HostNetworkInterfaceStatus_Unknown; - - networkInterface->vtbl->GetStatus(networkInterface, &status); - - if (status == HostNetworkInterfaceStatus_Up) - ret++; - } - } - } - - vboxArrayRelease(&networkInterfaces); - - VBOX_RELEASE(host); - - VIR_DEBUG("numActive: %d", ret); - return ret; -} - static int vboxConnectListNetworks(virConnectPtr conn, char **const names, int nnames) { VBOX_OBJECT_HOST_CHECK(conn, int, 0); vboxArray networkInterfaces = VBOX_ARRAY_INITIALIZER; @@ -4501,6 +4467,11 @@ static void* _handleMediumGetSnapshotIds(IMedium *medium) return medium->vtbl->GetSnapshotIds; } +static void* _handleHostGetNetworkInterfaces(IHost *host) +{ + return host->vtbl->GetNetworkInterfaces; +} + static nsresult _nsisupportsRelease(nsISupports *nsi) { return nsi->vtbl->Release(nsi); @@ -4547,6 +4518,12 @@ _virtualboxGetSystemProperties(IVirtualBox *vboxObj, ISystemProperties **systemP return vboxObj->vtbl->GetSystemProperties(vboxObj, systemProperties); } +static nsresult +_virtualboxGetHost(IVirtualBox *vboxObj, IHost **host) +{ + return vboxObj->vtbl->GetHost(vboxObj, host); +} + static nsresult _virtualboxCreateMachine(vboxGlobalData *data, virDomainDefPtr def, IMachine **machine, char *uuidstr ATTRIBUTE_UNUSED) { @@ -6043,6 +6020,18 @@ _displayTakeScreenShotPNGToArray(IDisplay *display ATTRIBUTE_UNUSED, #endif /* VBOX_API_VERSION >= 4000000 */ } +static nsresult +_hnInterfaceGetInterfaceType(IHostNetworkInterface *hni, PRUint32 *interfaceType) +{ + return hni->vtbl->GetInterfaceType(hni, interfaceType); +} + +static nsresult +_hnInterfaceGetStatus(IHostNetworkInterface *hni, PRUint32 *status) +{ + return hni->vtbl->GetStatus(hni, status); +} + static bool _machineStateOnline(PRUint32 state) { return ((state >= MachineState_FirstOnline) && @@ -6109,6 +6098,7 @@ static vboxUniformedArray _UArray = { .handleSnapshotGetChildren = _handleSnapshotGetChildren, .handleMediumGetChildren = _handleMediumGetChildren, .handleMediumGetSnapshotIds = _handleMediumGetSnapshotIds, + .handleHostGetNetworkInterfaces = _handleHostGetNetworkInterfaces, }; static vboxUniformednsISupports _nsUISupports = { @@ -6121,6 +6111,7 @@ static vboxUniformedIVirtualBox _UIVirtualBox = { .GetMachine = _virtualboxGetMachine, .OpenMachine = _virtualboxOpenMachine, .GetSystemProperties = _virtualboxGetSystemProperties, + .GetHost = _virtualboxGetHost, .CreateMachine = _virtualboxCreateMachine, .CreateHardDiskMedium = _virtualboxCreateHardDiskMedium, .RegisterMachine = _virtualboxRegisterMachine, @@ -6344,6 +6335,11 @@ static vboxUniformedIDisplay _UIDisplay = { .TakeScreenShotPNGToArray = _displayTakeScreenShotPNGToArray, }; +static vboxUniformedIHNInterface _UIHNInterface = { + .GetInterfaceType = _hnInterfaceGetInterfaceType, + .GetStatus = _hnInterfaceGetStatus, +}; + static uniformedMachineStateChecker _machineStateChecker = { .Online = _machineStateOnline, .Inactive = _machineStateInactive, @@ -6397,6 +6393,7 @@ void NAME(InstallUniformedAPI)(vboxUniformedAPI *pVBoxAPI) pVBoxAPI->UISharedFolder = _UISharedFolder; pVBoxAPI->UISnapshot = _UISnapshot; pVBoxAPI->UIDisplay = _UIDisplay; + pVBoxAPI->UIHNInterface = _UIHNInterface; pVBoxAPI->machineStateChecker = _machineStateChecker; #if VBOX_API_VERSION <= 2002000 || VBOX_API_VERSION >= 4000000 diff --git a/src/vbox/vbox_uniformed_api.h b/src/vbox/vbox_uniformed_api.h index 8552efbe16..9644f6105f 100644 --- a/src/vbox/vbox_uniformed_api.h +++ b/src/vbox/vbox_uniformed_api.h @@ -176,6 +176,7 @@ typedef struct { void* (*handleSnapshotGetChildren)(ISnapshot *snapshot); void* (*handleMediumGetChildren)(IMedium *medium); void* (*handleMediumGetSnapshotIds)(IMedium *medium); + void* (*handleHostGetNetworkInterfaces)(IHost *host); } vboxUniformedArray; /* Functions for nsISupports */ @@ -190,6 +191,7 @@ typedef struct { nsresult (*GetMachine)(IVirtualBox *vboxObj, vboxIIDUnion *iidu, IMachine **machine); nsresult (*OpenMachine)(IVirtualBox *vboxObj, PRUnichar *settingsFile, IMachine **machine); nsresult (*GetSystemProperties)(IVirtualBox *vboxObj, ISystemProperties **systemProperties); + nsresult (*GetHost)(IVirtualBox *vboxObj, IHost **host); nsresult (*CreateMachine)(vboxGlobalData *data, virDomainDefPtr def, IMachine **machine, char *uuidstr); nsresult (*CreateHardDiskMedium)(IVirtualBox *vboxObj, PRUnichar *format, PRUnichar *location, IMedium **medium); nsresult (*RegisterMachine)(IVirtualBox *vboxObj, IMachine *machine); @@ -464,6 +466,12 @@ typedef struct { PRUint8** screenData); } vboxUniformedIDisplay; +/* Functions for IHostNetworkInterface */ +typedef struct { + nsresult (*GetInterfaceType)(IHostNetworkInterface *hni, PRUint32 *interfaceType); + nsresult (*GetStatus)(IHostNetworkInterface *hni, PRUint32 *status); +} vboxUniformedIHNInterface; + typedef struct { bool (*Online)(PRUint32 state); bool (*Inactive)(PRUint32 state); @@ -518,6 +526,7 @@ typedef struct { vboxUniformedISharedFolder UISharedFolder; vboxUniformedISnapshot UISnapshot; vboxUniformedIDisplay UIDisplay; + vboxUniformedIHNInterface UIHNInterface; uniformedMachineStateChecker machineStateChecker; /* vbox API features */ bool domainEventCallbacks; @@ -538,6 +547,7 @@ virDrvOpenStatus vboxNetworkOpen(virConnectPtr conn, virConnectAuthPtr auth, unsigned int flags); int vboxNetworkClose(virConnectPtr conn); +int vboxConnectNumOfNetworks(virConnectPtr conn); /* Version specified functions for installing uniformed API */ void vbox22InstallUniformedAPI(vboxUniformedAPI *pVBoxAPI);