mirror of
https://github.com/libvirt/libvirt.git
synced 2025-02-25 18:55:26 -06:00
lxc: add LXC version 3 network parser
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>
This commit is contained in:
parent
007925214e
commit
0da46e30a0
@ -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
|
static lxcNetworkParseDataPtr
|
||||||
lxcNetworkGetParseDataByIndexLegacy(lxcNetworkParseDataArray *networks,
|
lxcNetworkGetParseDataByIndexLegacy(lxcNetworkParseDataArray *networks,
|
||||||
const char *entry)
|
const char *entry)
|
||||||
@ -695,6 +744,8 @@ lxcNetworkWalkCallback(const char *name, virConfValuePtr value, void *data)
|
|||||||
|
|
||||||
if (STRPREFIX(name, "lxc.network."))
|
if (STRPREFIX(name, "lxc.network."))
|
||||||
return lxcNetworkParseDataEntryLegacy(name, value, networks);
|
return lxcNetworkParseDataEntryLegacy(name, value, networks);
|
||||||
|
if (STRPREFIX(name, "lxc.net."))
|
||||||
|
return lxcNetworkParseDataEntry(name, value, networks);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user