diff options
| author | Alan Conway <aconway@apache.org> | 2012-05-08 15:04:38 +0000 |
|---|---|---|
| committer | Alan Conway <aconway@apache.org> | 2012-05-08 15:04:38 +0000 |
| commit | e20364fc61452aef02f6f30639b7e6c5638ec7a4 (patch) | |
| tree | 811dbd6f8652b07a49af88840b961ae3175049d8 /cpp/src/qpid/sys | |
| parent | 472d7e9119b311fc1c7d09a10660292aa4b581b9 (diff) | |
| download | qpid-python-e20364fc61452aef02f6f30639b7e6c5638ec7a4.tar.gz | |
QPID-3603: Added SystemInfo::isLocalHost to check if a host name refers to the local host.
git-svn-id: https://svn.apache.org/repos/asf/qpid/trunk/qpid@1335562 13f79535-47bb-0310-9956-ffa450edef68
Diffstat (limited to 'cpp/src/qpid/sys')
| -rwxr-xr-x | cpp/src/qpid/sys/posix/SystemInfo.cpp | 82 | ||||
| -rwxr-xr-x | cpp/src/qpid/sys/windows/SystemInfo.cpp | 6 |
2 files changed, 63 insertions, 25 deletions
diff --git a/cpp/src/qpid/sys/posix/SystemInfo.cpp b/cpp/src/qpid/sys/posix/SystemInfo.cpp index 540cc8bc91..f6250f5831 100755 --- a/cpp/src/qpid/sys/posix/SystemInfo.cpp +++ b/cpp/src/qpid/sys/posix/SystemInfo.cpp @@ -19,9 +19,9 @@ */ #include "qpid/sys/SystemInfo.h" - #include "qpid/sys/posix/check.h" - +#include <set> +#include <arpa/inet.h> #include <sys/ioctl.h> #include <sys/utsname.h> #include <sys/types.h> // For FreeBSD @@ -71,38 +71,70 @@ void SystemInfo::getLocalIpAddresses (uint16_t port, int family = ifap->ifa_addr->sa_family; switch (family) { - case AF_INET: { - char dispName[NI_MAXHOST]; - int rc = ::getnameinfo( - ifap->ifa_addr, - (family == AF_INET) - ? sizeof(struct sockaddr_in) - : sizeof(struct sockaddr_in6), - dispName, sizeof(dispName), - 0, 0, NI_NUMERICHOST); - if (rc != 0) { - throw QPID_POSIX_ERROR(rc); - } - string addr(dispName); - if (addr != LOCALHOST) { - addrList.push_back(Address(TCP, addr, port)); - } - break; - } - // TODO: Url parsing currently can't cope with IPv6 addresses so don't return them - // when it can cope move this line to above "case AF_INET:" - case AF_INET6: - default: + case AF_INET: { + char dispName[NI_MAXHOST]; + int rc = ::getnameinfo( + ifap->ifa_addr, + (family == AF_INET) + ? sizeof(struct sockaddr_in) + : sizeof(struct sockaddr_in6), + dispName, sizeof(dispName), + 0, 0, NI_NUMERICHOST); + if (rc != 0) { + throw QPID_POSIX_ERROR(rc); + } + string addr(dispName); + if (addr != LOCALHOST) { + addrList.push_back(Address(TCP, addr, port)); + } + break; + } + // TODO: Url parsing currently can't cope with IPv6 addresses so don't return them + // when it can cope move this line to above "case AF_INET:" + case AF_INET6: + default: continue; } } - freeifaddrs(ifaddr); + ::freeifaddrs(ifaddr); if (addrList.empty()) { addrList.push_back(Address(TCP, LOCALHOST, port)); } } +namespace { +struct AddrInfo { + struct addrinfo* ptr; + AddrInfo(const std::string& host) : ptr(0) { + if (::getaddrinfo(host.c_str(), NULL, NULL, &ptr) != 0) + ptr = 0; + } + ~AddrInfo() { if (ptr) ::freeaddrinfo(ptr); } +}; +} + +bool SystemInfo::isLocalHost(const std::string& host) { + if (host == LOCALHOST) return true; + std::vector<Address> myAddrs; + getLocalIpAddresses(0, myAddrs); + std::set<string> localHosts; + for (std::vector<Address>::const_iterator i = myAddrs.begin(); i != myAddrs.end(); ++i) + localHosts.insert(i->host); + // Resolve host + AddrInfo ai(host); + if (!ai.ptr) return false; + for (struct addrinfo *res = ai.ptr; res != NULL; res = res->ai_next) { + // Get string form of IP addr + char addr[NI_MAXHOST] = ""; + int error = ::getnameinfo(res->ai_addr, res->ai_addrlen, addr, NI_MAXHOST, NULL, 0, + NI_NUMERICHOST | NI_NUMERICSERV); + if (error) return false; + if (localHosts.find(addr) != localHosts.end()) return true; + } + return false; +} + void SystemInfo::getSystemId (std::string &osName, std::string &nodeName, std::string &release, diff --git a/cpp/src/qpid/sys/windows/SystemInfo.cpp b/cpp/src/qpid/sys/windows/SystemInfo.cpp index 4da440bdd4..f1b62d80ff 100755 --- a/cpp/src/qpid/sys/windows/SystemInfo.cpp +++ b/cpp/src/qpid/sys/windows/SystemInfo.cpp @@ -93,6 +93,12 @@ void SystemInfo::getLocalIpAddresses (uint16_t port, } } +bool SystemInfo::isLocalHost(const std::string& candidateHost) { + // FIXME aconway 2012-05-03: not implemented. + assert(0); + throw Exception("Not implemented: isLocalHost"); +} + void SystemInfo::getSystemId (std::string &osName, std::string &nodeName, std::string &release, |
