Hi All, I have made some changes to the functions vboxNetworkCreateXML(), vboxNetworkDefineXML(), vboxNetworkUndefine() and vboxNetworkDestroy() to handle multiple host only interfaces as multiple host only interfaces are supported by VirtualBox 3.0 and greater. The patch's are as below: PATCH 1/2: Merged vboxNetworkCreateXML() and vboxNetworkDefineXML() and added code to handle multiple hostonly interfaces. PATCH 2/2: Merged vboxNetworkUndefine() and vboxNetworkDestroy() and added code to handle multiple hostonly interfaces. Regards, Pritesh
commit e32b0c4d92d0c2acfb43284c636d693625fedea7 Author: Pritesh Kothari <Pritesh.Kothari@xxxxxxx> Date: Thu Aug 13 14:24:44 2009 +0200 libvirt: Merged vboxNetworkUndefine() and vboxNetworkDestroy() and added code to handle multiple hostonly interfaces. diff --git a/src/vbox/vbox_tmpl.c b/src/vbox/vbox_tmpl.c index 6de277f..0180b9b 100644 --- a/src/vbox/vbox_tmpl.c +++ b/src/vbox/vbox_tmpl.c @@ -5191,7 +5191,7 @@ static virNetworkPtr vboxNetworkDefineXML(virConnectPtr conn, const char *xml) { return vboxNetworkDefineCreateXML(conn, xml, false); } -static int vboxNetworkUndefine(virNetworkPtr network) { +static int vboxNetworkUndefineDestroy(virNetworkPtr network, bool removeinterface) { vboxGlobalData *data = network->conn->privateData; char *networkNameUtf8 = NULL; int ret = -1; @@ -5230,19 +5230,48 @@ static int vboxNetworkUndefine(virNetworkPtr network) { PRUnichar *networkNameUtf16 = NULL; IDHCPServer *dhcpServer = NULL; +#if VBOX_API_VERSION != 2002 + if (removeinterface) { + PRUnichar *iidUtf16 = NULL; + IProgress *progress = NULL; + + networkInterface->vtbl->GetId(networkInterface, &iidUtf16); + + if (iidUtf16) { +#if VBOX_API_VERSION == 3000 + IHostNetworkInterface *netInt = NULL; + host->vtbl->RemoveHostOnlyNetworkInterface(host, iidUtf16, &netInt, &progress); + if (netInt) + netInt->vtbl->nsisupports.Release((nsISupports *) netInt); +#else /* VBOX_API_VERSION > 3000 */ + host->vtbl->RemoveHostOnlyNetworkInterface(host, iidUtf16, &progress); +#endif /* VBOX_API_VERSION > 3000 */ + data->pFuncs->pfnUtf16Free(iidUtf16); + } + + if (progress) { + progress->vtbl->WaitForCompletion(progress, -1); + progress->vtbl->nsisupports.Release((nsISupports *)progress); + } + } +#endif /* VBOX_API_VERSION != 2002 */ + data->pFuncs->pfnUtf8ToUtf16(networkNameUtf8 , &networkNameUtf16); data->vboxObj->vtbl->FindDHCPServerByNetworkName(data->vboxObj, networkNameUtf16, &dhcpServer); if (dhcpServer) { - data->vboxObj->vtbl->RemoveDHCPServer(data->vboxObj, dhcpServer); + dhcpServer->vtbl->SetEnabled(dhcpServer, PR_FALSE); + dhcpServer->vtbl->Stop(dhcpServer); + if (removeinterface) + data->vboxObj->vtbl->RemoveDHCPServer(data->vboxObj, dhcpServer); dhcpServer->vtbl->nsisupports.Release((nsISupports *) dhcpServer); } data->pFuncs->pfnUtf16Free(networkNameUtf16); - } + } networkInterface->vtbl->nsisupports.Release((nsISupports *) networkInterface); } @@ -5258,6 +5287,10 @@ cleanup: return ret; } +static int vboxNetworkUndefine(virNetworkPtr network) { + return vboxNetworkUndefineDestroy(network, true); +} + static int vboxNetworkCreate(virNetworkPtr network) { vboxGlobalData *data = network->conn->privateData; char *networkNameUtf8 = NULL; @@ -5337,74 +5370,7 @@ cleanup: } static int vboxNetworkDestroy(virNetworkPtr network) { - vboxGlobalData *data = network->conn->privateData; - char *networkNameUtf8 = NULL; - int ret = -1; - - /* Current limitation of the function for VirtualBox 2.2.* is - * that the default hostonly network "vboxnet0" is always active - * and thus all this functions does is stop the dhcp server, - * but the network can still be used without the dhcp server - * by giving the machine static IP - */ - - if (virAsprintf(&networkNameUtf8, "HostInterfaceNetworking-%s", network->name) < 0) { - virReportOOMError(network->conn); - goto cleanup; - } - - if (data->vboxObj) { - IHost *host = NULL; - - data->vboxObj->vtbl->GetHost(data->vboxObj, &host); - if (host) { - PRUnichar *networkInterfaceNameUtf16 = NULL; - IHostNetworkInterface *networkInterface = NULL; - - data->pFuncs->pfnUtf8ToUtf16(network->name, &networkInterfaceNameUtf16); - - host->vtbl->FindHostNetworkInterfaceByName(host, networkInterfaceNameUtf16, &networkInterface); - - if (networkInterface) { - PRUint32 interfaceType = 0; - - networkInterface->vtbl->GetInterfaceType(networkInterface, &interfaceType); - - if (interfaceType == HostNetworkInterfaceType_HostOnly) { - PRUnichar *networkNameUtf16 = NULL; - IDHCPServer *dhcpServer = NULL; - - - data->pFuncs->pfnUtf8ToUtf16(networkNameUtf8 , &networkNameUtf16); - - data->vboxObj->vtbl->FindDHCPServerByNetworkName(data->vboxObj, - networkNameUtf16, - &dhcpServer); - if (dhcpServer) { - - dhcpServer->vtbl->SetEnabled(dhcpServer, PR_FALSE); - - dhcpServer->vtbl->Stop(dhcpServer); - - dhcpServer->vtbl->nsisupports.Release((nsISupports *) dhcpServer); - } - - data->pFuncs->pfnUtf16Free(networkNameUtf16); - } - - networkInterface->vtbl->nsisupports.Release((nsISupports *) networkInterface); - } - - data->pFuncs->pfnUtf16Free(networkInterfaceNameUtf16); - host->vtbl->nsisupports.Release((nsISupports *) host); - } - } - - ret = 0; - -cleanup: - VIR_FREE(networkNameUtf8); - return ret; + return vboxNetworkUndefineDestroy(network, false); } static char *vboxNetworkDumpXML(virNetworkPtr network, int flags ATTRIBUTE_UNUSED) {
-- Libvir-list mailing list Libvir-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/libvir-list