From ee951b9fe78acec4dbd163a4c2ffe3063d176bfc Mon Sep 17 00:00:00 2001 From: Taowei Date: Thu, 2 Oct 2014 11:30:33 +0800 Subject: [PATCH] vbox: Rewrite vboxNetworkLookupByName --- src/vbox/vbox_network.c | 49 +++++++++++++++++++++++++++++++ src/vbox/vbox_tmpl.c | 54 +++++++++++------------------------ src/vbox/vbox_uniformed_api.h | 4 +++ 3 files changed, 69 insertions(+), 38 deletions(-) diff --git a/src/vbox/vbox_network.c b/src/vbox/vbox_network.c index ba4c272de3..80ff04fd94 100644 --- a/src/vbox/vbox_network.c +++ b/src/vbox/vbox_network.c @@ -364,3 +364,52 @@ virNetworkPtr vboxNetworkLookupByUUID(virConnectPtr conn, const unsigned char *u vboxIIDUnalloc(&iid); return ret; } + +virNetworkPtr vboxNetworkLookupByName(virConnectPtr conn, const char *name) +{ + vboxGlobalData *data = conn->privateData; + PRUnichar *nameUtf16 = NULL; + IHostNetworkInterface *networkInterface = NULL; + PRUint32 interfaceType = 0; + unsigned char uuid[VIR_UUID_BUFLEN]; + vboxIIDUnion iid; + IHost *host = NULL; + virNetworkPtr ret = NULL; + nsresult rc; + + if (!data->vboxObj) + return ret; + + gVBoxAPI.UIVirtualBox.GetHost(data->vboxObj, &host); + if (!host) + return ret; + + VBOX_IID_INITIALIZE(&iid); + VBOX_UTF8_TO_UTF16(name, &nameUtf16); + + gVBoxAPI.UIHost.FindHostNetworkInterfaceByName(host, nameUtf16, &networkInterface); + + if (!networkInterface) + goto cleanup; + + gVBoxAPI.UIHNInterface.GetInterfaceType(networkInterface, &interfaceType); + + if (interfaceType != HostNetworkInterfaceType_HostOnly) + goto cleanup; + + rc = gVBoxAPI.UIHNInterface.GetId(networkInterface, &iid); + if (NS_FAILED(rc)) + goto cleanup; + vboxIIDToUUID(&iid, uuid); + ret = virGetNetwork(conn, name, uuid); + + VIR_DEBUG("Network Name: %s", name); + DEBUGIID("Network UUID", &iid); + vboxIIDUnalloc(&iid); + + cleanup: + VBOX_RELEASE(networkInterface); + VBOX_UTF16_FREE(nameUtf16); + VBOX_RELEASE(host); + return ret; +} diff --git a/src/vbox/vbox_tmpl.c b/src/vbox/vbox_tmpl.c index 867518236d..fa55325a3a 100644 --- a/src/vbox/vbox_tmpl.c +++ b/src/vbox/vbox_tmpl.c @@ -2060,44 +2060,6 @@ _registerDomainEvent(virDriverPtr driver) * The Network Functions here on */ -static virNetworkPtr -vboxNetworkLookupByName(virConnectPtr conn, const char *name) -{ - VBOX_OBJECT_HOST_CHECK(conn, virNetworkPtr, NULL); - PRUnichar *nameUtf16 = NULL; - IHostNetworkInterface *networkInterface = NULL; - - VBOX_UTF8_TO_UTF16(name, &nameUtf16); - - host->vtbl->FindHostNetworkInterfaceByName(host, nameUtf16, &networkInterface); - - if (networkInterface) { - PRUint32 interfaceType = 0; - - networkInterface->vtbl->GetInterfaceType(networkInterface, &interfaceType); - - if (interfaceType == HostNetworkInterfaceType_HostOnly) { - unsigned char uuid[VIR_UUID_BUFLEN]; - vboxIID iid = VBOX_IID_INITIALIZER; - - networkInterface->vtbl->GetId(networkInterface, &iid.value); - vboxIIDToUUID(&iid, uuid); - ret = virGetNetwork(conn, name, uuid); - VIR_DEBUG("Network Name: %s", name); - - DEBUGIID("Network UUID", iid.value); - vboxIIDUnalloc(&iid); - } - - VBOX_RELEASE(networkInterface); - } - - VBOX_UTF16_FREE(nameUtf16); - VBOX_RELEASE(host); - - return ret; -} - static virNetworkPtr vboxNetworkDefineCreateXML(virConnectPtr conn, const char *xml, bool start) { @@ -5860,6 +5822,14 @@ _hostFindHostNetworkInterfaceById(IHost *host, vboxIIDUnion *iidu, networkInterface); } +static nsresult +_hostFindHostNetworkInterfaceByName(IHost *host, PRUnichar *name, + IHostNetworkInterface **networkInterface) +{ + return host->vtbl->FindHostNetworkInterfaceByName(host, name, + networkInterface); +} + static nsresult _hnInterfaceGetInterfaceType(IHostNetworkInterface *hni, PRUint32 *interfaceType) { @@ -5878,6 +5848,12 @@ _hnInterfaceGetName(IHostNetworkInterface *hni, PRUnichar **name) return hni->vtbl->GetName(hni, name); } +static nsresult +_hnInterfaceGetId(IHostNetworkInterface *hni, vboxIIDUnion *iidu) +{ + return hni->vtbl->GetId(hni, &IID_MEMBER(value)); +} + static bool _machineStateOnline(PRUint32 state) { return ((state >= MachineState_FirstOnline) && @@ -6183,12 +6159,14 @@ static vboxUniformedIDisplay _UIDisplay = { static vboxUniformedIHost _UIHost = { .FindHostNetworkInterfaceById = _hostFindHostNetworkInterfaceById, + .FindHostNetworkInterfaceByName = _hostFindHostNetworkInterfaceByName, }; static vboxUniformedIHNInterface _UIHNInterface = { .GetInterfaceType = _hnInterfaceGetInterfaceType, .GetStatus = _hnInterfaceGetStatus, .GetName = _hnInterfaceGetName, + .GetId = _hnInterfaceGetId, }; static uniformedMachineStateChecker _machineStateChecker = { diff --git a/src/vbox/vbox_uniformed_api.h b/src/vbox/vbox_uniformed_api.h index 2e0eb1093a..a14ee1ce59 100644 --- a/src/vbox/vbox_uniformed_api.h +++ b/src/vbox/vbox_uniformed_api.h @@ -470,6 +470,8 @@ typedef struct { typedef struct { nsresult (*FindHostNetworkInterfaceById)(IHost *host, vboxIIDUnion *iidu, IHostNetworkInterface **networkInterface); + nsresult (*FindHostNetworkInterfaceByName)(IHost *host, PRUnichar *name, + IHostNetworkInterface **networkInterface); } vboxUniformedIHost; /* Functions for IHostNetworkInterface */ @@ -477,6 +479,7 @@ typedef struct { nsresult (*GetInterfaceType)(IHostNetworkInterface *hni, PRUint32 *interfaceType); nsresult (*GetStatus)(IHostNetworkInterface *hni, PRUint32 *status); nsresult (*GetName)(IHostNetworkInterface *hni, PRUnichar **name); + nsresult (*GetId)(IHostNetworkInterface *hni, vboxIIDUnion *iidu); } vboxUniformedIHNInterface; typedef struct { @@ -560,6 +563,7 @@ int vboxConnectListNetworks(virConnectPtr conn, char **const names, int nnames); int vboxConnectNumOfDefinedNetworks(virConnectPtr conn); int vboxConnectListDefinedNetworks(virConnectPtr conn, char **const names, int nnames); virNetworkPtr vboxNetworkLookupByUUID(virConnectPtr conn, const unsigned char *uuid); +virNetworkPtr vboxNetworkLookupByName(virConnectPtr conn, const char *name); /* Version specified functions for installing uniformed API */ void vbox22InstallUniformedAPI(vboxUniformedAPI *pVBoxAPI);