mirror of https://github.com/aria2/aria2
Use GetAdaptersAddresses for Mingw
parent
f4a0987544
commit
b9fb15f884
|
@ -17,7 +17,7 @@ AC_CONFIG_HEADERS([config.h])
|
||||||
case "$host" in
|
case "$host" in
|
||||||
*mingw*|*cygwin*)
|
*mingw*|*cygwin*)
|
||||||
win_build=yes
|
win_build=yes
|
||||||
LIBS="$LIBS -lws2_32 -lwsock32 -lgdi32 -lwinmm"
|
LIBS="$LIBS -lws2_32 -lwsock32 -lgdi32 -lwinmm -liphlpapi"
|
||||||
;;
|
;;
|
||||||
esac
|
esac
|
||||||
|
|
||||||
|
@ -341,6 +341,7 @@ case "$host" in
|
||||||
ws2tcpip.h \
|
ws2tcpip.h \
|
||||||
mmsystem.h \
|
mmsystem.h \
|
||||||
io.h \
|
io.h \
|
||||||
|
iphlpapi.h\
|
||||||
winioctl.h \
|
winioctl.h \
|
||||||
share.h], [], [],
|
share.h], [], [],
|
||||||
[[#ifdef HAVE_WINDOWS_H
|
[[#ifdef HAVE_WINDOWS_H
|
||||||
|
|
|
@ -733,6 +733,12 @@ std::string AbstractCommand::resolveHostname
|
||||||
return A2STR::NIL;
|
return A2STR::NIL;
|
||||||
case 1:
|
case 1:
|
||||||
asyncNameResolverMan_->getResolvedAddress(addrs);
|
asyncNameResolverMan_->getResolvedAddress(addrs);
|
||||||
|
if(addrs.empty()) {
|
||||||
|
throw DL_ABORT_EX2
|
||||||
|
(fmt(MSG_NAME_RESOLUTION_FAILED, getCuid(), hostname.c_str(),
|
||||||
|
"No address returned"),
|
||||||
|
error_code::NAME_RESOLVE_ERROR);
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
} else
|
} else
|
||||||
|
|
|
@ -34,6 +34,10 @@
|
||||||
/* copyright --> */
|
/* copyright --> */
|
||||||
#include "SocketCore.h"
|
#include "SocketCore.h"
|
||||||
|
|
||||||
|
#ifdef HAVE_IPHLPAPI_H
|
||||||
|
# include <iphlpapi.h>
|
||||||
|
#endif // HAVE_IPHLPAPI_H
|
||||||
|
|
||||||
#include <unistd.h>
|
#include <unistd.h>
|
||||||
#ifdef HAVE_IFADDRS_H
|
#ifdef HAVE_IFADDRS_H
|
||||||
# include <ifaddrs.h>
|
# include <ifaddrs.h>
|
||||||
|
@ -1553,8 +1557,73 @@ bool ipv6AddrConfigured = true;
|
||||||
|
|
||||||
void checkAddrconfig()
|
void checkAddrconfig()
|
||||||
{
|
{
|
||||||
// TODO Use GetAdaptersAddresses() for Mingw
|
#ifdef __MINGW32__
|
||||||
#ifdef HAVE_GETIFADDRS
|
A2_LOG_INFO("Checking configured addresses");
|
||||||
|
ULONG bufsize = 15*1024;
|
||||||
|
ULONG retval = 0;
|
||||||
|
IP_ADAPTER_ADDRESSES* buf = 0;
|
||||||
|
int numTry = 0;
|
||||||
|
const int MAX_TRY = 3;
|
||||||
|
do {
|
||||||
|
buf = reinterpret_cast<IP_ADAPTER_ADDRESSES*>(malloc(bufsize));
|
||||||
|
retval = GetAdaptersAddresses(AF_UNSPEC, 0, 0, buf, &bufsize);
|
||||||
|
if(retval == ERROR_BUFFER_OVERFLOW) {
|
||||||
|
free(buf);
|
||||||
|
buf = 0;
|
||||||
|
} else {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
} while(retval == ERROR_BUFFER_OVERFLOW && numTry < MAX_TRY);
|
||||||
|
if(retval != NO_ERROR) {
|
||||||
|
A2_LOG_INFO("GetAdaptersAddresses failed. Assume both IPv4 and IPv6 "
|
||||||
|
" addresses are configured.");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
ipv4AddrConfigured = false;
|
||||||
|
ipv6AddrConfigured = false;
|
||||||
|
char host[NI_MAXHOST];
|
||||||
|
sockaddr_union ad;
|
||||||
|
int rv;
|
||||||
|
for(IP_ADAPTER_ADDRESSES* p = buf; p; p = p->Next) {
|
||||||
|
PIP_ADAPTER_UNICAST_ADDRESS ucaddr = p->FirstUnicastAddress;
|
||||||
|
if(ucaddr) {
|
||||||
|
for(PIP_ADAPTER_UNICAST_ADDRESS i = ucaddr; i; i = i->Next) {
|
||||||
|
bool found = false;
|
||||||
|
switch(i->Address.iSockaddrLength) {
|
||||||
|
case sizeof(sockaddr_in):
|
||||||
|
memcpy(&ad.storage, i->Address.lpSockaddr,
|
||||||
|
i->Address.iSockaddrLength);
|
||||||
|
if(ad.in.sin_addr.s_addr != htonl(INADDR_LOOPBACK)) {
|
||||||
|
ipv4AddrConfigured = true;
|
||||||
|
found = true;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case sizeof(sockaddr_in6):
|
||||||
|
memcpy(&ad.storage, i->Address.lpSockaddr,
|
||||||
|
i->Address.iSockaddrLength);
|
||||||
|
if(!IN6_IS_ADDR_LOOPBACK(&ad.in6.sin6_addr) &&
|
||||||
|
!IN6_IS_ADDR_LINKLOCAL(&ad.in6.sin6_addr)) {
|
||||||
|
ipv6AddrConfigured = true;
|
||||||
|
found = true;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
rv = getnameinfo(i->Address.lpSockaddr, i->Address.iSockaddrLength,
|
||||||
|
host, NI_MAXHOST, 0, 0, NI_NUMERICHOST);
|
||||||
|
if(rv == 0) {
|
||||||
|
if(found) {
|
||||||
|
A2_LOG_INFO(fmt("Found configured address: %s", host));
|
||||||
|
} else {
|
||||||
|
A2_LOG_INFO(fmt("Not considered: %s", host));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
free(buf);
|
||||||
|
A2_LOG_INFO(fmt("IPv4 configured=%d, IPv6 configured=%d",
|
||||||
|
ipv4AddrConfigured, ipv6AddrConfigured));
|
||||||
|
#elif defined(HAVE_GETIFADDRS)
|
||||||
A2_LOG_INFO("Checking configured addresses");
|
A2_LOG_INFO("Checking configured addresses");
|
||||||
ipv4AddrConfigured = false;
|
ipv4AddrConfigured = false;
|
||||||
ipv6AddrConfigured = false;
|
ipv6AddrConfigured = false;
|
||||||
|
|
Loading…
Reference in New Issue