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

--
libvir-list mailing list
libvir-list@redhat.com
https://www.redhat.com/mailman/listinfo/libvir-list

Reply via email to