[libvirt] [PATCH] libxl: support interface type=network

Jim Fehlig jfehlig at suse.com
Sat Jun 7 05:20:50 UTC 2014


Jim Fehlig wrote:
> Add support for <interface type='network'> in the libxl driver.
>
> Signed-off-by: Jim Fehlig <jfehlig at suse.com>
> ---
>  src/libxl/libxl_conf.c | 41 +++++++++++++++++++++++++++++++++++++++--
>  1 file changed, 39 insertions(+), 2 deletions(-)
>
> diff --git a/src/libxl/libxl_conf.c b/src/libxl/libxl_conf.c
> index cec37d6..6efcea6 100644
> --- a/src/libxl/libxl_conf.c
> +++ b/src/libxl/libxl_conf.c
> @@ -908,7 +908,44 @@ libxlMakeNic(virDomainDefPtr def,
>              if (VIR_STRDUP(x_nic->script, l_nic->script) < 0)
>                  return -1;
>              break;
> -        default:
> +        case VIR_DOMAIN_NET_TYPE_NETWORK:
> +        {
> +            bool error = true;
> +            char *brname = NULL;
> +            virNetworkPtr network = NULL;
> +            virConnectPtr conn;
> +
> +            if (!(conn = virConnectOpen("xen:///system")))
> +                return -1;
> +
> +            if (!(network =
> +                  virNetworkLookupByName(conn, l_nic->data.network.name)))
> +                goto cleanup_net;
> +
> +            if (!(brname = virNetworkGetBridgeName(network)))
> +                goto cleanup_net;
> +
> +            if (VIR_STRDUP(x_nic->bridge, brname) < 0)
> +                goto cleanup_net;
> +
> +            error = false;
> +
> +         cleanup_net:
> +            VIR_FREE(brname);
> +            virNetworkFree(network);
>   

While testing this patch a bit more, noticed that freeing the
virNetworkPtr here swallowed any previous errors.  E.g. when specifying
a non-existent network, I got the following error

error: invalid network pointer in virNetworkFree

With the below squashed in, I get the more reasonable

error: Network not found: no network with matching name 'foobar'

Regards,
Jim


diff --git a/src/libxl/libxl_conf.c b/src/libxl/libxl_conf.c
index 6efcea6..195bacc 100644
--- a/src/libxl/libxl_conf.c
+++ b/src/libxl/libxl_conf.c
@@ -910,31 +910,37 @@ libxlMakeNic(virDomainDefPtr def,
             break;
         case VIR_DOMAIN_NET_TYPE_NETWORK:
         {
-            bool error = true;
+            bool fail = false;
             char *brname = NULL;
-            virNetworkPtr network = NULL;
+            virNetworkPtr network;
             virConnectPtr conn;
+            virErrorPtr errobj;
 
             if (!(conn = virConnectOpen("xen:///system")))
                 return -1;
 
             if (!(network =
-                  virNetworkLookupByName(conn, l_nic->data.network.name)))
-                goto cleanup_net;
-
-            if (!(brname = virNetworkGetBridgeName(network)))
-                goto cleanup_net;
-
-            if (VIR_STRDUP(x_nic->bridge, brname) < 0)
-                goto cleanup_net;
+                  virNetworkLookupByName(conn,
l_nic->data.network.name))) {
+                virObjectUnref(conn);
+                return -1;
+            }
 
-            error = false;
+            if ((brname = virNetworkGetBridgeName(network))) {
+                if (VIR_STRDUP(x_nic->bridge, brname) < 0)
+                    fail = true;
+            } else {
+                fail = true;
+            }
 
-         cleanup_net:
             VIR_FREE(brname);
+
+            /* Preserve any previous failure */
+            errobj = virSaveLastError();
             virNetworkFree(network);
+            virSetError(errobj);
+            virFreeError(errobj);
             virObjectUnref(conn);
-            if (error)
+            if (fail)
                 return -1;
             break;
         }




More information about the libvir-list mailing list