diff --git a/rak/socket_address.h b/rak/socket_address.h index d38533e5..d1d5b722 100644 --- a/rak/socket_address.h +++ b/rak/socket_address.h @@ -109,13 +109,11 @@ public: const sockaddr* c_sockaddr() const { return &m_sockaddr; } const sockaddr_in* c_sockaddr_inet() const { return &m_sockaddrInet; } -#ifdef RAK_USE_INET6 socket_address_inet6* sa_inet6() { return reinterpret_cast(this); } const socket_address_inet6* sa_inet6() const { return reinterpret_cast(this); } sockaddr_in6* c_sockaddr_inet6() { return &m_sockaddrInet6; } const sockaddr_in6* c_sockaddr_inet6() const { return &m_sockaddrInet6; } -#endif // Copy a socket address which has the length 'length. Zero out any // extranous bytes and ensure it does not go beyond the size of this @@ -139,9 +137,7 @@ private: union { sockaddr m_sockaddr; sockaddr_in m_sockaddrInet; -#ifdef RAK_USE_INET6 sockaddr_in6 m_sockaddrInet6; -#endif }; }; @@ -185,9 +181,7 @@ public: const sockaddr* c_sockaddr() const { return reinterpret_cast(&m_sockaddr); } const sockaddr_in* c_sockaddr_inet() const { return &m_sockaddr; } -#ifdef RAK_USE_INET6 socket_address_inet6 to_mapped_address() const; -#endif bool operator == (const socket_address_inet& rhs) const; bool operator < (const socket_address_inet& rhs) const; @@ -196,9 +190,6 @@ private: struct sockaddr_in m_sockaddr; }; -#ifdef RAK_USE_INET6 -// Remember to set the AF_INET6. - class socket_address_inet6 { public: bool is_any() const { return is_port_any() && is_address_any(); } @@ -214,6 +205,7 @@ public: void set_port_n(uint16_t p) { m_sockaddr.sin6_port = p; } in6_addr address() const { return m_sockaddr.sin6_addr; } + const in6_addr* address_ptr() const { return &m_sockaddr.sin6_addr; } std::string address_str() const; bool address_c_str(char* buf, socklen_t size) const; @@ -240,61 +232,14 @@ public: private: struct sockaddr_in6 m_sockaddr; }; -#endif - -// Unique key for the address, excluding port numbers etc. -class socket_address_key { -public: -// socket_address_host_key() {} - - socket_address_key(const socket_address& sa) { - *this = sa; - } - - socket_address_key& operator = (const socket_address& sa) { - if (sa.family() == 0) { - std::memset(this, 0, sizeof(socket_address_key)); - - } else if (sa.family() == socket_address::af_inet) { - // Using hardware order as we use operator < to compare when - // using inet only. - m_addr.s_addr = sa.sa_inet()->address_h(); - - } else { - // When we implement INET6 handling, embed the ipv4 address in - // the ipv6 address. - throw std::logic_error("socket_address_key(...) received an unsupported protocol family."); - } - - return *this; - } - -// socket_address_key& operator = (const socket_address_key& sa) { -// } - - bool operator < (const socket_address_key& sa) const { - // Compare the memory area instead. - return m_addr.s_addr < sa.m_addr.s_addr; - } - -private: - union { - in_addr m_addr; -// #ifdef RAK_USE_INET6 -// in_addr6 m_addr6; -// #endif - }; -}; inline bool socket_address::is_valid() const { switch (family()) { case af_inet: return sa_inet()->is_valid(); -#ifdef RAK_USE_INET6 case af_inet6: return sa_inet6()->is_valid(); -#endif default: return false; } @@ -305,10 +250,8 @@ socket_address::is_bindable() const { switch (family()) { case af_inet: return !sa_inet()->is_address_any(); -#ifdef RAK_USE_INET6 case af_inet6: return !sa_inet6()->is_address_any(); -#endif default: return false; } @@ -319,10 +262,8 @@ socket_address::is_address_any() const { switch (family()) { case af_inet: return sa_inet()->is_address_any(); -#ifdef RAK_USE_INET6 case af_inet6: return sa_inet6()->is_address_any(); -#endif default: return true; } @@ -333,10 +274,8 @@ socket_address::port() const { switch (family()) { case af_inet: return sa_inet()->port(); -#ifdef RAK_USE_INET6 case af_inet6: return sa_inet6()->port(); -#endif default: return 0; } @@ -347,10 +286,8 @@ socket_address::set_port(uint16_t p) { switch (family()) { case af_inet: return sa_inet()->set_port(p); -#ifdef RAK_USE_INET6 case af_inet6: return sa_inet6()->set_port(p); -#endif default: break; } @@ -361,10 +298,8 @@ socket_address::address_str() const { switch (family()) { case af_inet: return sa_inet()->address_str(); -#ifdef RAK_USE_INET6 case af_inet6: return sa_inet6()->address_str(); -#endif default: return std::string(); } @@ -375,10 +310,8 @@ socket_address::address_c_str(char* buf, socklen_t size) const { switch (family()) { case af_inet: return sa_inet()->address_c_str(buf, size); -#ifdef RAK_USE_INET6 case af_inet6: return sa_inet6()->address_c_str(buf, size); -#endif default: return false; } @@ -390,11 +323,9 @@ socket_address::set_address_c_str(const char* a) { sa_inet()->set_family(); return true; -#ifdef RAK_USE_INET6 } else if (sa_inet6()->set_address_c_str(a)) { sa_inet6()->set_family(); return true; -#endif } else { return false; @@ -407,10 +338,8 @@ socket_address::length() const { switch(family()) { case af_inet: return sizeof(sockaddr_in); -#ifdef RAK_USE_INET6 case af_inet6: return sizeof(sockaddr_in6); -#endif default: return 0; } @@ -435,10 +364,8 @@ socket_address::operator == (const socket_address& rhs) const { switch (family()) { case af_inet: return *sa_inet() == *rhs.sa_inet(); -#ifdef RAK_USE_INET6 case af_inet6: return *sa_inet6() == *rhs.sa_inet6(); -#endif default: throw std::logic_error("socket_address::operator == (rhs) invalid type comparison."); } @@ -452,10 +379,8 @@ socket_address::operator < (const socket_address& rhs) const { switch (family()) { case af_inet: return *sa_inet() < *rhs.sa_inet(); -#ifdef RAK_USE_INET6 case af_inet6: return *sa_inet6() < *rhs.sa_inet6(); -#endif default: throw std::logic_error("socket_address::operator < (rhs) invalid type comparison."); } @@ -481,7 +406,6 @@ socket_address_inet::set_address_c_str(const char* a) { return inet_pton(AF_INET, a, &m_sockaddr.sin_addr); } -#ifdef RAK_USE_INET6 inline socket_address_inet6 socket_address_inet::to_mapped_address() const { uint32_t addr32[4]; @@ -496,7 +420,6 @@ socket_address_inet::to_mapped_address() const { sa.set_port_n(m_sockaddr.sin_port); return sa; } -#endif inline bool socket_address_inet::operator == (const socket_address_inet& rhs) const { @@ -513,8 +436,6 @@ socket_address_inet::operator < (const socket_address_inet& rhs) const { m_sockaddr.sin_port < rhs.m_sockaddr.sin_port); } -#ifdef RAK_USE_INET6 - inline std::string socket_address_inet6::address_str() const { char buf[INET6_ADDRSTRLEN]; @@ -564,8 +485,6 @@ socket_address_inet6::operator < (const socket_address_inet6& rhs) const { m_sockaddr.sin6_port < rhs.m_sockaddr.sin6_port); } -#endif - } #endif diff --git a/src/command_download.cc b/src/command_download.cc index 4d63215d..3694066b 100644 --- a/src/command_download.cc +++ b/src/command_download.cc @@ -308,13 +308,10 @@ apply_d_add_peer(core::Download* download, const std::string& arg) { if (download->download()->info()->is_private()) throw torrent::input_error("Download is private."); -#ifdef RAK_USE_INET6 ret = std::sscanf(arg.c_str(), "[%64[^]]]:%i%c", host, &port, &dummy); + if (ret < 1) ret = std::sscanf(arg.c_str(), "%1023[^:]:%i%c", host, &port, &dummy); -#else - ret = std::sscanf(arg.c_str(), "%1023[^:]:%i%c", host, &port, &dummy); -#endif if (ret == 1) port = 6881; @@ -324,11 +321,7 @@ apply_d_add_peer(core::Download* download, const std::string& arg) { if (port < 1 || port > 65535) throw torrent::input_error("Invalid port number."); -#ifdef RAK_USE_INET6 torrent::connection_manager()->resolver()(host, (int)rak::socket_address::pf_unspec, SOCK_STREAM, call_add_d_peer_t(download, port)); -#else - torrent::connection_manager()->resolver()(host, (int)rak::socket_address::pf_inet, SOCK_STREAM, call_add_d_peer_t(download, port)); -#endif } torrent::Object diff --git a/src/command_network.cc b/src/command_network.cc index 77c294ec..dc61997b 100644 --- a/src/command_network.cc +++ b/src/command_network.cc @@ -170,12 +170,8 @@ apply_scgi(const std::string& arg, int type) { lt_log_print(torrent::LOG_RPC_EVENTS, "The SCGI socket has not been bound to any address and likely poses a security risk."); -#ifdef RAK_USE_INET6 } else if (std::sscanf(arg.c_str(), "%1023[^:]:%i%c", address, &port, &dummy) == 2 || std::sscanf(arg.c_str(), "[%64[^]]]:%i%c", address, &port, &dummy) == 2) { // [xx::xx]:port format -#else - } else if (std::sscanf(arg.c_str(), "%1023[^:]:%i%c", address, &port, &dummy) == 2) { -#endif if ((err = rak::address_info::get_address_info(address,PF_UNSPEC, SOCK_STREAM, &ai)) != 0) throw torrent::input_error("Could not bind address: " + std::string(rak::address_info::strerror(err)) + "."); diff --git a/src/command_peer.cc b/src/command_peer.cc index abf0daeb..0b0e7a6b 100644 --- a/src/command_peer.cc +++ b/src/command_peer.cc @@ -70,12 +70,11 @@ retrieve_p_id_html(torrent::Peer* peer) { torrent::Object retrieve_p_address(torrent::Peer* peer) { const rak::socket_address *addr = rak::socket_address::cast_from(peer->peer_info()->socket_address()); -#ifdef RAK_USE_INET6 + if (addr->family() == rak::socket_address::af_inet6) return "[" + addr->address_str() + "]"; else -#endif - return addr->address_str(); + return addr->address_str(); } torrent::Object diff --git a/src/core/curl_get.cc b/src/core/curl_get.cc index 0cbc1384..30e461b0 100644 --- a/src/core/curl_get.cc +++ b/src/core/curl_get.cc @@ -95,9 +95,8 @@ CurlGet::start() { curl_easy_setopt(m_handle, CURLOPT_IPRESOLVE, CURL_IPRESOLVE_WHATEVER); curl_easy_setopt(m_handle, CURLOPT_ENCODING, ""); -#ifdef RAK_USE_INET6 + m_ipv6 = false; -#endif m_stack->add_get(this); } @@ -115,16 +114,16 @@ CurlGet::close() { m_handle = NULL; } -#ifdef RAK_USE_INET6 void CurlGet::retry_ipv6() { CURL* nhandle = curl_easy_duphandle(m_handle); + curl_easy_setopt(nhandle, CURLOPT_IPRESOLVE, CURL_IPRESOLVE_V6); curl_easy_cleanup(m_handle); + m_handle = nhandle; m_ipv6 = true; } -#endif void CurlGet::receive_timeout() { diff --git a/src/core/curl_get.h b/src/core/curl_get.h index b8ad5451..4ecedb92 100644 --- a/src/core/curl_get.h +++ b/src/core/curl_get.h @@ -57,10 +57,9 @@ public: void start(); void close(); -#ifdef RAK_USE_INET6 + bool is_using_ipv6() { return m_ipv6; } void retry_ipv6(); -#endif bool is_busy() const { return m_handle; } bool is_active() const { return m_active; } @@ -79,9 +78,7 @@ private: void receive_timeout(); bool m_active; -#ifdef RAK_USE_INET6 bool m_ipv6; -#endif rak::priority_item m_taskTimeout; diff --git a/src/core/manager.cc b/src/core/manager.cc index cdd1f88d..b00fe6d4 100644 --- a/src/core/manager.cc +++ b/src/core/manager.cc @@ -228,13 +228,8 @@ Manager::set_bind_address(const std::string& addr) { int err; rak::address_info* ai; - -#ifdef RAK_USE_INET6 if ((err = rak::address_info::get_address_info(addr.c_str(), PF_INET, SOCK_STREAM, &ai)) != 0 && (err = rak::address_info::get_address_info(addr.c_str(), PF_INET6, SOCK_STREAM, &ai)) != 0) -#else - if ((err = rak::address_info::get_address_info(addr.c_str(), PF_INET, SOCK_STREAM, &ai)) != 0) -#endif throw torrent::input_error("Could not set bind address: " + std::string(rak::address_info::strerror(err)) + "."); try { @@ -268,12 +263,8 @@ Manager::set_local_address(const std::string& addr) { int err; rak::address_info* ai; -#ifdef RAK_USE_INET6 if ((err = rak::address_info::get_address_info(addr.c_str(), PF_INET, SOCK_STREAM, &ai)) != 0 && (err = rak::address_info::get_address_info(addr.c_str(), PF_INET6, SOCK_STREAM, &ai)) != 0) -#else - if ((err = rak::address_info::get_address_info(addr.c_str(), PF_INET, SOCK_STREAM, &ai)) != 0) -#endif throw torrent::input_error("Could not set local address: " + std::string(rak::address_info::strerror(err)) + "."); try { diff --git a/src/display/window_peer_list.cc b/src/display/window_peer_list.cc index 76d2fd97..aa1701d9 100644 --- a/src/display/window_peer_list.cc +++ b/src/display/window_peer_list.cc @@ -68,11 +68,7 @@ WindowPeerList::redraw() { int x = 2; int y = 0; -#ifdef RAK_USE_INET6 m_canvas->print(x, y, "IP"); x += 25; -#else - m_canvas->print(x, y, "IP"); x += 16; -#endif m_canvas->print(x, y, "UP"); x += 7; m_canvas->print(x, y, "DOWN"); x += 7; m_canvas->print(x, y, "PEER"); x += 7; @@ -104,20 +100,15 @@ WindowPeerList::redraw() { x = 0; std::string ip_address = rak::socket_address::cast_from(p->address())->address_str(); -#ifdef RAK_USE_INET6 + if (ip_address.size() >= 24) { ip_address.replace(ip_address.begin() + 21, ip_address.end(), "..."); } -#endif m_canvas->print(x, y, "%c %s", range.first == *m_focus ? '*' : ' ', ip_address.c_str()); -#ifdef RAK_USE_INET6 x += 27; -#else - x += 18; -#endif m_canvas->print(x, y, "%.1f", (double)p->up_rate()->rate() / 1024); x += 7; m_canvas->print(x, y, "%.1f", (double)p->down_rate()->rate() / 1024); x += 7; diff --git a/src/utils/socket_fd.cc b/src/utils/socket_fd.cc index 9cae6779..e30594dc 100644 --- a/src/utils/socket_fd.cc +++ b/src/utils/socket_fd.cc @@ -71,12 +71,10 @@ SocketFd::set_priority(priority_type p) { check_valid(); int opt = p; -#ifdef RAK_USE_INET6 if (m_ipv6_socket) return setsockopt(m_fd, IPPROTO_IPV6, IPV6_TCLASS, &opt, sizeof(opt)) == 0; else -#endif - return setsockopt(m_fd, IPPROTO_IP, IP_TOS, &opt, sizeof(opt)) == 0; + return setsockopt(m_fd, IPPROTO_IP, IP_TOS, &opt, sizeof(opt)) == 0; } bool @@ -135,24 +133,21 @@ SocketFd::get_error() const { bool SocketFd::open_stream() { -#ifdef RAK_USE_INET6 m_fd = socket(rak::socket_address::pf_inet6, SOCK_STREAM, IPPROTO_TCP); + if (m_fd == -1) { m_ipv6_socket = false; return (m_fd = socket(rak::socket_address::pf_inet, SOCK_STREAM, IPPROTO_TCP)) != -1; } + m_ipv6_socket = true; int zero = 0; return setsockopt(m_fd, IPPROTO_IPV6, IPV6_V6ONLY, &zero, sizeof(zero)) != -1; -#else - return (m_fd = socket(rak::socket_address::pf_inet, SOCK_STREAM, IPPROTO_TCP)) != -1; -#endif } bool SocketFd::open_datagram() { -#ifdef RAK_USE_INET6 m_fd = socket(rak::socket_address::pf_inet6, SOCK_DGRAM, 0); if (m_fd == -1) { m_ipv6_socket = false; @@ -162,9 +157,6 @@ SocketFd::open_datagram() { int zero = 0; return setsockopt(m_fd, IPPROTO_IPV6, IPV6_V6ONLY, &zero, sizeof(zero)) != -1; -#else - return (m_fd = socket(rak::socket_address::pf_inet, SOCK_DGRAM, 0)) != -1; -#endif } bool @@ -182,12 +174,11 @@ bool SocketFd::bind(const rak::socket_address& sa) { check_valid(); -#ifdef RAK_USE_INET6 if (m_ipv6_socket && sa.family() == rak::socket_address::pf_inet) { rak::socket_address_inet6 sa_mapped = sa.sa_inet()->to_mapped_address(); return !::bind(m_fd, sa_mapped.c_sockaddr(), sizeof(sa_mapped)); } -#endif + return !::bind(m_fd, sa.c_sockaddr(), sa.length()); } @@ -195,12 +186,11 @@ bool SocketFd::bind(const rak::socket_address& sa, unsigned int length) { check_valid(); -#ifdef RAK_USE_INET6 if (m_ipv6_socket && sa.family() == rak::socket_address::pf_inet) { rak::socket_address_inet6 sa_mapped = sa.sa_inet()->to_mapped_address(); return !::bind(m_fd, sa_mapped.c_sockaddr(), sizeof(sa_mapped)); } -#endif + return !::bind(m_fd, sa.c_sockaddr(), length); } @@ -208,12 +198,11 @@ bool SocketFd::connect(const rak::socket_address& sa) { check_valid(); -#ifdef RAK_USE_INET6 if (m_ipv6_socket && sa.family() == rak::socket_address::pf_inet) { rak::socket_address_inet6 sa_mapped = sa.sa_inet()->to_mapped_address(); return !::connect(m_fd, sa_mapped.c_sockaddr(), sizeof(sa_mapped)) || errno == EINPROGRESS; } -#endif + return !::connect(m_fd, sa.c_sockaddr(), sa.length()) || errno == EINPROGRESS; } @@ -226,11 +215,9 @@ SocketFd::getsockname(rak::socket_address *sa) { return false; } -#ifdef RAK_USE_INET6 if (m_ipv6_socket && sa->family() == rak::socket_address::af_inet6) { *sa = sa->sa_inet6()->normalize_address(); } -#endif return true; } @@ -247,7 +234,6 @@ SocketFd::accept(rak::socket_address* sa) { check_valid(); socklen_t len = sizeof(rak::socket_address); -#ifdef RAK_USE_INET6 if (sa == NULL) { return SocketFd(::accept(m_fd, NULL, &len)); } @@ -256,9 +242,6 @@ SocketFd::accept(rak::socket_address* sa) { *sa = sa->sa_inet6()->normalize_address(); } return SocketFd(fd); -#else - return SocketFd(::accept(m_fd, sa != NULL ? sa->c_sockaddr() : NULL, &len)); -#endif } // unsigned int diff --git a/src/utils/socket_fd.h b/src/utils/socket_fd.h index 21ab19c0..60101820 100644 --- a/src/utils/socket_fd.h +++ b/src/utils/socket_fd.h @@ -92,9 +92,7 @@ private: inline void check_valid() const; int m_fd; -#ifdef RAK_USE_INET6 bool m_ipv6_socket; -#endif }; }