diff options
author | Adam Ierymenko <adam.ierymenko@gmail.com> | 2015-04-14 14:52:23 -0700 |
---|---|---|
committer | Adam Ierymenko <adam.ierymenko@gmail.com> | 2015-04-14 14:52:23 -0700 |
commit | 758b5caf945bad08d59a5832aeecff7af504d5de (patch) | |
tree | 46fd505c916babab740af322ac936a5f003200ab /node | |
parent | 6f4b30add8bc3a1de9000aaf36eef67e50333b05 (diff) | |
download | infinitytier-758b5caf945bad08d59a5832aeecff7af504d5de.tar.gz infinitytier-758b5caf945bad08d59a5832aeecff7af504d5de.zip |
Fix < logic.
Diffstat (limited to 'node')
-rw-r--r-- | node/InetAddress.cpp | 28 |
1 files changed, 19 insertions, 9 deletions
diff --git a/node/InetAddress.cpp b/node/InetAddress.cpp index 3727d471..54fc763f 100644 --- a/node/InetAddress.cpp +++ b/node/InetAddress.cpp @@ -301,23 +301,33 @@ bool InetAddress::operator==(const InetAddress &a) const bool InetAddress::operator<(const InetAddress &a) const throw() { - if (ss_family < a.ss_family) { + if (ss_family < a.ss_family) + return true; + else if (ss_family == a.ss_family) { switch(ss_family) { case AF_INET: if (reinterpret_cast<const struct sockaddr_in *>(this)->sin_port < reinterpret_cast<const struct sockaddr_in *>(&a)->sin_port) return true; - if (reinterpret_cast<const struct sockaddr_in *>(this)->sin_addr.s_addr < reinterpret_cast<const struct sockaddr_in *>(&a)->sin_addr.s_addr) - return true; + else if (reinterpret_cast<const struct sockaddr_in *>(this)->sin_port == reinterpret_cast<const struct sockaddr_in *>(&a)->sin_port) { + if (reinterpret_cast<const struct sockaddr_in *>(this)->sin_addr.s_addr < reinterpret_cast<const struct sockaddr_in *>(&a)->sin_addr.s_addr) + return true; + } break; case AF_INET6: if (reinterpret_cast<const struct sockaddr_in6 *>(this)->sin6_port < reinterpret_cast<const struct sockaddr_in6 *>(&a)->sin6_port) return true; - if (reinterpret_cast<const struct sockaddr_in6 *>(this)->sin6_flowinfo < reinterpret_cast<const struct sockaddr_in6 *>(&a)->sin6_flowinfo) - return true; - if (memcmp(reinterpret_cast<const struct sockaddr_in6 *>(this)->sin6_addr.s6_addr,reinterpret_cast<const struct sockaddr_in6 *>(&a)->sin6_addr.s6_addr,16) < 0) - return true; - if (reinterpret_cast<const struct sockaddr_in6 *>(this)->sin6_scope_id < reinterpret_cast<const struct sockaddr_in6 *>(&a)->sin6_scope_id) - return true; + else if (reinterpret_cast<const struct sockaddr_in6 *>(this)->sin6_port == reinterpret_cast<const struct sockaddr_in6 *>(&a)->sin6_port) { + if (reinterpret_cast<const struct sockaddr_in6 *>(this)->sin6_flowinfo < reinterpret_cast<const struct sockaddr_in6 *>(&a)->sin6_flowinfo) + return true; + else if (reinterpret_cast<const struct sockaddr_in6 *>(this)->sin6_flowinfo == reinterpret_cast<const struct sockaddr_in6 *>(&a)->sin6_flowinfo) { + if (memcmp(reinterpret_cast<const struct sockaddr_in6 *>(this)->sin6_addr.s6_addr,reinterpret_cast<const struct sockaddr_in6 *>(&a)->sin6_addr.s6_addr,16) < 0) + return true; + else if (memcmp(reinterpret_cast<const struct sockaddr_in6 *>(this)->sin6_addr.s6_addr,reinterpret_cast<const struct sockaddr_in6 *>(&a)->sin6_addr.s6_addr,16) == 0) { + if (reinterpret_cast<const struct sockaddr_in6 *>(this)->sin6_scope_id < reinterpret_cast<const struct sockaddr_in6 *>(&a)->sin6_scope_id) + return true; + } + } + } break; default: return (memcmp(this,&a,sizeof(InetAddress)) < 0); |