mirror of
https://gitlab.com/libvirt/libvirt.git
synced 2025-01-03 11:35:19 +00:00
nss: refactor code for processing mac addresses
Build a list of mac addresses immediately, so that later code searching for leases can be simplified and avoid needing to use the virMacMap object. Reviewed-by: Michal Privoznik <mprivozn@redhat.com> Signed-off-by: Daniel P. Berrangé <berrange@redhat.com>
This commit is contained in:
parent
9ca9471a6f
commit
f5b5d98700
4
cfg.mk
4
cfg.mk
@ -1226,7 +1226,7 @@ exclude_file_name_regexp--sc_prohibit_asprintf = \
|
|||||||
^(cfg\.mk|bootstrap.conf$$|examples/|src/util/virstring\.[ch]$$|tests/vircgroupmock\.c|tools/virt-login-shell\.c|tools/nss/libvirt_nss\.c$$)
|
^(cfg\.mk|bootstrap.conf$$|examples/|src/util/virstring\.[ch]$$|tests/vircgroupmock\.c|tools/virt-login-shell\.c|tools/nss/libvirt_nss\.c$$)
|
||||||
|
|
||||||
exclude_file_name_regexp--sc_prohibit_strdup = \
|
exclude_file_name_regexp--sc_prohibit_strdup = \
|
||||||
^(docs/|examples/|src/util/virstring\.c|tests/vir(netserverclient|cgroup)mock.c|tests/commandhelper\.c$$)
|
^(docs/|examples/|src/util/virstring\.c|tests/vir(netserverclient|cgroup)mock.c|tests/commandhelper\.c|tools/nss/libvirt_nss\.c$$)
|
||||||
|
|
||||||
exclude_file_name_regexp--sc_prohibit_close = \
|
exclude_file_name_regexp--sc_prohibit_close = \
|
||||||
(\.p[yl]$$|\.spec\.in$$|^docs/|^(src/util/virfile\.c|src/libvirt-stream\.c|tests/(vir.+mock\.c|commandhelper\.c|qemusecuritymock\.c))$$)
|
(\.p[yl]$$|\.spec\.in$$|^docs/|^(src/util/virfile\.c|src/libvirt-stream\.c|tests/(vir.+mock\.c|commandhelper\.c|qemusecuritymock\.c))$$)
|
||||||
@ -1259,7 +1259,7 @@ exclude_file_name_regexp--sc_prohibit_canonicalize_file_name = \
|
|||||||
^(cfg\.mk|tests/virfilemock\.c)$$
|
^(cfg\.mk|tests/virfilemock\.c)$$
|
||||||
|
|
||||||
exclude_file_name_regexp--sc_prohibit_raw_allocation = \
|
exclude_file_name_regexp--sc_prohibit_raw_allocation = \
|
||||||
^(docs/hacking\.html\.in|src/util/viralloc\.[ch]|examples/.*|tests/(securityselinuxhelper|(vircgroup|nss)mock|commandhelper)\.c|tools/wireshark/src/packet-libvirt\.c)$$
|
^(docs/hacking\.html\.in|src/util/viralloc\.[ch]|examples/.*|tests/(securityselinuxhelper|(vircgroup|nss)mock|commandhelper)\.c|tools/wireshark/src/packet-libvirt\.c|tools/nss/libvirt_nss\.c)$$
|
||||||
|
|
||||||
exclude_file_name_regexp--sc_prohibit_readlink = \
|
exclude_file_name_regexp--sc_prohibit_readlink = \
|
||||||
^src/(util/virutil|lxc/lxc_container)\.c$$
|
^src/(util/virutil|lxc/lxc_container)\.c$$
|
||||||
|
@ -274,8 +274,10 @@ findLease(const char *name,
|
|||||||
ssize_t nleases;
|
ssize_t nleases;
|
||||||
VIR_AUTOFREE(leaseAddress *) tmpAddress = NULL;
|
VIR_AUTOFREE(leaseAddress *) tmpAddress = NULL;
|
||||||
size_t ntmpAddress = 0;
|
size_t ntmpAddress = 0;
|
||||||
VIR_AUTOFREE(virMacMapPtr *) macmaps = NULL;
|
virMacMapPtr map = NULL;
|
||||||
size_t nMacmaps = 0;
|
char **macs = NULL;
|
||||||
|
size_t nmacs = 0;
|
||||||
|
size_t i;
|
||||||
|
|
||||||
*address = NULL;
|
*address = NULL;
|
||||||
*naddress = 0;
|
*naddress = 0;
|
||||||
@ -313,23 +315,43 @@ findLease(const char *name,
|
|||||||
goto cleanup;
|
goto cleanup;
|
||||||
}
|
}
|
||||||
VIR_FREE(path);
|
VIR_FREE(path);
|
||||||
|
#if defined(LIBVIRT_NSS_GUEST)
|
||||||
} else if (dlen >= 5 && STREQ(entry->d_name + dlen - 5, ".macs")) {
|
} else if (dlen >= 5 && STREQ(entry->d_name + dlen - 5, ".macs")) {
|
||||||
|
const char * const *newmacs;
|
||||||
if (asprintf(&path, "%s/%s", leaseDir, entry->d_name) < 0)
|
if (asprintf(&path, "%s/%s", leaseDir, entry->d_name) < 0)
|
||||||
goto cleanup;
|
goto cleanup;
|
||||||
|
|
||||||
if (VIR_REALLOC_N_QUIET(macmaps, nMacmaps + 1) < 0) {
|
|
||||||
VIR_FREE(path);
|
|
||||||
goto cleanup;
|
|
||||||
}
|
|
||||||
|
|
||||||
DEBUG("Processing %s", path);
|
DEBUG("Processing %s", path);
|
||||||
if (!(macmaps[nMacmaps] = virMacMapNew(path))) {
|
if (!(map = virMacMapNew(path))) {
|
||||||
ERROR("Unable to parse %s", path);
|
ERROR("Unable to parse %s", path);
|
||||||
VIR_FREE(path);
|
VIR_FREE(path);
|
||||||
goto cleanup;
|
goto cleanup;
|
||||||
}
|
}
|
||||||
nMacmaps++;
|
|
||||||
VIR_FREE(path);
|
VIR_FREE(path);
|
||||||
|
|
||||||
|
DEBUG("Looking up macs in %p for %s", map, name);
|
||||||
|
newmacs = virMacMapLookup(map, name);
|
||||||
|
for (i = 0; newmacs && newmacs[i] != NULL; i++)
|
||||||
|
;
|
||||||
|
|
||||||
|
DEBUG("Got %zu macs", i);
|
||||||
|
if (i > 0) {
|
||||||
|
if (VIR_REALLOC_N_QUIET(macs, nmacs + i + 1) < 0)
|
||||||
|
goto cleanup;
|
||||||
|
|
||||||
|
for (i = 0; newmacs[i] != NULL; i++) {
|
||||||
|
char *macdup;
|
||||||
|
if (!(macdup = strdup(newmacs[i])))
|
||||||
|
goto cleanup;
|
||||||
|
DEBUG("Capture mac %s", macdup);
|
||||||
|
macs[nmacs++] = macdup;
|
||||||
|
}
|
||||||
|
macs[nmacs] = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
virObjectUnref(map);
|
||||||
|
map = NULL;
|
||||||
|
#endif /* LIBVIRT_NSS_GUEST */
|
||||||
}
|
}
|
||||||
|
|
||||||
errno = 0;
|
errno = 0;
|
||||||
@ -340,29 +362,18 @@ findLease(const char *name,
|
|||||||
nleases = virJSONValueArraySize(leases_array);
|
nleases = virJSONValueArraySize(leases_array);
|
||||||
DEBUG("Read %zd leases", nleases);
|
DEBUG("Read %zd leases", nleases);
|
||||||
|
|
||||||
#if !defined(LIBVIRT_NSS_GUEST)
|
#if defined(LIBVIRT_NSS_GUEST)
|
||||||
|
DEBUG("Finding with %zu macs", nmacs);
|
||||||
|
if (!nmacs)
|
||||||
|
goto cleanup;
|
||||||
|
#endif
|
||||||
|
|
||||||
if (findLeaseInJSON(&tmpAddress, &ntmpAddress,
|
if (findLeaseInJSON(&tmpAddress, &ntmpAddress,
|
||||||
leases_array, nleases,
|
leases_array, nleases,
|
||||||
name, NULL, af, found) < 0)
|
name, (const char**)macs, af, found) < 0)
|
||||||
goto cleanup;
|
goto cleanup;
|
||||||
|
|
||||||
#else /* defined(LIBVIRT_NSS_GUEST) */
|
DEBUG("Found %zu addresses", ntmpAddress);
|
||||||
|
|
||||||
size_t i;
|
|
||||||
for (i = 0; i < nMacmaps; i++) {
|
|
||||||
const char **macs = (const char **) virMacMapLookup(macmaps[i], name);
|
|
||||||
|
|
||||||
if (!macs)
|
|
||||||
continue;
|
|
||||||
|
|
||||||
if (findLeaseInJSON(&tmpAddress, &ntmpAddress,
|
|
||||||
leases_array, nleases,
|
|
||||||
name, macs, af, found) < 0)
|
|
||||||
goto cleanup;
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif /* defined(LIBVIRT_NSS_GUEST) */
|
|
||||||
|
|
||||||
sortAddr(tmpAddress, ntmpAddress);
|
sortAddr(tmpAddress, ntmpAddress);
|
||||||
|
|
||||||
VIR_STEAL_PTR(*address, tmpAddress);
|
VIR_STEAL_PTR(*address, tmpAddress);
|
||||||
@ -372,11 +383,13 @@ findLease(const char *name,
|
|||||||
ret = 0;
|
ret = 0;
|
||||||
|
|
||||||
cleanup:
|
cleanup:
|
||||||
|
virObjectUnref(map);
|
||||||
*errnop = errno;
|
*errnop = errno;
|
||||||
|
for (i = 0; i < nmacs; i++)
|
||||||
|
free(macs[i]);
|
||||||
|
free(macs);
|
||||||
if (dir)
|
if (dir)
|
||||||
closedir(dir);
|
closedir(dir);
|
||||||
while (nMacmaps)
|
|
||||||
virObjectUnref(macmaps[--nMacmaps]);
|
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user