[libvirt] [PATCH v3 11/14] vbox: Rewrite vboxNetworkUndefineDestroy
Michal Privoznik
mprivozn at redhat.com
Fri Oct 3 08:48:14 UTC 2014
On 02.10.2014 05:30, Taowei wrote:
> This patch rewrites two public APIs. They are vboxNetworkUndefine
> and vboxNetworkDestroy. They use the same core function
> vboxNetworkUndefineDestroy. I merged it in one patch.
Cool!
> ---
> src/vbox/vbox_network.c | 109 +++++++++++++++++++++++++++++++++
> src/vbox/vbox_tmpl.c | 136 ++++++++++++-----------------------------
> src/vbox/vbox_uniformed_api.h | 7 +++
> 3 files changed, 156 insertions(+), 96 deletions(-)
>
> diff --git a/src/vbox/vbox_network.c b/src/vbox/vbox_network.c
> index feecf0c..60fbe5e 100644
> --- a/src/vbox/vbox_network.c
> +++ b/src/vbox/vbox_network.c
> @@ -34,6 +34,9 @@
>
> VIR_LOG_INIT("vbox.vbox_network");
>
> +#define RC_SUCCEEDED(rc) NS_SUCCEEDED(rc.resultCode)
> +#define RC_FAILED(rc) NS_FAILED(rc.resultCode)
> +
> #define VBOX_UTF16_FREE(arg) \
> do { \
> if (arg) { \
> @@ -625,3 +628,109 @@ virNetworkPtr vboxNetworkDefineXML(virConnectPtr conn, const char *xml)
> {
> return vboxNetworkDefineCreateXML(conn, xml, false);
> }
> +
> +static int
> +vboxNetworkUndefineDestroy(virNetworkPtr network, bool removeinterface)
> +{
> + vboxGlobalData *data = network->conn->privateData;
> + char *networkNameUtf8 = NULL;
> + PRUnichar *networkInterfaceNameUtf16 = NULL;
> + IHostNetworkInterface *networkInterface = NULL;
> + PRUnichar *networkNameUtf16 = NULL;
> + IDHCPServer *dhcpServer = NULL;
> + PRUint32 interfaceType = 0;
> + IHost *host = NULL;
> + int ret = -1;
> +
> + if (!data->vboxObj)
> + return ret;
> +
> + gVBoxAPI.UIVirtualBox.GetHost(data->vboxObj, &host);
> + if (!host)
> + return ret;
> +
> + /* Current limitation of the function for VirtualBox 2.2.* is
> + * that you can't delete the default hostonly adaptor namely:
> + * vboxnet0 and thus all this functions does is remove the
> + * dhcp server configuration, but the network can still be used
> + * by giving the machine static IP and also it will still
> + * show up in the net-list in virsh
> + */
> +
> + if (virAsprintf(&networkNameUtf8, "HostInterfaceNetworking-%s", network->name) < 0)
> + goto cleanup;
> +
> + VBOX_UTF8_TO_UTF16(network->name, &networkInterfaceNameUtf16);
> +
> + gVBoxAPI.UIHost.FindHostNetworkInterfaceByName(host, networkInterfaceNameUtf16, &networkInterface);
> +
> + if (!networkInterface)
> + goto cleanup;
> +
> + gVBoxAPI.UIHNInterface.GetInterfaceType(networkInterface, &interfaceType);
> +
> + if (interfaceType != HostNetworkInterfaceType_HostOnly)
> + goto cleanup;
> +
> + if (gVBoxAPI.networkRemoveInterface && removeinterface) {
> + vboxIIDUnion iid;
> + IProgress *progress = NULL;
> + nsresult rc;
> + resultCodeUnion resultCode;
> +
> + VBOX_IID_INITIALIZE(&iid);
> + rc = gVBoxAPI.UIHNInterface.GetId(networkInterface, &iid);
> +
> + if (NS_FAILED(rc))
> + goto cleanup;
> +
> + gVBoxAPI.UIHost.RemoveHostOnlyNetworkInterface(host, &iid, &progress);
> + vboxIIDUnalloc(&iid);
> +
> + if (!progress)
> + goto cleanup;
> +
> + gVBoxAPI.UIProgress.WaitForCompletion(progress, -1);
> + gVBoxAPI.UIProgress.GetResultCode(progress, &resultCode);
> + if (RC_FAILED(resultCode)) {
> + virReportError(VIR_ERR_INTERNAL_ERROR,
> + _("Error while removing hostonly network interface, rc=%08x"),
And this is actually the reason why po/POTFILES.in change needs to be
moved into this patch.
> + resultCode.uResultCode);
> + goto cleanup;
> + }
> + VBOX_RELEASE(progress);
> + }
> +
> + VBOX_UTF8_TO_UTF16(networkNameUtf8, &networkNameUtf16);
> +
> + gVBoxAPI.UIVirtualBox.FindDHCPServerByNetworkName(data->vboxObj,
> + networkNameUtf16,
> + &dhcpServer);
> + if (!dhcpServer)
> + goto cleanup;
> +
> + gVBoxAPI.UIDHCPServer.SetEnabled(dhcpServer, PR_FALSE);
> + gVBoxAPI.UIDHCPServer.Stop(dhcpServer);
> + if (removeinterface)
> + gVBoxAPI.UIVirtualBox.RemoveDHCPServer(data->vboxObj, dhcpServer);
> + ret = 0;
> + VBOX_RELEASE(dhcpServer);
> +
> + cleanup:
> + VBOX_UTF16_FREE(networkNameUtf16);
> + VBOX_RELEASE(networkInterface);
> + VBOX_UTF16_FREE(networkInterfaceNameUtf16);
> + VBOX_RELEASE(host);
> + VIR_FREE(networkNameUtf8);
> + return ret;
> +}
> +
> +int vboxNetworkUndefine(virNetworkPtr network)
> +{
> + return vboxNetworkUndefineDestroy(network, true);
> +}
> +
> +int vboxNetworkDestroy(virNetworkPtr network)
> +{
> + return vboxNetworkUndefineDestroy(network, false);
> +}
Michal
More information about the libvir-list
mailing list