[libvirt] [PATCH v2 4/6] lxc: Introduce lxcNetworkGetParseData() for 'lxc.net.' entry.

Julio Faracco jcfaracco at gmail.com
Tue Mar 5 01:54:30 UTC 2019


This commit moves old lxcNetworkGetParseData() to
lxcNetworkGetParseDataLegacy() and create a new method for LXC version
3.X called lxcNetworkGetParseData(). This is same idea of method
lxcNetworkGetParseDataLegacy(). In the future, it can be easy to remove
or rebase, in case of deprecate 'lxc.network.foo' style.

Signed-off-by: Julio Faracco <jcfaracco at gmail.com>
---
 src/lxc/lxc_native.c | 65 +++++++++++++++++++++++++++++++++++++++++++-
 1 file changed, 64 insertions(+), 1 deletion(-)

diff --git a/src/lxc/lxc_native.c b/src/lxc/lxc_native.c
index 1ecbae0e31..22b74d10fb 100644
--- a/src/lxc/lxc_native.c
+++ b/src/lxc/lxc_native.c
@@ -603,6 +603,53 @@ lxcNetworkGetParseDataLegacy(lxcNetworkParseArray *networks,
     return networks->data[index-1];
 }
 
+static lxcNetworkParseDataPtr
+lxcNetworkGetParseData(lxcNetworkParseArray *networks,
+                       const char *name)
+{
+    size_t index, nnetworks = networks->nnetworks;
+    size_t i;
+
+    sscanf(name, "lxc.net.%zu", &index);
+
+    if (!nnetworks) {
+        if (VIR_ALLOC_N(networks->data, 1) < 0)
+            return NULL;
+
+        if (VIR_ALLOC(networks->data[0]) < 0)
+            return NULL;
+
+        networks->data[0]->index = index;
+        networks->nnetworks++;
+
+        return networks->data[0];
+    }
+
+    for (i = 0; i < nnetworks; i++) {
+        if (networks->data[i]->index == index)
+            return networks->data[i];
+    }
+
+    /* This is a new element in an existing array. */
+    if (VIR_REALLOC_N(networks->data, nnetworks + 1) < 0)
+        return NULL;
+
+    if (VIR_ALLOC(networks->data[nnetworks]) < 0)
+        return NULL;
+
+    networks->nnetworks++;
+
+    for (i = nnetworks; i > 0; i--) {
+        if (networks->data[i-1]->index < index) {
+            networks->data[i]->index = index;
+            return networks->data[i];
+        }
+        memcpy(networks->data[i], networks->data[i-1], sizeof(lxcNetworkParseData));
+    }
+
+    return NULL;
+}
+
 static int
 lxcNetworkParseDataIPs(const char *name,
                        virConfValuePtr value,
@@ -692,14 +739,25 @@ lxcNetworkParseDataSuffix(const char *entry,
     return 0;
 }
 
+static int
+lxcNetworkParseDataEntryLegacy(const char *name,
+                               virConfValuePtr value,
+                               lxcNetworkParseData *parseData)
+{
+    const char *suffix = STRSKIP(name, "lxc.network.");
+
+    return lxcNetworkParseDataSuffix(suffix, value, parseData);
+}
 
 static int
 lxcNetworkParseDataEntry(const char *name,
                          virConfValuePtr value,
                          lxcNetworkParseDataPtr parseData)
 {
-    const char *suffix = STRSKIP(name, "lxc.network.");
+    const char *suffix = STRSKIP(name, "lxc.net.");
 
+    suffix = strchr(suffix, '.');
+    suffix = STRSKIP(suffix, ".");
     return lxcNetworkParseDataSuffix(suffix, value, parseData);
 }
 
@@ -714,6 +772,11 @@ lxcNetworkWalkCallback(const char *name, virConfValuePtr value, void *data)
         if (!(parseData = lxcNetworkGetParseDataLegacy(networks, name)))
             return -1;
 
+        return lxcNetworkParseDataEntryLegacy(name, value, parseData);
+    } else if (STRPREFIX(name, "lxc.net.")) {
+        if (!(parseData = lxcNetworkGetParseData(networks, name)))
+            return -1;
+
         return lxcNetworkParseDataEntry(name, value, parseData);
     }
 
-- 
2.19.1




More information about the libvir-list mailing list