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