]> xenbits.xensource.com Git - libvirt.git/commitdiff
lxc: add LXC version 3 network parser
authorJulio Faracco <jcfaracco@gmail.com>
Mon, 3 Feb 2020 01:28:33 +0000 (22:28 -0300)
committerMichal Privoznik <mprivozn@redhat.com>
Mon, 3 Feb 2020 15:07:56 +0000 (16:07 +0100)
LXC version 3 or higher introduced indexes for network interfaces.
Libvirt should be able to parse entries like `lxc.net.2.KEY`. This
commit adds functions to parse this type of field. That's why array
structures are so important this time.

Signed-off-by: Julio Faracco <jcfaracco@gmail.com>
Reviewed-by: Michal Privoznik <mprivozn@redhat.com>
src/lxc/lxc_native.c

index 31aa666e38d73de191d9bc50b87f3c05080d603d..8bbe2056592e7de0c8d982c726e466001b081169 100644 (file)
@@ -649,6 +649,55 @@ lxcNetworkParseDataSuffix(const char *entry,
 }
 
 
+static lxcNetworkParseDataPtr
+lxcNetworkGetParseDataByIndex(lxcNetworkParseDataArray *networks,
+                              unsigned int index)
+{
+    size_t ndata = networks->ndata;
+    size_t i;
+
+    for (i = 0; i < ndata; i++) {
+        if (networks->parseData[i]->index == index)
+            return networks->parseData[i];
+    }
+
+    /* Index was not found. So, it is time to add new *
+     * interface and return this last position.       */
+    if (VIR_EXPAND_N(networks->parseData, networks->ndata, 1) < 0)
+        return NULL;
+
+    networks->parseData[ndata] = g_new0(lxcNetworkParseData, 1);
+    networks->parseData[ndata]->index = index;
+
+    return networks->parseData[ndata];
+}
+
+
+static int
+lxcNetworkParseDataEntry(const char *name,
+                         virConfValuePtr value,
+                         lxcNetworkParseDataArray *networks)
+{
+    lxcNetworkParseData *parseData;
+    const char *suffix_tmp = STRSKIP(name, "lxc.net.");
+    char *suffix = NULL;
+    unsigned long long index;
+
+    if (virStrToLong_ull(suffix_tmp, &suffix, 10, &index) < 0)
+        return -1;
+
+    if (suffix[0] != '.')
+        return -1;
+
+    suffix++;
+
+    if (!(parseData = lxcNetworkGetParseDataByIndex(networks, index)))
+        return -1;
+
+    return lxcNetworkParseDataSuffix(suffix, value, parseData);
+}
+
+
 static lxcNetworkParseDataPtr
 lxcNetworkGetParseDataByIndexLegacy(lxcNetworkParseDataArray *networks,
                                     const char *entry)
@@ -695,6 +744,8 @@ lxcNetworkWalkCallback(const char *name, virConfValuePtr value, void *data)
 
     if (STRPREFIX(name, "lxc.network."))
         return lxcNetworkParseDataEntryLegacy(name, value, networks);
+    if (STRPREFIX(name, "lxc.net."))
+        return lxcNetworkParseDataEntry(name, value, networks);
 
     return 0;
 }