wsutil: add enumeration of local ip addresses in Windows.
Routine used by ssh-based extcaps. Change-Id: I06d8e1e1444cd03a0508dc0c7cb91d340a451c58 Reviewed-on: https://code.wireshark.org/review/17308 Petri-Dish: Dario Lombardo <lomato@gmail.com> Tested-by: Petri Dish Buildbot <buildbot-no-reply@wireshark.org> Reviewed-by: Roland Knall <rknall@gmail.com> Reviewed-by: João Valverde <j@v6e.pt> Reviewed-by: Dario Lombardo <lomato@gmail.com>
This commit is contained in:
parent
d0565ad22b
commit
139170c6c6
|
@ -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
|
||||
|
|
|
@ -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:
|
||||
#endif /* HAVE_GETIFADDRS */
|
||||
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
|
||||
|
|
Loading…
Reference in New Issue