---
src/vbox/vbox_network.c | 77 +++++++++++++++++++++++++++++++++++++++++
src/vbox/vbox_tmpl.c | 52 ++++------------------------
src/vbox/vbox_uniformed_api.h | 2 ++
3 files changed, 86 insertions(+), 45 deletions(-)
diff --git a/src/vbox/vbox_network.c b/src/vbox/vbox_network.c
index b2e9060..c6cb0e9 100644
--- a/src/vbox/vbox_network.c
+++ b/src/vbox/vbox_network.c
@@ -23,6 +23,7 @@
#include "domain_conf.h"
#include "domain_event.h"
#include "virlog.h"
+#include "virstring.h"
#include "vbox_common.h"
#include "vbox_uniformed_api.h"
@@ -31,6 +32,25 @@
VIR_LOG_INIT("vbox.vbox_network");
+#define VBOX_UTF16_FREE(arg) \
+ do { \
+ if (arg) { \
+ gVBoxAPI.UPFN.Utf16Free(data->pFuncs, arg); \
+ (arg) = NULL; \
+ } \
+ } while (0)
+
+#define VBOX_UTF8_FREE(arg) \
+ do { \
+ if (arg) { \
+ gVBoxAPI.UPFN.Utf8Free(data->pFuncs, arg); \
+ (arg) = NULL; \
+ } \
+ } while (0)
+
+#define VBOX_UTF16_TO_UTF8(arg1, arg2) gVBoxAPI.UPFN.Utf16ToUtf8(data->pFuncs, arg1,
arg2)
+#define VBOX_UTF8_TO_UTF16(arg1, arg2) gVBoxAPI.UPFN.Utf8ToUtf16(data->pFuncs, arg1,
arg2)
+
#define VBOX_RELEASE(arg) \
do { \
if (arg) { \
@@ -118,3 +138,60 @@ int vboxConnectNumOfNetworks(virConnectPtr conn)
VIR_DEBUG("numActive: %d", ret);
return ret;
}
+
+int vboxConnectListNetworks(virConnectPtr conn, char **const names, int nnames)
+{
+ 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; (ret < nnames) && (i < networkInterfaces.count); i++) {
+ IHostNetworkInterface *networkInterface = networkInterfaces.items[i];
+ char *nameUtf8 = NULL;
+ PRUnichar *nameUtf16 = NULL;
+ PRUint32 interfaceType = 0;
+ PRUint32 status = HostNetworkInterfaceStatus_Unknown;
+
+ if (!networkInterface)
+ continue;
+
+ gVBoxAPI.UIHNInterface.GetInterfaceType(networkInterface, &interfaceType);
+
+ if (interfaceType != HostNetworkInterfaceType_HostOnly)
+ continue;
+
+ gVBoxAPI.UIHNInterface.GetStatus(networkInterface, &status);
+
+ if (status != HostNetworkInterfaceStatus_Up)
+ continue;
+
+ gVBoxAPI.UIHNInterface.GetName(networkInterface, &nameUtf16);
+ VBOX_UTF16_TO_UTF8(nameUtf16, &nameUtf8);
+
+ VIR_DEBUG("nnames[%d]: %s", ret, nameUtf8);
+ if (VIR_STRDUP(names[ret], nameUtf8) >= 0)
+ ret++;
+
+ VBOX_UTF8_FREE(nameUtf8);
+ VBOX_UTF16_FREE(nameUtf16);
+ }
+
+ gVBoxAPI.UArray.vboxArrayRelease(&networkInterfaces);
+
+ VBOX_RELEASE(host);
+
+ return ret;
+}
diff --git a/src/vbox/vbox_tmpl.c b/src/vbox/vbox_tmpl.c
index 324e5d6..c7aae25 100644
--- a/src/vbox/vbox_tmpl.c
+++ b/src/vbox/vbox_tmpl.c
@@ -2060,51 +2060,6 @@ _registerDomainEvent(virDriverPtr driver)
* The Network Functions here on
*/
-static int vboxConnectListNetworks(virConnectPtr conn, char **const names, int nnames) {
- 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; (ret < nnames) && (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) {
- char *nameUtf8 = NULL;
- PRUnichar *nameUtf16 = NULL;
-
- networkInterface->vtbl->GetName(networkInterface,
&nameUtf16);
- VBOX_UTF16_TO_UTF8(nameUtf16, &nameUtf8);
-
- VIR_DEBUG("nnames[%d]: %s", ret, nameUtf8);
- if (VIR_STRDUP(names[ret], nameUtf8) >= 0)
- ret++;
-
- VBOX_UTF8_FREE(nameUtf8);
- VBOX_UTF16_FREE(nameUtf16);
- }
- }
- }
- }
-
- vboxArrayRelease(&networkInterfaces);
-
- VBOX_RELEASE(host);
-
- return ret;
-}
-
static int vboxConnectNumOfDefinedNetworks(virConnectPtr conn)
{
VBOX_OBJECT_HOST_CHECK(conn, int, 0);
@@ -6032,6 +5987,12 @@ _hnInterfaceGetStatus(IHostNetworkInterface *hni, PRUint32
*status)
return hni->vtbl->GetStatus(hni, status);
}
+static nsresult
+_hnInterfaceGetName(IHostNetworkInterface *hni, PRUnichar **name)
+{
+ return hni->vtbl->GetName(hni, name);
+}
+
static bool _machineStateOnline(PRUint32 state)
{
return ((state >= MachineState_FirstOnline) &&
@@ -6338,6 +6299,7 @@ static vboxUniformedIDisplay _UIDisplay = {
static vboxUniformedIHNInterface _UIHNInterface = {
.GetInterfaceType = _hnInterfaceGetInterfaceType,
.GetStatus = _hnInterfaceGetStatus,
+ .GetName = _hnInterfaceGetName,
};
static uniformedMachineStateChecker _machineStateChecker = {
diff --git a/src/vbox/vbox_uniformed_api.h b/src/vbox/vbox_uniformed_api.h
index 9644f61..ec8e334 100644
--- a/src/vbox/vbox_uniformed_api.h
+++ b/src/vbox/vbox_uniformed_api.h
@@ -470,6 +470,7 @@ typedef struct {
typedef struct {
nsresult (*GetInterfaceType)(IHostNetworkInterface *hni, PRUint32 *interfaceType);
nsresult (*GetStatus)(IHostNetworkInterface *hni, PRUint32 *status);
+ nsresult (*GetName)(IHostNetworkInterface *hni, PRUnichar **name);
} vboxUniformedIHNInterface;
typedef struct {
@@ -548,6 +549,7 @@ virDrvOpenStatus vboxNetworkOpen(virConnectPtr conn,
unsigned int flags);
int vboxNetworkClose(virConnectPtr conn);
int vboxConnectNumOfNetworks(virConnectPtr conn);
+int vboxConnectListNetworks(virConnectPtr conn, char **const names, int nnames);
/* Version specified functions for installing uniformed API */
void vbox22InstallUniformedAPI(vboxUniformedAPI *pVBoxAPI);
--
1.7.9.5