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:
@@ -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);
|
||||||
|
|||||||
@@ -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,23 +537,29 @@ intf_get_pcap_devname(const char *intf_name, char *pcapdev, int pcapdevlen)
|
|||||||
return (-1);
|
return (-1);
|
||||||
}
|
}
|
||||||
|
|
||||||
pcapMutex = CreateMutex(NULL, 0, "Global\\DnetPcapHangAvoidanceMutex");
|
if (refresh) {
|
||||||
wait = WaitForSingleObject(pcapMutex, INFINITE);
|
pcap_freealldevs(pcapdevs);
|
||||||
if (pcap_findalldevs(&pcapdevs, errbuf) == -1) {
|
pcapdevs = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (pcapdevs == NULL) {
|
||||||
|
pcapMutex = CreateMutex(NULL, 0, "Global\\DnetPcapHangAvoidanceMutex");
|
||||||
|
wait = WaitForSingleObject(pcapMutex, INFINITE);
|
||||||
|
if (pcap_findalldevs(&pcapdevs, errbuf) == -1) {
|
||||||
|
if (wait == WAIT_ABANDONED || wait == WAIT_OBJECT_0) {
|
||||||
|
ReleaseMutex(pcapMutex);
|
||||||
|
}
|
||||||
|
CloseHandle(pcapMutex);
|
||||||
|
intf_close(intf);
|
||||||
|
return (-1);
|
||||||
|
}
|
||||||
if (wait == WAIT_ABANDONED || wait == WAIT_OBJECT_0) {
|
if (wait == WAIT_ABANDONED || wait == WAIT_OBJECT_0) {
|
||||||
ReleaseMutex(pcapMutex);
|
ReleaseMutex(pcapMutex);
|
||||||
}
|
}
|
||||||
CloseHandle(pcapMutex);
|
CloseHandle(pcapMutex);
|
||||||
intf_close(intf);
|
|
||||||
return (-1);
|
|
||||||
}
|
|
||||||
if (wait == WAIT_ABANDONED || wait == WAIT_OBJECT_0) {
|
|
||||||
ReleaseMutex(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);
|
||||||
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user