1
0
mirror of https://github.com/nmap/nmap.git synced 2025-12-06 12:41:29 +00:00

libdnet: Keep result of pcap_findalldevs around to avoid re-calling frequently

This commit is contained in:
dmiller
2018-09-18 04:21:18 +00:00
parent f540c58e3f
commit 626f10aca0
2 changed files with 25 additions and 14 deletions

View File

@@ -63,6 +63,7 @@ int intf_get_index(intf_t *intf, struct intf_entry *entry, int af, unsigned int
int intf_get_src(intf_t *i, struct intf_entry *entry, struct addr *src);
int intf_get_dst(intf_t *i, struct intf_entry *entry, struct addr *dst);
int intf_get_pcap_devname(const char *intf_name, char *pcapdev, int pcapdevlen);
int intf_get_pcap_devname_cached(const char *intf_name, char *pcapdev, int pcapdevlen, int refresh);
int intf_set(intf_t *i, const struct intf_entry *entry);
int intf_loop(intf_t *i, intf_handler callback, void *arg);
intf_t *intf_close(intf_t *i);

View File

@@ -514,11 +514,11 @@ intf_close(intf_t *intf)
stored in pcapdev up to a length of pcapdevlen, including the terminating
'\0'. Returns -1 on error. */
int
intf_get_pcap_devname(const char *intf_name, char *pcapdev, int pcapdevlen)
intf_get_pcap_devname_cached(const char *intf_name, char *pcapdev, int pcapdevlen, int refresh)
{
IP_ADAPTER_ADDRESSES *a;
pcap_if_t *pcapdevs;
pcap_if_t *pdev, *selected;
static pcap_if_t *pcapdevs = NULL;
pcap_if_t *pdev;
intf_t *intf;
char errbuf[PCAP_ERRBUF_SIZE];
HANDLE pcapMutex;
@@ -537,6 +537,12 @@ intf_get_pcap_devname(const char *intf_name, char *pcapdev, int pcapdevlen)
return (-1);
}
if (refresh) {
pcap_freealldevs(pcapdevs);
pcapdevs = NULL;
}
if (pcapdevs == NULL) {
pcapMutex = CreateMutex(NULL, 0, "Global\\DnetPcapHangAvoidanceMutex");
wait = WaitForSingleObject(pcapMutex, INFINITE);
if (pcap_findalldevs(&pcapdevs, errbuf) == -1) {
@@ -551,9 +557,9 @@ intf_get_pcap_devname(const char *intf_name, char *pcapdev, int pcapdevlen)
ReleaseMutex(pcapMutex);
}
CloseHandle(pcapMutex);
}
/* Loop through all the pcap devices until we find a match. */
selected = NULL;
for (pdev = pcapdevs; pdev != NULL; pdev = pdev->next) {
char *name;
@@ -568,9 +574,13 @@ intf_get_pcap_devname(const char *intf_name, char *pcapdev, int pcapdevlen)
if (pdev != NULL)
strlcpy(pcapdev, pdev->name, pcapdevlen);
intf_close(intf);
pcap_freealldevs(pcapdevs);
if (pdev == NULL)
return -1;
else
return 0;
}
int
intf_get_pcap_devname(const char *intf_name, char *pcapdev, int pcapdevlen)
{
return intf_get_pcap_devname_cached(intf_name, pcapdev, pcapdevlen, 0);
}