diff options
author | Adam Ierymenko <adam.ierymenko@gmail.com> | 2015-04-20 16:07:38 -0700 |
---|---|---|
committer | Adam Ierymenko <adam.ierymenko@gmail.com> | 2015-04-20 16:07:38 -0700 |
commit | 86c87875a78efc84b123cf1661a31cb06f240f59 (patch) | |
tree | 23bacc28e28ee13faebc2805305a1652ce38dfba /osdep | |
parent | 69076f8a45a3d5d521ef69ce3df2667c1fbcbfd4 (diff) | |
download | infinitytier-86c87875a78efc84b123cf1661a31cb06f240f59.tar.gz infinitytier-86c87875a78efc84b123cf1661a31cb06f240f59.zip |
OSUtils::resolve()
Diffstat (limited to 'osdep')
-rw-r--r-- | osdep/OSUtils.cpp | 30 | ||||
-rw-r--r-- | osdep/OSUtils.hpp | 11 |
2 files changed, 41 insertions, 0 deletions
diff --git a/osdep/OSUtils.cpp b/osdep/OSUtils.cpp index a8639a12..0ff7bfc4 100644 --- a/osdep/OSUtils.cpp +++ b/osdep/OSUtils.cpp @@ -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]; diff --git a/osdep/OSUtils.hpp b/osdep/OSUtils.hpp index 0cf4916b..4422ab7d 100644 --- a/osdep/OSUtils.hpp +++ b/osdep/OSUtils.hpp @@ -40,6 +40,7 @@ #include <map> #include "../node/Constants.hpp" +#include "../node/InetAddress.hpp" #ifdef __WINDOWS__ #include <WinSock2.h> @@ -147,6 +148,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 */ static inline uint64_t now() |