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:
Julio Faracco 2020-02-02 22:28:33 -03:00 committed by Michal Privoznik
parent 007925214e
commit 0da46e30a0
1 changed files with 51 additions and 0 deletions

View 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;
}