mirror of
https://github.com/zerotier/ZeroTierOne.git
synced 2025-06-05 03:53:44 +02:00
OSUtils::resolve()
This commit is contained in:
parent
69076f8a45
commit
86c87875a7
3 changed files with 54 additions and 1 deletions
|
@ -38,9 +38,11 @@
|
||||||
#include <errno.h>
|
#include <errno.h>
|
||||||
#include <fcntl.h>
|
#include <fcntl.h>
|
||||||
#include <sys/types.h>
|
#include <sys/types.h>
|
||||||
|
#include <sys/socket.h>
|
||||||
#include <sys/stat.h>
|
#include <sys/stat.h>
|
||||||
#include <sys/uio.h>
|
#include <sys/uio.h>
|
||||||
#include <dirent.h>
|
#include <dirent.h>
|
||||||
|
#include <netdb.h>
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef __WINDOWS__
|
#ifdef __WINDOWS__
|
||||||
|
@ -174,6 +176,34 @@ int64_t OSUtils::getFileSize(const char *path)
|
||||||
return -1;
|
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)
|
bool OSUtils::readFile(const char *path,std::string &buf)
|
||||||
{
|
{
|
||||||
char tmp[4096];
|
char tmp[4096];
|
||||||
|
|
|
@ -40,6 +40,7 @@
|
||||||
#include <map>
|
#include <map>
|
||||||
|
|
||||||
#include "../node/Constants.hpp"
|
#include "../node/Constants.hpp"
|
||||||
|
#include "../node/InetAddress.hpp"
|
||||||
|
|
||||||
#ifdef __WINDOWS__
|
#ifdef __WINDOWS__
|
||||||
#include <WinSock2.h>
|
#include <WinSock2.h>
|
||||||
|
@ -146,6 +147,16 @@ public:
|
||||||
*/
|
*/
|
||||||
static int64_t getFileSize(const char *path);
|
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
|
* @return Current time in milliseconds since epoch
|
||||||
*/
|
*/
|
||||||
|
|
14
selftest.cpp
14
selftest.cpp
|
@ -758,7 +758,19 @@ static int testHttp()
|
||||||
std::map<std::string,std::string> requestHeaders,responseHeaders;
|
std::map<std::string,std::string> requestHeaders,responseHeaders;
|
||||||
std::string responseBody;
|
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();
|
std::cout << "[http] GET http://download.zerotier.com/dev/1k @" << downloadZerotierDotCom.toString() << " ... "; std::cout.flush();
|
||||||
requestHeaders["Host"] = "download.zerotier.com";
|
requestHeaders["Host"] = "download.zerotier.com";
|
||||||
|
|
Loading…
Add table
Reference in a new issue