mirror of https://gitee.com/openkylin/libvirt.git
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
|
||||
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;
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue