Start adding Windows implementation for net_ifinfo.c - will

need to link against iphlpapi for mingw
This commit is contained in:
twinaphex 2016-03-03 04:40:25 +01:00
parent 966f267285
commit 4d630189a2
3 changed files with 66 additions and 11 deletions

View File

@ -947,7 +947,7 @@ ifeq ($(HAVE_NETWORKING), 1)
endif
ifneq ($(findstring Win32,$(OS)),)
LIBS += -lws2_32
LIBS += -lws2_32 -liphlpapi
endif
# Netplay

View File

@ -24,7 +24,13 @@
#include <stdlib.h>
#include <string.h>
#ifndef _WIN32
#include <retro_miscellaneous.h>
#if defined(_WIN32) && !defined(_XBOX)
#include <winsock2.h>
#include <IPHlpApi.h>
#include <WS2tcpip.h>
#else
#include <arpa/inet.h>
#include <sys/socket.h>
#include <netdb.h>
@ -67,10 +73,55 @@ void net_ifinfo_free(net_ifinfo_t *list)
bool net_ifinfo_new(net_ifinfo_t *list)
{
#ifdef _WIN32
return false;
unsigned k = 0;
#if defined(_WIN32) && !defined(_XBOX)
DWORD size;
PIP_ADAPTER_ADDRESSES adapter_addresses, aa;
PIP_ADAPTER_UNICAST_ADDRESS ua;
DWORD rv = GetAdaptersAddresses(AF_UNSPEC, GAA_FLAG_INCLUDE_PREFIX, NULL, NULL, &size);
if (rv != ERROR_SUCCESS)
goto error;
adapter_addresses = (PIP_ADAPTER_ADDRESSES)malloc(size);
rv = GetAdaptersAddresses(AF_UNSPEC, GAA_FLAG_INCLUDE_PREFIX, NULL, adapter_addresses, &size);
if (rv != ERROR_SUCCESS)
goto error;
for (aa = adapter_addresses; aa != NULL; aa = aa->Next)
{
struct net_ifinfo_entry *ptr = NULL;
for (ua = aa->FirstUnicastAddress; ua != NULL; ua = ua->Next)
{
char host[PATH_MAX_LENGTH], name[PATH_MAX_LENGTH];
ptr = (struct net_ifinfo_entry*)
realloc(list->entries, (k+1) * sizeof(struct net_ifinfo_entry));
if (!ptr)
goto error;
list->entries = ptr;
memset(host, 0, PATH_MAX_LENGTH);
memset(name, 0, PATH_MAX_LENGTH);
getnameinfo(ua->Address.lpSockaddr, ua->Address.iSockaddrLength,
host, sizeof(host), NULL, 0, NI_NUMERICHOST);
WideCharToMultiByte(CP_ACP, 0, aa->FriendlyName, wcslen(aa->FriendlyName),
name, PATH_MAX_LENGTH, NULL, NULL);
list->entries[k].name = strdup(name);
list->entries[k].host = strdup(host);
list->size = k + 1;
k++;
}
}
free(adapter_addresses);
#else
unsigned k = 0;
struct ifaddrs *ifa = NULL;
struct ifaddrs *ifaddr = NULL;
@ -111,10 +162,14 @@ bool net_ifinfo_new(net_ifinfo_t *list)
}
freeifaddrs(ifaddr);
#endif
return true;
error:
#ifdef _WIN32
if (adapter_addresses)
free(adapter_addresses);
#else
freeifaddrs(ifaddr);
net_ifinfo_free(list);
#endif

View File

@ -110,7 +110,7 @@
<Link>
<SubSystem>Console</SubSystem>
<GenerateDebugInformation>true</GenerateDebugInformation>
<AdditionalDependencies>winmm.lib;Dinput8.lib;dxguid.lib;%(AdditionalDependencies)</AdditionalDependencies>
<AdditionalDependencies>winmm.lib;Dinput8.lib;dxguid.lib;Iphlpapi.lib;%(AdditionalDependencies)</AdditionalDependencies>
<AdditionalLibraryDirectories>$(CG_LIB_PATH)</AdditionalLibraryDirectories>
</Link>
</ItemDefinitionGroup>
@ -130,7 +130,7 @@
<Link>
<SubSystem>Console</SubSystem>
<GenerateDebugInformation>true</GenerateDebugInformation>
<AdditionalDependencies>winmm.lib;Dinput8.lib;dxguid.lib;%(AdditionalDependencies)</AdditionalDependencies>
<AdditionalDependencies>winmm.lib;Dinput8.lib;dxguid.lib;Iphlpapi.lib;%(AdditionalDependencies)</AdditionalDependencies>
<AdditionalLibraryDirectories>$(CG_LIB64_PATH)</AdditionalLibraryDirectories>
</Link>
</ItemDefinitionGroup>
@ -155,7 +155,7 @@
<GenerateDebugInformation>true</GenerateDebugInformation>
<EnableCOMDATFolding>true</EnableCOMDATFolding>
<OptimizeReferences>true</OptimizeReferences>
<AdditionalDependencies>winmm.lib;Dinput8.lib;dxguid.lib;%(AdditionalDependencies)</AdditionalDependencies>
<AdditionalDependencies>winmm.lib;Dinput8.lib;dxguid.lib;Iphlpapi.lib;%(AdditionalDependencies)</AdditionalDependencies>
<AdditionalLibraryDirectories>$(CG_LIB_PATH)</AdditionalLibraryDirectories>
</Link>
</ItemDefinitionGroup>
@ -180,7 +180,7 @@
<GenerateDebugInformation>true</GenerateDebugInformation>
<EnableCOMDATFolding>true</EnableCOMDATFolding>
<OptimizeReferences>true</OptimizeReferences>
<AdditionalDependencies>winmm.lib;Dinput8.lib;dxguid.lib;%(AdditionalDependencies)</AdditionalDependencies>
<AdditionalDependencies>winmm.lib;Dinput8.lib;dxguid.lib;Iphlpapi.lib;%(AdditionalDependencies)</AdditionalDependencies>
<AdditionalLibraryDirectories>$(CG_LIB64_PATH)</AdditionalLibraryDirectories>
</Link>
</ItemDefinitionGroup>
@ -194,4 +194,4 @@
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
<ImportGroup Label="ExtensionTargets">
</ImportGroup>
</Project>
</Project>