diff options
Diffstat (limited to 'wsutil')
-rw-r--r-- | wsutil/CMakeLists.txt | 2 | ||||
-rw-r--r-- | wsutil/interface.c | 73 |
2 files changed, 72 insertions, 3 deletions
diff --git a/wsutil/CMakeLists.txt b/wsutil/CMakeLists.txt index cccf86a62e..15d64a34ed 100644 --- a/wsutil/CMakeLists.txt +++ b/wsutil/CMakeLists.txt @@ -180,7 +180,7 @@ set(wsutil_LIBS ${WIN_WSOCK32_LIBRARY} ) IF(WIN32) - set(wsutil_LIBS ${wsutil_LIBS} "ws2_32.lib") + set(wsutil_LIBS ${wsutil_LIBS} "iphlpapi.lib" "ws2_32.lib") ENDIF(WIN32) set(CLEAN_FILES diff --git a/wsutil/interface.c b/wsutil/interface.c index 4cd8b5954c..11104f1eba 100644 --- a/wsutil/interface.c +++ b/wsutil/interface.c @@ -49,10 +49,18 @@ #include <ifaddrs.h> #endif -GSList *local_interfaces_to_list(void) +#ifdef _WIN32 + #include <winsock2.h> + #include <iphlpapi.h> + #include <Ws2tcpip.h> +#endif + +#define WORKING_BUFFER_SIZE 15000 + +#ifdef HAVE_GETIFADDRS +static GSList* local_interfaces_to_list_nix(void) { GSList *interfaces = NULL; -#ifdef HAVE_GETIFADDRS struct ifaddrs *ifap; struct ifaddrs *ifa; int family; @@ -99,9 +107,70 @@ GSList *local_interfaces_to_list(void) } freeifaddrs(ifap); end: + return interfaces; +} #endif /* HAVE_GETIFADDRS */ + +#ifdef _WIN32 +static GSList* local_interfaces_to_list_win(void) +{ + GSList *interfaces = NULL; + PIP_ADAPTER_ADDRESSES pAddresses = NULL; + ULONG outBufLen = WORKING_BUFFER_SIZE; + ULONG family = AF_UNSPEC; + PIP_ADAPTER_ADDRESSES pCurrAddresses = NULL; + PIP_ADAPTER_UNICAST_ADDRESS pUnicast = NULL; + char ip[100]; + guint iplen = 100; + + pAddresses = (IP_ADAPTER_ADDRESSES *)g_malloc0(outBufLen); + if (pAddresses == NULL) + return NULL; + + if (GetAdaptersAddresses(family, 0, NULL, pAddresses, &outBufLen) != NO_ERROR) + goto end; + + pCurrAddresses = pAddresses; + while (pCurrAddresses) { + + for (pUnicast = pCurrAddresses->FirstUnicastAddress; pUnicast != NULL; pUnicast = pUnicast->Next) { + if (pUnicast->Address.lpSockaddr->sa_family == AF_INET) { + SOCKADDR_IN* sa_in = (SOCKADDR_IN *)pUnicast->Address.lpSockaddr; + ws_inet_ntop4(&(sa_in->sin_addr), ip, iplen); + if (!g_strcmp0(ip, "127.0.0.1")) + continue; + if (*ip) + interfaces = g_slist_prepend(interfaces, g_strdup(ip)); + } + if (pUnicast->Address.lpSockaddr->sa_family == AF_INET6) { + SOCKADDR_IN6* sa_in6 = (SOCKADDR_IN6 *)pUnicast->Address.lpSockaddr; + ws_inet_ntop6(&(sa_in6->sin6_addr), ip, iplen); + if (!g_strcmp0(ip, "::1")) + continue; + if (*ip) + interfaces = g_slist_prepend(interfaces, g_strdup(ip)); + } + } + pCurrAddresses = pCurrAddresses->Next; + } +end: + if (pAddresses) + g_free(pAddresses); + return interfaces; } +#endif /* _WIN32 */ + +GSList* local_interfaces_to_list(void) +{ +#if defined(_WIN32) + return local_interfaces_to_list_win(); +#elif defined(HAVE_GETIFADDRS) + return local_interfaces_to_list_nix(); +#else + return NULL; +#endif +} /* * Editor modelines - https://www.wireshark.org/tools/modelines.html |