#82, switch to gethostbyname() for win32 support
This commit is contained in:
parent
c5bdf07070
commit
1a26a91db3
|
@ -28,7 +28,7 @@ CHANGES:
|
||||||
- Added support for CNAME/TXT/A/MX query types, fixes #75.
|
- Added support for CNAME/TXT/A/MX query types, fixes #75.
|
||||||
Patch by Anne Bezemer, merge help by logix.
|
Patch by Anne Bezemer, merge help by logix.
|
||||||
- Merged low-latency patch from Anne Bezemer, fixes #76.
|
- Merged low-latency patch from Anne Bezemer, fixes #76.
|
||||||
- Resolve client nameserver argument (except on win32), #82.
|
- Resolve client nameserver argument if given as hostname, fixes #82.
|
||||||
|
|
||||||
2009-06-01: 0.5.2 "WifiFree"
|
2009-06-01: 0.5.2 "WifiFree"
|
||||||
- Fixed client segfault on OS X, #57
|
- Fixed client segfault on OS X, #57
|
||||||
|
|
|
@ -221,9 +221,8 @@ in production environments.
|
||||||
.B nameserver
|
.B nameserver
|
||||||
The nameserver to use to relay the dns traffic. This can be any relaying
|
The nameserver to use to relay the dns traffic. This can be any relaying
|
||||||
nameserver or the server running iodined if reachable. This field can be
|
nameserver or the server running iodined if reachable. This field can be
|
||||||
given as an IP address, or as a hostname (except on Win32 currently).
|
given as an IP address, or as a hostname. This argument is optional, and
|
||||||
This argument is optional, and if not specified a nameserver will be read
|
if not specified a nameserver will be read from the
|
||||||
from the
|
|
||||||
.I /etc/resolv.conf
|
.I /etc/resolv.conf
|
||||||
file.
|
file.
|
||||||
.TP
|
.TP
|
||||||
|
|
44
src/client.c
44
src/client.c
|
@ -145,26 +145,40 @@ client_set_nameserver(const char *cp, int port)
|
||||||
struct in_addr addr;
|
struct in_addr addr;
|
||||||
|
|
||||||
if (inet_aton(cp, &addr) != 1) {
|
if (inet_aton(cp, &addr) != 1) {
|
||||||
|
/* try resolving if a domain is given */
|
||||||
|
struct hostent *host;
|
||||||
|
const char *err;
|
||||||
|
host = gethostbyname(cp);
|
||||||
|
if (host != NULL && h_errno > 0) {
|
||||||
|
int i = 0;
|
||||||
|
while (host->h_addr_list[i] != 0) {
|
||||||
|
addr = *(struct in_addr *) host->h_addr_list[i++];
|
||||||
|
fprintf(stderr, "Resolved %s to %s\n", cp, inet_ntoa(addr));
|
||||||
|
goto setaddr;
|
||||||
|
}
|
||||||
|
}
|
||||||
#ifndef WINDOWS32
|
#ifndef WINDOWS32
|
||||||
/* MinGW only supports getaddrinfo on WinXP and higher..
|
err = hstrerror(h_errno);
|
||||||
* so turn it off in windows for now
|
#else
|
||||||
*
|
{
|
||||||
* try resolving if a domain is given */
|
DWORD wserr = WSAGetLastError();
|
||||||
struct addrinfo *addrinfo;
|
switch (wserr) {
|
||||||
struct addrinfo *res;
|
case WSAHOST_NOT_FOUND:
|
||||||
if (getaddrinfo(cp, NULL, NULL, &addrinfo) == 0) {
|
err = "Host not found";
|
||||||
struct sockaddr_in *inaddr;
|
break;
|
||||||
for (res = addrinfo; res != NULL; res = res->ai_next) {
|
case WSANO_DATA:
|
||||||
inaddr = (struct sockaddr_in *) res->ai_addr;
|
err = "No data record found";
|
||||||
addr = inaddr->sin_addr;
|
break;
|
||||||
|
default:
|
||||||
|
err = "Unknown error";
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
freeaddrinfo(addrinfo);
|
}
|
||||||
} else
|
#endif /* !WINDOWS32 */
|
||||||
#endif
|
errx(1, "error resolving nameserver '%s': %s", cp, err);
|
||||||
errx(1, "error parsing nameserver address: '%s'", cp);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
setaddr:
|
||||||
memset(&nameserv, 0, sizeof(nameserv));
|
memset(&nameserv, 0, sizeof(nameserv));
|
||||||
nameserv.sin_family = AF_INET;
|
nameserv.sin_family = AF_INET;
|
||||||
nameserv.sin_port = htons(port);
|
nameserv.sin_port = htons(port);
|
||||||
|
|
|
@ -89,8 +89,7 @@ help() {
|
||||||
fprintf(stderr, " -I max interval between requests (default 4 sec) to prevent server timeouts\n");
|
fprintf(stderr, " -I max interval between requests (default 4 sec) to prevent server timeouts\n");
|
||||||
fprintf(stderr, " -z context, to apply specified SELinux context after initialization\n");
|
fprintf(stderr, " -z context, to apply specified SELinux context after initialization\n");
|
||||||
fprintf(stderr, " -F pidfile to write pid to a file\n");
|
fprintf(stderr, " -F pidfile to write pid to a file\n");
|
||||||
fprintf(stderr, "nameserver is the IP number/hostname of the relaying nameserver\n "
|
fprintf(stderr, "nameserver is the IP number/hostname of the relaying nameserver. if absent, /etc/resolv.conf is used\n");
|
||||||
"(hostname not supported on win32). if absent, /etc/resolv.conf is used\n");
|
|
||||||
fprintf(stderr, "topdomain is the FQDN that is delegated to the tunnel endpoint.\n");
|
fprintf(stderr, "topdomain is the FQDN that is delegated to the tunnel endpoint.\n");
|
||||||
|
|
||||||
exit(0);
|
exit(0);
|
||||||
|
|
Loading…
Reference in New Issue