diff --git a/libdnet-stripped/include/dnet/intf.h b/libdnet-stripped/include/dnet/intf.h index fd6e6aa2a..d6ae482a6 100644 --- a/libdnet-stripped/include/dnet/intf.h +++ b/libdnet-stripped/include/dnet/intf.h @@ -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); diff --git a/libdnet-stripped/src/intf-win32.c b/libdnet-stripped/src/intf-win32.c index 225cc47e6..6089e703c 100644 --- a/libdnet-stripped/src/intf-win32.c +++ b/libdnet-stripped/src/intf-win32.c @@ -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,23 +537,29 @@ intf_get_pcap_devname(const char *intf_name, char *pcapdev, int pcapdevlen) return (-1); } - pcapMutex = CreateMutex(NULL, 0, "Global\\DnetPcapHangAvoidanceMutex"); - wait = WaitForSingleObject(pcapMutex, INFINITE); - if (pcap_findalldevs(&pcapdevs, errbuf) == -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) { + 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) { ReleaseMutex(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. */ - 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); +}