--- src/vbox/vbox_network.c | 65 +++++++++++++++++++++++++++++++++++++++++ src/vbox/vbox_tmpl.c | 57 +++++++++--------------------------- src/vbox/vbox_uniformed_api.h | 8 +++++ 3 files changed, 86 insertions(+), 44 deletions(-) diff --git a/src/vbox/vbox_network.c b/src/vbox/vbox_network.c index 6d2ecdc..0405265 100644 --- a/src/vbox/vbox_network.c +++ b/src/vbox/vbox_network.c @@ -59,6 +59,19 @@ VIR_LOG_INIT("vbox.vbox_network"); } \ } while (0) +#define vboxIIDUnalloc(iid) gVBoxAPI.UIID.vboxIIDUnalloc(data, iid) +#define vboxIIDToUUID(iid, uuid) gVBoxAPI.UIID.vboxIIDToUUID(data, iid, uuid) +#define vboxIIDFromUUID(iid, uuid) gVBoxAPI.UIID.vboxIIDFromUUID(data, iid, uuid) +#define vboxIIDIsEqual(iid1, iid2) gVBoxAPI.UIID.vboxIIDIsEqual(data, iid1, iid2) +#define DEBUGIID(msg, iid) gVBoxAPI.UIID.DEBUGIID(msg, iid) +#define vboxIIDFromArrayItem(iid, array, idx) \ + gVBoxAPI.UIID.vboxIIDFromArrayItem(data, iid, array, idx) + +#define VBOX_IID_INITIALIZE(iid) gVBoxAPI.UIID.vboxIIDInitialize(iid) + +#define ARRAY_GET_MACHINES \ + (gVBoxAPI.UArray.handleGetMachines(data->vboxObj)) + static vboxUniformedAPI gVBoxAPI; /** @@ -297,3 +310,55 @@ int vboxConnectListDefinedNetworks(virConnectPtr conn, char **const names, int n return ret; } + +virNetworkPtr vboxNetworkLookupByUUID(virConnectPtr conn, const unsigned char *uuid) +{ + vboxGlobalData *data = conn->privateData; + PRUint32 interfaceType = 0; + char *nameUtf8 = NULL; + PRUnichar *nameUtf16 = NULL; + IHostNetworkInterface *networkInterface = NULL; + vboxIIDUnion iid; + IHost *host = NULL; + virNetworkPtr ret = NULL; + + if (!data->vboxObj) + return ret; + + gVBoxAPI.UIVirtualBox.GetHost(data->vboxObj, &host); + if (!host) + return ret; + + VBOX_IID_INITIALIZE(&iid); + vboxIIDFromUUID(&iid, uuid); + + /* TODO: "internal" networks are just strings and + * thus can't do much with them + */ + + gVBoxAPI.UIHost.FindHostNetworkInterfaceById(host, &iid, + &networkInterface); + if (!networkInterface) + goto cleanup; + + gVBoxAPI.UIHNInterface.GetInterfaceType(networkInterface, &interfaceType); + + if (interfaceType != HostNetworkInterfaceType_HostOnly) + goto cleanup; + + gVBoxAPI.UIHNInterface.GetName(networkInterface, &nameUtf16); + VBOX_UTF16_TO_UTF8(nameUtf16, &nameUtf8); + + ret = virGetNetwork(conn, nameUtf8, uuid); + + VIR_DEBUG("Network Name: %s", nameUtf8); + DEBUGIID("Network UUID", &iid); + VBOX_UTF8_FREE(nameUtf8); + VBOX_UTF16_FREE(nameUtf16); + + cleanup: + VBOX_RELEASE(networkInterface); + VBOX_RELEASE(host); + vboxIIDUnalloc(&iid); + return ret; +} diff --git a/src/vbox/vbox_tmpl.c b/src/vbox/vbox_tmpl.c index ed75656..8675182 100644 --- a/src/vbox/vbox_tmpl.c +++ b/src/vbox/vbox_tmpl.c @@ -2061,50 +2061,6 @@ _registerDomainEvent(virDriverPtr driver) */ static virNetworkPtr -vboxNetworkLookupByUUID(virConnectPtr conn, const unsigned char *uuid) -{ - VBOX_OBJECT_HOST_CHECK(conn, virNetworkPtr, NULL); - vboxIID iid = VBOX_IID_INITIALIZER; - - vboxIIDFromUUID(&iid, uuid); - - /* TODO: "internal" networks are just strings and - * thus can't do much with them - */ - IHostNetworkInterface *networkInterface = NULL; - - host->vtbl->FindHostNetworkInterfaceById(host, iid.value, &networkInterface); - if (networkInterface) { - PRUint32 interfaceType = 0; - - networkInterface->vtbl->GetInterfaceType(networkInterface, &interfaceType); - - if (interfaceType == HostNetworkInterfaceType_HostOnly) { - char *nameUtf8 = NULL; - PRUnichar *nameUtf16 = NULL; - - networkInterface->vtbl->GetName(networkInterface, &nameUtf16); - VBOX_UTF16_TO_UTF8(nameUtf16, &nameUtf8); - - ret = virGetNetwork(conn, nameUtf8, uuid); - - VIR_DEBUG("Network Name: %s", nameUtf8); - DEBUGIID("Network UUID", iid.value); - - VBOX_UTF8_FREE(nameUtf8); - VBOX_UTF16_FREE(nameUtf16); - } - - VBOX_RELEASE(networkInterface); - } - - VBOX_RELEASE(host); - - vboxIIDUnalloc(&iid); - return ret; -} - -static virNetworkPtr vboxNetworkLookupByName(virConnectPtr conn, const char *name) { VBOX_OBJECT_HOST_CHECK(conn, virNetworkPtr, NULL); @@ -5897,6 +5853,14 @@ _displayTakeScreenShotPNGToArray(IDisplay *display ATTRIBUTE_UNUSED, } static nsresult +_hostFindHostNetworkInterfaceById(IHost *host, vboxIIDUnion *iidu, + IHostNetworkInterface **networkInterface) +{ + return host->vtbl->FindHostNetworkInterfaceById(host, IID_MEMBER(value), + networkInterface); +} + +static nsresult _hnInterfaceGetInterfaceType(IHostNetworkInterface *hni, PRUint32 *interfaceType) { return hni->vtbl->GetInterfaceType(hni, interfaceType); @@ -6217,6 +6181,10 @@ static vboxUniformedIDisplay _UIDisplay = { .TakeScreenShotPNGToArray = _displayTakeScreenShotPNGToArray, }; +static vboxUniformedIHost _UIHost = { + .FindHostNetworkInterfaceById = _hostFindHostNetworkInterfaceById, +}; + static vboxUniformedIHNInterface _UIHNInterface = { .GetInterfaceType = _hnInterfaceGetInterfaceType, .GetStatus = _hnInterfaceGetStatus, @@ -6276,6 +6244,7 @@ void NAME(InstallUniformedAPI)(vboxUniformedAPI *pVBoxAPI) pVBoxAPI->UISharedFolder = _UISharedFolder; pVBoxAPI->UISnapshot = _UISnapshot; pVBoxAPI->UIDisplay = _UIDisplay; + pVBoxAPI->UIHost = _UIHost; pVBoxAPI->UIHNInterface = _UIHNInterface; pVBoxAPI->machineStateChecker = _machineStateChecker; diff --git a/src/vbox/vbox_uniformed_api.h b/src/vbox/vbox_uniformed_api.h index e6729f2..2e0eb10 100644 --- a/src/vbox/vbox_uniformed_api.h +++ b/src/vbox/vbox_uniformed_api.h @@ -466,6 +466,12 @@ typedef struct { PRUint8** screenData); } vboxUniformedIDisplay; +/* Functions for IHost */ +typedef struct { + nsresult (*FindHostNetworkInterfaceById)(IHost *host, vboxIIDUnion *iidu, + IHostNetworkInterface **networkInterface); +} vboxUniformedIHost; + /* Functions for IHostNetworkInterface */ typedef struct { nsresult (*GetInterfaceType)(IHostNetworkInterface *hni, PRUint32 *interfaceType); @@ -527,6 +533,7 @@ typedef struct { vboxUniformedISharedFolder UISharedFolder; vboxUniformedISnapshot UISnapshot; vboxUniformedIDisplay UIDisplay; + vboxUniformedIHost UIHost; vboxUniformedIHNInterface UIHNInterface; uniformedMachineStateChecker machineStateChecker; /* vbox API features */ @@ -552,6 +559,7 @@ int vboxConnectNumOfNetworks(virConnectPtr conn); 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); /* Version specified functions for installing uniformed API */ void vbox22InstallUniformedAPI(vboxUniformedAPI *pVBoxAPI); -- 1.7.9.5 -- libvir-list mailing list libvir-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/libvir-list