The Cygwin resolver library doesn't fill out the list of name servers in

res_init() if /etc/resolv.conf doesn't exist, which is usual.

Add code to handle this by calling GetNetworkParams().


git-svn-id: svn://svn.code.sf.net/p/bitchx/code/trunk@198 13b04d17-f746-0410-82c6-800466cd88b0
This commit is contained in:
Kevin Easton
2012-05-28 13:52:18 +00:00
parent 1c2581aea3
commit d13eee6683
2 changed files with 44 additions and 2 deletions

View File

@@ -164,6 +164,8 @@ if test x"$bx_cv_lib_resolver" != x"not found"; then
if test x"$bx_cv_lib_resolver" != x"none required"; then if test x"$bx_cv_lib_resolver" != x"none required"; then
LIBS="$bx_cv_lib_resolver $LIBS" LIBS="$bx_cv_lib_resolver $LIBS"
fi fi
dnl This is for getting the DNS servers on Windows
AC_CHECK_HEADER([iphlpapi.h], [AC_CHECK_LIB(iphlpapi, GetNetworkParams, [], [])], [], [#include <windows.h>])
else else
AC_MSG_WARN([No resolver library found, /nslookup will be disabled.]) AC_MSG_WARN([No resolver library found, /nslookup will be disabled.])
fi fi

View File

@@ -2053,6 +2053,36 @@ static struct resstats {
int re_timeouts; int re_timeouts;
} ar_reinfo; } ar_reinfo;
#ifdef HAVE_LIBIPHLPAPI
#include <windows.h>
#include <iphlpapi.h>
void ar_get_windows_dns(void)
{
DWORD ret;
ULONG buflen = 0;
FIXED_INFO *buf;
ret = GetNetworkParams(NULL, &buflen);
if (ret != ERROR_BUFFER_OVERFLOW)
return;
buf = new_malloc(buflen);
ret = GetNetworkParams(buf, &buflen);
if (ret == NO_ERROR)
{
_res.nscount = 1;
_res.nsaddr_list[0].sin_family = AF_INET;
_res.nsaddr_list[0].sin_addr.s_addr = inet_addr(buf->DnsServerList.IpAddress.String);
_res.nsaddr_list[0].sin_port = htons(53);
}
new_free(&buf);
return;
}
#endif /* HAVE_LIBIPHLPAPI */
/* /*
* ar_init * ar_init
* *
@@ -2079,10 +2109,20 @@ int ar_init(int op)
ret = res_init(); ret = res_init();
(void)strcpy(ar_domainname, ar_dot); (void)strcpy(ar_domainname, ar_dot);
(void)strncat(ar_domainname, _res.defdname, HOSTLEN-2); (void)strncat(ar_domainname, _res.defdname, HOSTLEN-2);
if (!_res.nscount) #ifdef HAVE_LIBIPHLPAPI
/* The Cygwin resolver library doesn't fill out _res.nsaddr_list
* and sets _res.nscount to -1 if there's no /etc/resolv.conf file,
* so we try fetching the first DNS server address ourselves. */
if (_res.nscount < 1)
ar_get_windows_dns();
#endif
if (_res.nscount < 1)
{ {
/* Try falling back to the Google public DNS */
_res.nscount = 1; _res.nscount = 1;
_res.nsaddr_list[0].sin_addr.s_addr = inet_addr("127.0.0.1"); _res.nsaddr_list[0].sin_family = AF_INET;
_res.nsaddr_list[0].sin_addr.s_addr = inet_addr("8.8.8.8");
_res.nsaddr_list[0].sin_port = htons(53);
} }
} }