OSUtils::resolve()

This commit is contained in:
Adam Ierymenko 2015-04-20 16:07:38 -07:00
parent 69076f8a45
commit 86c87875a7
3 changed files with 54 additions and 1 deletions

View File

@ -38,9 +38,11 @@
#include <errno.h>
#include <fcntl.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <sys/stat.h>
#include <sys/uio.h>
#include <dirent.h>
#include <netdb.h>
#endif
#ifdef __WINDOWS__
@ -174,6 +176,34 @@ int64_t OSUtils::getFileSize(const char *path)
return -1;
}
std::vector<InetAddress> OSUtils::resolve(const char *name)
{
std::vector<InetAddress> r;
std::vector<InetAddress>::iterator i;
InetAddress tmp;
struct addrinfo *ai = (struct addrinfo *)0,*p;
if (!getaddrinfo(name,(const char *)0,(const struct addrinfo *)0,&ai)) {
try {
p = ai;
while (p) {
if ((p->ai_addr)&&((p->ai_addr->sa_family == AF_INET)||(p->ai_addr->sa_family == AF_INET6))) {
tmp = *(p->ai_addr);
for(i=r.begin();i!=r.end();++i) {
if (i->ipsEqual(tmp))
goto skip_add_inetaddr;
}
r.push_back(tmp);
}
skip_add_inetaddr:
p = p->ai_next;
}
} catch ( ... ) {}
freeaddrinfo(ai);
}
std::sort(r.begin(),r.end());
return r;
}
bool OSUtils::readFile(const char *path,std::string &buf)
{
char tmp[4096];

View File

@ -40,6 +40,7 @@
#include <map>
#include "../node/Constants.hpp"
#include "../node/InetAddress.hpp"
#ifdef __WINDOWS__
#include <WinSock2.h>
@ -146,6 +147,16 @@ public:
*/
static int64_t getFileSize(const char *path);
/**
* Get IP (v4 and/or v6) addresses for a given host
*
* This is a blocking resolver.
*
* @param name Host name
* @return IP addresses in InetAddress sort order or empty vector if not found
*/
static std::vector<InetAddress> resolve(const char *name);
/**
* @return Current time in milliseconds since epoch
*/

View File

@ -758,7 +758,19 @@ static int testHttp()
std::map<std::string,std::string> requestHeaders,responseHeaders;
std::string responseBody;
InetAddress downloadZerotierDotCom("142.4.214.72/80");
InetAddress downloadZerotierDotCom;
std::vector<InetAddress> rr(OSUtils::resolve("download.zerotier.com"));
if (rr.empty()) {
std::cout << "[http] Resolve of download.zerotier.com failed, skipping." << std::endl;
return 0;
} else {
for(std::vector<InetAddress>::iterator r(rr.begin());r!=rr.end();++r) {
std::cout << "[http] download.zerotier.com: " << r->toString() << std::endl;
if (r->isV4())
downloadZerotierDotCom = *r;
}
}
downloadZerotierDotCom.setPort(80);
std::cout << "[http] GET http://download.zerotier.com/dev/1k @" << downloadZerotierDotCom.toString() << " ... "; std::cout.flush();
requestHeaders["Host"] = "download.zerotier.com";