summaryrefslogtreecommitdiff
path: root/cpp/src/Ice/Network.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'cpp/src/Ice/Network.cpp')
-rw-r--r--cpp/src/Ice/Network.cpp39
1 files changed, 34 insertions, 5 deletions
diff --git a/cpp/src/Ice/Network.cpp b/cpp/src/Ice/Network.cpp
index 089e275f49d..ee60a34585f 100644
--- a/cpp/src/Ice/Network.cpp
+++ b/cpp/src/Ice/Network.cpp
@@ -51,7 +51,7 @@ using namespace std;
using namespace Ice;
using namespace IceInternal;
-#ifdef __sun
+#if defined(__sun) && !defined(__GNUC__)
# define INADDR_NONE (in_addr_t)0xffffffff
#endif
@@ -238,22 +238,51 @@ getLocalAddresses(ProtocolSupport protocol)
{
if(!(ifr[i].ifr_flags & IFF_LOOPBACK)) // Don't include loopback interface addresses
{
+ //
+ // On Solaris the above Loopback check does not always work so we double
+ // check the address below. Solaris also returns duplicate entries that need
+ // to be filtered out.
+ //
if(ifr[i].ifr_addr.sa_family == AF_INET && protocol != EnableIPv6)
{
sockaddr_storage addr;
memcpy(&addr, &ifr[i].ifr_addr, sizeof(sockaddr_in));
- if(reinterpret_cast<struct sockaddr_in*>(&addr)->sin_addr.s_addr != 0)
+ struct in_addr* inaddr = &reinterpret_cast<struct sockaddr_in*>(&addr)->sin_addr;
+ if(inaddr->s_addr != 0 && inaddr->s_addr != htonl(INADDR_LOOPBACK))
{
- result.push_back(addr);
+ unsigned int j;
+ for(j = 0; j < result.size(); ++j)
+ {
+ if(compareAddress(addr, result[j]) == 0)
+ {
+ break;
+ }
+ }
+ if(j == result.size())
+ {
+ result.push_back(addr);
+ }
}
}
else if(ifr[i].ifr_addr.sa_family == AF_INET6 && protocol != EnableIPv4)
{
sockaddr_storage addr;
memcpy(&addr, &ifr[i].ifr_addr, sizeof(sockaddr_in6));
- if(!IN6_IS_ADDR_UNSPECIFIED(&reinterpret_cast<struct sockaddr_in6*>(&addr)->sin6_addr))
+ struct in6_addr* inaddr6 = &reinterpret_cast<struct sockaddr_in6*>(&addr)->sin6_addr;
+ if(!IN6_IS_ADDR_UNSPECIFIED(inaddr6) && !IN6_IS_ADDR_LOOPBACK(inaddr6))
{
- result.push_back(addr);
+ unsigned int j;
+ for(j = 0; j < result.size(); ++j)
+ {
+ if(compareAddress(addr, result[j]) == 0)
+ {
+ break;
+ }
+ }
+ if(j == result.size())
+ {
+ result.push_back(addr);
+ }
}
}
}