#82, switch to gethostbyname() for win32 support

This commit is contained in:
Erik Ekman
2009-09-26 09:42:32 +00:00
committed by Erik Ekman
parent c5bdf07070
commit 1a26a91db3
4 changed files with 33 additions and 21 deletions

View File

@@ -145,26 +145,40 @@ client_set_nameserver(const char *cp, int port)
struct in_addr addr;
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
/* MinGW only supports getaddrinfo on WinXP and higher..
* so turn it off in windows for now
*
* try resolving if a domain is given */
struct addrinfo *addrinfo;
struct addrinfo *res;
if (getaddrinfo(cp, NULL, NULL, &addrinfo) == 0) {
struct sockaddr_in *inaddr;
for (res = addrinfo; res != NULL; res = res->ai_next) {
inaddr = (struct sockaddr_in *) res->ai_addr;
addr = inaddr->sin_addr;
err = hstrerror(h_errno);
#else
{
DWORD wserr = WSAGetLastError();
switch (wserr) {
case WSAHOST_NOT_FOUND:
err = "Host not found";
break;
case WSANO_DATA:
err = "No data record found";
break;
default:
err = "Unknown error";
break;
}
freeaddrinfo(addrinfo);
} else
#endif
errx(1, "error parsing nameserver address: '%s'", cp);
}
#endif /* !WINDOWS32 */
errx(1, "error resolving nameserver '%s': %s", cp, err);
}
setaddr:
memset(&nameserv, 0, sizeof(nameserv));
nameserv.sin_family = AF_INET;
nameserv.sin_port = htons(port);

View File

@@ -89,8 +89,7 @@ help() {
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, " -F pidfile to write pid to a file\n");
fprintf(stderr, "nameserver is the IP number/hostname of the relaying nameserver\n "
"(hostname not supported on win32). if absent, /etc/resolv.conf is used\n");
fprintf(stderr, "nameserver is the IP number/hostname of the relaying nameserver. if absent, /etc/resolv.conf is used\n");
fprintf(stderr, "topdomain is the FQDN that is delegated to the tunnel endpoint.\n");
exit(0);