diff options
45 files changed, 18468 insertions, 3 deletions
diff --git a/meta-oe/recipes-connectivity/libtorrent/libtorrent/0001-Fix-compilation-issue-with-gcc-v6.x-and-empty-CXXFLA.patch b/meta-oe/recipes-connectivity/libtorrent/libtorrent/0001-Fix-compilation-issue-with-gcc-v6.x-and-empty-CXXFLA.patch new file mode 100644 index 0000000000..bc4bade513 --- /dev/null +++ b/meta-oe/recipes-connectivity/libtorrent/libtorrent/0001-Fix-compilation-issue-with-gcc-v6.x-and-empty-CXXFLA.patch | |||
| @@ -0,0 +1,44 @@ | |||
| 1 | From c2b119de0e66fb047bb20e445ac8e25824448858 Mon Sep 17 00:00:00 2001 | ||
| 2 | From: chros <chros@chrosGX620> | ||
| 3 | Date: Sun, 30 Jul 2017 20:34:47 +0100 | ||
| 4 | Subject: [PATCH] Fix compilation issue with gcc v6.x and empty CXXFLAGS (See | ||
| 5 | #10) | ||
| 6 | |||
| 7 | --- | ||
| 8 | configure.ac | 1 + | ||
| 9 | scripts/rak_compiler.m4 | 13 +++++++++++++ | ||
| 10 | 2 files changed, 14 insertions(+) | ||
| 11 | |||
| 12 | diff --git a/configure.ac b/configure.ac | ||
| 13 | index 65e34872..2f29e3f9 100644 | ||
| 14 | --- a/configure.ac | ||
| 15 | +++ b/configure.ac | ||
| 16 | @@ -28,6 +28,7 @@ AC_C_BIGENDIAN( | ||
| 17 | AC_MSG_ERROR([Could not determine endianness]) | ||
| 18 | ) | ||
| 19 | |||
| 20 | +RAK_CHECK_CXXFLAGS | ||
| 21 | RAK_ENABLE_DEBUG | ||
| 22 | RAK_ENABLE_EXTRA_DEBUG | ||
| 23 | RAK_ENABLE_WERROR | ||
| 24 | diff --git a/scripts/rak_compiler.m4 b/scripts/rak_compiler.m4 | ||
| 25 | index 39bd19a7..87871abf 100644 | ||
| 26 | --- a/scripts/rak_compiler.m4 | ||
| 27 | +++ b/scripts/rak_compiler.m4 | ||
| 28 | @@ -1,3 +1,16 @@ | ||
| 29 | +AC_DEFUN([RAK_CHECK_CXXFLAGS], [ | ||
| 30 | + | ||
| 31 | + AC_MSG_CHECKING([for user-defined CXXFLAGS]) | ||
| 32 | + | ||
| 33 | + if test -n "$CXXFLAGS"; then | ||
| 34 | + AC_MSG_RESULT([user-defined "$CXXFLAGS"]) | ||
| 35 | + else | ||
| 36 | + CXXFLAGS="-O2" | ||
| 37 | + AC_MSG_RESULT([default "$CXXFLAGS"]) | ||
| 38 | + fi | ||
| 39 | +]) | ||
| 40 | + | ||
| 41 | + | ||
| 42 | AC_DEFUN([RAK_ENABLE_DEBUG], [ | ||
| 43 | AC_ARG_ENABLE(debug, | ||
| 44 | AC_HELP_STRING([--enable-debug], [enable debug information [[default=yes]]]), | ||
diff --git a/meta-oe/recipes-connectivity/libtorrent/libtorrent/0002-Modfiy-gcc-v6.x-fix-for-empty-CXXFLAGS-See-10.patch b/meta-oe/recipes-connectivity/libtorrent/libtorrent/0002-Modfiy-gcc-v6.x-fix-for-empty-CXXFLAGS-See-10.patch new file mode 100644 index 0000000000..532b65a7c9 --- /dev/null +++ b/meta-oe/recipes-connectivity/libtorrent/libtorrent/0002-Modfiy-gcc-v6.x-fix-for-empty-CXXFLAGS-See-10.patch | |||
| @@ -0,0 +1,56 @@ | |||
| 1 | From 8229218dff1105e9fb2bb2c7510910a0db98f3ef Mon Sep 17 00:00:00 2001 | ||
| 2 | From: chros <chros@chrosGX620> | ||
| 3 | Date: Wed, 2 Aug 2017 12:48:27 +0100 | ||
| 4 | Subject: [PATCH] Modfiy gcc v6.x fix for empty CXXFLAGS (See #10) | ||
| 5 | |||
| 6 | --- | ||
| 7 | configure.ac | 1 + | ||
| 8 | scripts/rak_compiler.m4 | 21 +++++++++++++++++---- | ||
| 9 | 2 files changed, 18 insertions(+), 4 deletions(-) | ||
| 10 | |||
| 11 | diff --git a/configure.ac b/configure.ac | ||
| 12 | index 2f29e3f9..a6df6b80 100644 | ||
| 13 | --- a/configure.ac | ||
| 14 | +++ b/configure.ac | ||
| 15 | @@ -28,6 +28,7 @@ AC_C_BIGENDIAN( | ||
| 16 | AC_MSG_ERROR([Could not determine endianness]) | ||
| 17 | ) | ||
| 18 | |||
| 19 | +RAK_CHECK_CFLAGS | ||
| 20 | RAK_CHECK_CXXFLAGS | ||
| 21 | RAK_ENABLE_DEBUG | ||
| 22 | RAK_ENABLE_EXTRA_DEBUG | ||
| 23 | diff --git a/scripts/rak_compiler.m4 b/scripts/rak_compiler.m4 | ||
| 24 | index 87871abf..9a361bed 100644 | ||
| 25 | --- a/scripts/rak_compiler.m4 | ||
| 26 | +++ b/scripts/rak_compiler.m4 | ||
| 27 | @@ -1,12 +1,25 @@ | ||
| 28 | +AC_DEFUN([RAK_CHECK_CFLAGS], [ | ||
| 29 | + | ||
| 30 | + AC_MSG_CHECKING([for user-defined CFLAGS]) | ||
| 31 | + | ||
| 32 | + if test "$CFLAGS" = ""; then | ||
| 33 | + unset CFLAGS | ||
| 34 | + AC_MSG_RESULT([undefined]) | ||
| 35 | + else | ||
| 36 | + AC_MSG_RESULT([user-defined "$CFLAGS"]) | ||
| 37 | + fi | ||
| 38 | +]) | ||
| 39 | + | ||
| 40 | + | ||
| 41 | AC_DEFUN([RAK_CHECK_CXXFLAGS], [ | ||
| 42 | |||
| 43 | AC_MSG_CHECKING([for user-defined CXXFLAGS]) | ||
| 44 | |||
| 45 | - if test -n "$CXXFLAGS"; then | ||
| 46 | - AC_MSG_RESULT([user-defined "$CXXFLAGS"]) | ||
| 47 | + if test "$CXXFLAGS" = ""; then | ||
| 48 | + unset CXXFLAGS | ||
| 49 | + AC_MSG_RESULT([undefined]) | ||
| 50 | else | ||
| 51 | - CXXFLAGS="-O2" | ||
| 52 | - AC_MSG_RESULT([default "$CXXFLAGS"]) | ||
| 53 | + AC_MSG_RESULT([user-defined "$CXXFLAGS"]) | ||
| 54 | fi | ||
| 55 | ]) | ||
| 56 | |||
diff --git a/meta-oe/recipes-connectivity/libtorrent/libtorrent/0003-Add-space-to-fmt-str-in-log_gz_file_write.patch b/meta-oe/recipes-connectivity/libtorrent/libtorrent/0003-Add-space-to-fmt-str-in-log_gz_file_write.patch new file mode 100644 index 0000000000..810b4d4ca8 --- /dev/null +++ b/meta-oe/recipes-connectivity/libtorrent/libtorrent/0003-Add-space-to-fmt-str-in-log_gz_file_write.patch | |||
| @@ -0,0 +1,27 @@ | |||
| 1 | From 48635a0fdb06b8572809dc54c630109db1e6e85c Mon Sep 17 00:00:00 2001 | ||
| 2 | From: Matt Traudt <sirmatt@ksu.edu> | ||
| 3 | Date: Mon, 20 Nov 2017 15:22:51 -0500 | ||
| 4 | Subject: [PATCH] Add space to fmt str in log_gz_file_write | ||
| 5 | |||
| 6 | Without this space, the log level identifier ('D', 'I', etc.) | ||
| 7 | would be right next to actual content. | ||
| 8 | |||
| 9 | Before: <timestamp> Depoll->pcb(17): Open event. | ||
| 10 | After: <timestamp> D epoll->pcb(17): Open event. | ||
| 11 | --- | ||
| 12 | src/torrent/utils/log.cc | 2 +- | ||
| 13 | 1 file changed, 1 insertion(+), 1 deletion(-) | ||
| 14 | |||
| 15 | diff --git a/src/torrent/utils/log.cc b/src/torrent/utils/log.cc | ||
| 16 | index 646d36e3..58b563a6 100644 | ||
| 17 | --- a/src/torrent/utils/log.cc | ||
| 18 | +++ b/src/torrent/utils/log.cc | ||
| 19 | @@ -381,7 +381,7 @@ log_gz_file_write(std::shared_ptr<log_gz_output>& outfile, const char* data, siz | ||
| 20 | |||
| 21 | // Normal groups are nul-terminated strings. | ||
| 22 | if (group >= 0) { | ||
| 23 | - const char* fmt = (group >= LOG_NON_CASCADING) ? ("%" PRIi32 " ") : ("%" PRIi32 " %c"); | ||
| 24 | + const char* fmt = (group >= LOG_NON_CASCADING) ? ("%" PRIi32 " ") : ("%" PRIi32 " %c "); | ||
| 25 | |||
| 26 | int buffer_length = snprintf(buffer, 64, fmt, | ||
| 27 | cachedTime.seconds(), | ||
diff --git a/meta-oe/recipes-connectivity/libtorrent/libtorrent/0004-IPv4-filter-enhancement-11IPv4-filter-enhancement-Cl.patch b/meta-oe/recipes-connectivity/libtorrent/libtorrent/0004-IPv4-filter-enhancement-11IPv4-filter-enhancement-Cl.patch new file mode 100644 index 0000000000..c7a01409da --- /dev/null +++ b/meta-oe/recipes-connectivity/libtorrent/libtorrent/0004-IPv4-filter-enhancement-11IPv4-filter-enhancement-Cl.patch | |||
| @@ -0,0 +1,379 @@ | |||
| 1 | From facd1b78071e315a2e5ee4992d3545dae4290e07 Mon Sep 17 00:00:00 2001 | ||
| 2 | From: chros <chros@chrosGX620> | ||
| 3 | Date: Sun, 10 Dec 2017 18:51:32 +0000 | ||
| 4 | Subject: [PATCH] IPv4 filter enhancement #11IPv4 filter enhancement (Closes | ||
| 5 | #11) | ||
| 6 | |||
| 7 | --- | ||
| 8 | src/torrent/peer/peer_list.cc | 23 ++- | ||
| 9 | src/torrent/peer/peer_list.h | 2 +- | ||
| 10 | src/torrent/utils/extents.h | 267 ++++++++++++++-------------------- | ||
| 11 | 3 files changed, 134 insertions(+), 158 deletions(-) | ||
| 12 | |||
| 13 | diff --git a/src/torrent/peer/peer_list.cc b/src/torrent/peer/peer_list.cc | ||
| 14 | index 23ca651a..aa60939a 100644 | ||
| 15 | --- a/src/torrent/peer/peer_list.cc | ||
| 16 | +++ b/src/torrent/peer/peer_list.cc | ||
| 17 | @@ -146,7 +146,11 @@ PeerList::insert_address(const sockaddr* sa, int flags) { | ||
| 18 | |||
| 19 | PeerInfo* peerInfo = new PeerInfo(sa); | ||
| 20 | peerInfo->set_listen_port(address->port()); | ||
| 21 | - peerInfo->set_flags(m_ipv4_table.at(address->sa_inet()->address_h()) & PeerInfo::mask_ip_table); | ||
| 22 | + uint32_t host_byte_order_ipv4_addr = address->sa_inet()->address_h(); | ||
| 23 | + | ||
| 24 | + // IPv4 addresses stored in host byte order in ipv4_table so they are comparable. ntohl has been called | ||
| 25 | + if(m_ipv4_table.defined(host_byte_order_ipv4_addr)) | ||
| 26 | + peerInfo->set_flags(m_ipv4_table.at(host_byte_order_ipv4_addr) & PeerInfo::mask_ip_table); | ||
| 27 | |||
| 28 | manager->client_list()->retrieve_unknown(&peerInfo->mutable_client_info()); | ||
| 29 | |||
| 30 | @@ -264,12 +268,25 @@ PeerList::connected(const sockaddr* sa, int flags) { | ||
| 31 | !socket_address_key::is_comparable_sockaddr(sa)) | ||
| 32 | return NULL; | ||
| 33 | |||
| 34 | - int filter_value = m_ipv4_table.at(address->sa_inet()->address_h()); | ||
| 35 | + uint32_t host_byte_order_ipv4_addr = address->sa_inet()->address_h(); | ||
| 36 | + int filter_value = 0; | ||
| 37 | + | ||
| 38 | + // IPv4 addresses stored in host byte order in ipv4_table so they are comparable. ntohl has been called | ||
| 39 | + if(m_ipv4_table.defined(host_byte_order_ipv4_addr)) | ||
| 40 | + filter_value = m_ipv4_table.at(host_byte_order_ipv4_addr); | ||
| 41 | |||
| 42 | // We should also remove any PeerInfo objects already for this | ||
| 43 | // address. | ||
| 44 | - if ((filter_value & PeerInfo::flag_unwanted)) | ||
| 45 | + if ((filter_value & PeerInfo::flag_unwanted)) { | ||
| 46 | + char ipv4_str[INET_ADDRSTRLEN]; | ||
| 47 | + uint32_t net_order_addr = htonl(host_byte_order_ipv4_addr); | ||
| 48 | + | ||
| 49 | + inet_ntop(AF_INET, &net_order_addr, ipv4_str, INET_ADDRSTRLEN); | ||
| 50 | + | ||
| 51 | + lt_log_print(LOG_PEER_INFO, "Peer %s is unwanted: preventing connection", ipv4_str); | ||
| 52 | + | ||
| 53 | return NULL; | ||
| 54 | + } | ||
| 55 | |||
| 56 | PeerInfo* peerInfo; | ||
| 57 | range_type range = base_type::equal_range(sock_key); | ||
| 58 | diff --git a/src/torrent/peer/peer_list.h b/src/torrent/peer/peer_list.h | ||
| 59 | index a3b409cb..4c2f707d 100644 | ||
| 60 | --- a/src/torrent/peer/peer_list.h | ||
| 61 | +++ b/src/torrent/peer/peer_list.h | ||
| 62 | @@ -46,7 +46,7 @@ namespace torrent { | ||
| 63 | |||
| 64 | class DownloadInfo; | ||
| 65 | |||
| 66 | -typedef extents<uint32_t, int, 32, 256, 8> ipv4_table; | ||
| 67 | +typedef extents<uint32_t, int> ipv4_table; | ||
| 68 | |||
| 69 | class LIBTORRENT_EXPORT PeerList : private std::multimap<socket_address_key, PeerInfo*> { | ||
| 70 | public: | ||
| 71 | diff --git a/src/torrent/utils/extents.h b/src/torrent/utils/extents.h | ||
| 72 | index 8ec1e600..c2b887b1 100644 | ||
| 73 | --- a/src/torrent/utils/extents.h | ||
| 74 | +++ b/src/torrent/utils/extents.h | ||
| 75 | @@ -37,191 +37,150 @@ | ||
| 76 | #ifndef LIBTORRENT_UTILS_EXTENTS_H | ||
| 77 | #define LIBTORRENT_UTILS_EXTENTS_H | ||
| 78 | |||
| 79 | -#include lt_tr1_array | ||
| 80 | |||
| 81 | -#include <algorithm> | ||
| 82 | +#include <map> | ||
| 83 | +#include <stdexcept> | ||
| 84 | |||
| 85 | namespace torrent { | ||
| 86 | |||
| 87 | -template <typename Key, typename Tp, unsigned int TableSize, unsigned int TableBits> | ||
| 88 | -struct extents_base { | ||
| 89 | - typedef Key key_type; | ||
| 90 | - typedef std::pair<Key, Key> range_type; | ||
| 91 | - typedef std::pair<extents_base*, Tp> mapped_type; | ||
| 92 | - typedef Tp mapped_value_type; | ||
| 93 | - | ||
| 94 | - typedef std::array<mapped_type, TableSize> table_type; | ||
| 95 | - | ||
| 96 | - extents_base(key_type pos, unsigned int mb, mapped_value_type val); | ||
| 97 | - extents_base(extents_base* parent, typename table_type::const_iterator itr); | ||
| 98 | - ~extents_base(); | ||
| 99 | - | ||
| 100 | - bool is_divisible(key_type key) const { return key % mask_bits == 0; } | ||
| 101 | - bool is_leaf_branch() const { return mask_bits == 0; } | ||
| 102 | - bool is_equal_range(key_type first, key_type last, const mapped_value_type& val) const; | ||
| 103 | - | ||
| 104 | - unsigned int sizeof_data() const; | ||
| 105 | - | ||
| 106 | - typename table_type::iterator partition_at(key_type key) { return table.begin() + ((key >> mask_bits) & (TableSize - 1)); } | ||
| 107 | - typename table_type::const_iterator partition_at(key_type key) const { return table.begin() + ((key >> mask_bits) & (TableSize - 1)); } | ||
| 108 | - | ||
| 109 | - unsigned int mask_distance(unsigned int mb) { return (~(~key_type() << mb) >> mask_bits); } | ||
| 110 | - | ||
| 111 | - key_type partition_pos(typename table_type::const_iterator part) const { return position + (std::distance(table.begin(), part) << mask_bits); } | ||
| 112 | - | ||
| 113 | - void insert(key_type pos, unsigned int mb, const mapped_value_type& val); | ||
| 114 | - | ||
| 115 | - const mapped_value_type& at(key_type key) const; | ||
| 116 | - | ||
| 117 | - unsigned int mask_bits; | ||
| 118 | - key_type position; | ||
| 119 | - table_type table; | ||
| 120 | -}; | ||
| 121 | - | ||
| 122 | -template <typename Key, typename Tp, unsigned int MaskBits, unsigned int TableSize, unsigned int TableBits> | ||
| 123 | -class extents : private extents_base<Key, Tp, TableSize, TableBits> { | ||
| 124 | +template <class Address, class Value, class Compare=std::less<Address> > | ||
| 125 | +class extents { | ||
| 126 | public: | ||
| 127 | - typedef extents_base<Key, Tp, TableSize, TableBits> base_type; | ||
| 128 | - | ||
| 129 | - typedef typename base_type::key_type key_type; | ||
| 130 | - typedef base_type value_type; | ||
| 131 | - typedef typename base_type::range_type range_type; | ||
| 132 | - typedef typename base_type::mapped_type mapped_type; | ||
| 133 | - typedef typename base_type::mapped_value_type mapped_value_type; | ||
| 134 | - typedef typename base_type::table_type table_type; | ||
| 135 | - | ||
| 136 | - static const key_type mask_bits = MaskBits; | ||
| 137 | - static const key_type table_bits = TableBits; | ||
| 138 | - static const key_type table_size = TableSize; | ||
| 139 | - | ||
| 140 | - using base_type::at; | ||
| 141 | - using base_type::sizeof_data; | ||
| 142 | + typedef Address key_type; // start address | ||
| 143 | + typedef Value mapped_value_type; // The value mapped to the ip range | ||
| 144 | + typedef std::pair<Address, Value> mapped_type; // End address, value mapped to ip range | ||
| 145 | + typedef std::map<key_type, mapped_type, Compare> range_map_type; // The map itself | ||
| 146 | |||
| 147 | extents(); | ||
| 148 | + ~extents(); | ||
| 149 | |||
| 150 | - bool is_equal_range(key_type first, key_type last, const mapped_value_type& val) const; | ||
| 151 | - | ||
| 152 | - void insert(key_type pos, unsigned int mb, const mapped_value_type& val); | ||
| 153 | + void insert(key_type address_start, key_type address_end, mapped_value_type value); | ||
| 154 | + bool defined(key_type address_start, key_type address_end); | ||
| 155 | + bool defined(key_type address); | ||
| 156 | + key_type get_matching_key(key_type address_start, key_type address_end); // throws error on not defined. test with defined() | ||
| 157 | + mapped_value_type at(key_type address_start, key_type address_end); // throws error on not defined. test with defined() | ||
| 158 | + mapped_value_type at(key_type address); // throws error on not defined. test with defined() | ||
| 159 | + unsigned int sizeof_data() const; | ||
| 160 | |||
| 161 | - base_type* data() { return this; } | ||
| 162 | + range_map_type range_map; | ||
| 163 | }; | ||
| 164 | |||
| 165 | -template <typename Key, typename Tp, unsigned int TableSize, unsigned int TableBits> | ||
| 166 | -extents_base<Key, Tp, TableSize, TableBits>::extents_base(key_type pos, unsigned int mb, mapped_value_type val) : | ||
| 167 | - mask_bits(mb), position(pos) { | ||
| 168 | - std::fill(table.begin(), table.end(), mapped_type(NULL, mapped_value_type())); | ||
| 169 | +/////////////////////////////////////// | ||
| 170 | +// CONSTRUCTOR [PLACEHOLDER] | ||
| 171 | +/////////////////////////////////////// | ||
| 172 | +template <class Address, class Value, class Compare > | ||
| 173 | +extents<Address, Value, Compare>::extents() { | ||
| 174 | + //nothing to do | ||
| 175 | + return; | ||
| 176 | } | ||
| 177 | |||
| 178 | -template <typename Key, typename Tp, unsigned int TableSize, unsigned int TableBits> | ||
| 179 | -extents_base<Key, Tp, TableSize, TableBits>::extents_base(extents_base* parent, typename table_type::const_iterator itr) : | ||
| 180 | - mask_bits(parent->mask_bits - TableBits), position(parent->partition_pos(itr)) { | ||
| 181 | - std::fill(table.begin(), table.end(), mapped_type(NULL, itr->second)); | ||
| 182 | +/////////////////////////////////////// | ||
| 183 | +// DESTRUCTOR [PLACEHOLDER] | ||
| 184 | +/////////////////////////////////////// | ||
| 185 | +template <class Address, class Value, class Compare > | ||
| 186 | +extents<Address, Value, Compare>::~extents() { | ||
| 187 | + //nothing to do. map destructor can handle cleanup. | ||
| 188 | + return; | ||
| 189 | } | ||
| 190 | |||
| 191 | -template <typename Key, typename Tp, unsigned int MaskBits, unsigned int TableSize, unsigned int TableBits> | ||
| 192 | -extents<Key, Tp, MaskBits, TableSize, TableBits>::extents() : | ||
| 193 | - base_type(key_type(), mask_bits - table_bits, mapped_value_type()) | ||
| 194 | -{ | ||
| 195 | -} | ||
| 196 | +////////////////////////////////////////////////////////////////////////////////// | ||
| 197 | +// INSERT O(log N) assuming no overlapping ranges | ||
| 198 | +///////////////////////////////////////////////////////////////////////////////// | ||
| 199 | +template <class Address, class Value, class Compare > | ||
| 200 | +void extents<Address, Value, Compare>::insert(key_type address_start, key_type address_end, mapped_value_type value) { | ||
| 201 | + //we allow overlap ranges though not 100% overlap but only if mapped values are the same. first remove any overlap range that has a different value. | ||
| 202 | + typename range_map_type::iterator iter = range_map.upper_bound(address_start); | ||
| 203 | + if( iter != range_map.begin() ) { iter--; } | ||
| 204 | + bool ignore_due_to_total_overlap = false; | ||
| 205 | + while( iter->first <= address_end && iter != range_map.end() ) { | ||
| 206 | + key_type delete_key = iter->first; | ||
| 207 | + bool do_delete_due_to_overlap = iter->first <= address_end && (iter->second).first >= address_start && (iter->second).second != value; | ||
| 208 | + bool do_delete_due_to_total_overlap = address_start <= iter->first && address_end >= (iter->second).first; | ||
| 209 | + iter++; | ||
| 210 | + if(do_delete_due_to_overlap || do_delete_due_to_total_overlap) { | ||
| 211 | + range_map.erase (delete_key); | ||
| 212 | + } | ||
| 213 | + else { | ||
| 214 | + ignore_due_to_total_overlap = ignore_due_to_total_overlap || ( iter->first <= address_start && (iter->second).first >= address_end ); | ||
| 215 | + } | ||
| 216 | + } | ||
| 217 | |||
| 218 | -template <typename Key, typename Tp, unsigned int TableSize, unsigned int TableBits> | ||
| 219 | -extents_base<Key, Tp, TableSize, TableBits>::~extents_base() { | ||
| 220 | - for (typename table_type::const_iterator itr = table.begin(), last = table.end(); itr != last; itr++) | ||
| 221 | - delete itr->first; | ||
| 222 | + if(!ignore_due_to_total_overlap) { | ||
| 223 | + mapped_type entry; | ||
| 224 | + entry.first = address_end; | ||
| 225 | + entry.second = value; | ||
| 226 | + range_map.insert( std::pair<key_type,mapped_type>(address_start, entry) ); | ||
| 227 | + } | ||
| 228 | } | ||
| 229 | |||
| 230 | -template <typename Key, typename Tp, unsigned int TableSize, unsigned int TableBits> | ||
| 231 | -unsigned int | ||
| 232 | -extents_base<Key, Tp, TableSize, TableBits>::sizeof_data() const { | ||
| 233 | - unsigned int sum = sizeof(*this); | ||
| 234 | - | ||
| 235 | - for (typename table_type::const_iterator itr = table.begin(), last = table.end(); itr != last; itr++) | ||
| 236 | - if (itr->first != NULL) | ||
| 237 | - sum += itr->first->sizeof_data(); | ||
| 238 | - | ||
| 239 | - return sum; | ||
| 240 | +////////////////////////////////////////////////////////////////////// | ||
| 241 | +// DEFINED O(log N) assuming no overlapping ranges | ||
| 242 | +////////////////////////////////////////////////////////////////////// | ||
| 243 | +template <class Address, class Value, class Compare > | ||
| 244 | +bool extents<Address, Value, Compare>::defined(key_type address_start, key_type address_end) { | ||
| 245 | + bool defined = false; | ||
| 246 | + typename range_map_type::iterator iter = range_map.upper_bound(address_start); | ||
| 247 | + if( iter != range_map.begin() ) { iter--; } | ||
| 248 | + while( iter->first <= address_end && !defined && iter != range_map.end() ) { | ||
| 249 | + defined = iter->first <= address_end && (iter->second).first >= address_start; | ||
| 250 | + iter++; | ||
| 251 | + } | ||
| 252 | + return defined; | ||
| 253 | } | ||
| 254 | - | ||
| 255 | -template <typename Key, typename Tp, unsigned int MaskBits, unsigned int TableSize, unsigned int TableBits> | ||
| 256 | -void | ||
| 257 | -extents<Key, Tp, MaskBits, TableSize, TableBits>::insert(key_type pos, unsigned int mb, const mapped_value_type& val) { | ||
| 258 | - key_type mask = ~key_type() << mb; | ||
| 259 | - | ||
| 260 | - base_type::insert(pos & mask, mb, val); | ||
| 261 | +template <class Address, class Value, class Compare > | ||
| 262 | +bool extents<Address, Value, Compare>::defined(key_type address) { | ||
| 263 | + return defined(address, address); | ||
| 264 | } | ||
| 265 | |||
| 266 | -template <typename Key, typename Tp, unsigned int TableSize, unsigned int TableBits> | ||
| 267 | -void | ||
| 268 | -extents_base<Key, Tp, TableSize, TableBits>::insert(key_type pos, unsigned int mb, const mapped_value_type& val) { | ||
| 269 | - // RESTRICTED | ||
| 270 | - typename table_type::iterator first = partition_at(pos); | ||
| 271 | - typename table_type::iterator last = partition_at(pos) + mask_distance(mb) + 1; | ||
| 272 | - | ||
| 273 | - if (mb < mask_bits) { | ||
| 274 | - if (first->first == NULL) | ||
| 275 | - first->first = new extents_base(this, first); | ||
| 276 | +////////////////////////////////////////////////////////////////////// | ||
| 277 | +// GET_MATCHING_KEY O(log N) assuming no overlapping ranges | ||
| 278 | +////////////////////////////////////////////////////////////////////// | ||
| 279 | +template <class Address, class Value, class Compare > | ||
| 280 | +typename extents<Address, Value, Compare>::key_type extents<Address, Value, Compare>::get_matching_key(key_type address_start, key_type address_end) { | ||
| 281 | + key_type key; | ||
| 282 | + bool defined = false; | ||
| 283 | + typename range_map_type::iterator iter = range_map.upper_bound(address_start); | ||
| 284 | + if( iter != range_map.begin() ) { iter--; } | ||
| 285 | + while( iter->first <= address_end && !defined && iter != range_map.end() ) { | ||
| 286 | + defined = iter->first <= address_end && (iter->second).first >= address_start; | ||
| 287 | + if(defined) | ||
| 288 | + key = iter->first; | ||
| 289 | |||
| 290 | - first->first->insert(pos, mb, val); | ||
| 291 | - return; | ||
| 292 | + iter++; | ||
| 293 | } | ||
| 294 | - | ||
| 295 | - while (first != last) { | ||
| 296 | - if (first->first != NULL) { | ||
| 297 | - delete first->first; | ||
| 298 | - first->first = NULL; | ||
| 299 | - } | ||
| 300 | - | ||
| 301 | - (first++)->second = val; | ||
| 302 | + // this will cause exception to be thrown | ||
| 303 | + if(!defined) { | ||
| 304 | + std::out_of_range e("nothing defined for specified key"); | ||
| 305 | + throw e; | ||
| 306 | } | ||
| 307 | + return key; | ||
| 308 | } | ||
| 309 | |||
| 310 | -template <typename Key, typename Tp, unsigned int MaskBits, unsigned int TableSize, unsigned int TableBits> | ||
| 311 | -bool | ||
| 312 | -extents<Key, Tp, MaskBits, TableSize, TableBits>::is_equal_range(key_type first, key_type last, const mapped_value_type& val) const { | ||
| 313 | - // RESTRICTED | ||
| 314 | - first = std::max(first, key_type()); | ||
| 315 | - last = std::min(last, key_type() + (~key_type() >> (sizeof(key_type) * 8 - MaskBits))); | ||
| 316 | - | ||
| 317 | - if (first <= last) | ||
| 318 | - return base_type::is_equal_range(first, last, val); | ||
| 319 | - else | ||
| 320 | - return true; | ||
| 321 | +////////////////////////////////////////////////////////////////////// | ||
| 322 | +// AT O(log N) assuming no overlapping ranges | ||
| 323 | +////////////////////////////////////////////////////////////////////// | ||
| 324 | +template <class Address, class Value, class Compare > | ||
| 325 | +typename extents<Address, Value, Compare>::mapped_value_type extents<Address, Value, Compare>::at(key_type address_start, key_type address_end) { | ||
| 326 | + key_type key = get_matching_key(address_start, address_end); | ||
| 327 | + mapped_type entry = range_map.at(key); | ||
| 328 | + return entry.second; | ||
| 329 | } | ||
| 330 | - | ||
| 331 | -template <typename Key, typename Tp, unsigned int TableSize, unsigned int TableBits> | ||
| 332 | -bool | ||
| 333 | -extents_base<Key, Tp, TableSize, TableBits>::is_equal_range(key_type key_first, key_type key_last, const mapped_value_type& val) const { | ||
| 334 | - // RESTRICTED | ||
| 335 | - typename table_type::const_iterator first = partition_at(key_first); | ||
| 336 | - typename table_type::const_iterator last = partition_at(key_last) + 1; | ||
| 337 | - | ||
| 338 | - do { | ||
| 339 | - // std::cout << "shift_amount " << key_first << ' ' << key_last << std::endl; | ||
| 340 | - | ||
| 341 | - if (first->first == NULL && val != first->second) | ||
| 342 | - return false; | ||
| 343 | - | ||
| 344 | - if (first->first != NULL && !first->first->is_equal_range(std::max(key_first, partition_pos(first)), | ||
| 345 | - std::min(key_last, partition_pos(first + 1) - 1), val)) | ||
| 346 | - return false; | ||
| 347 | - | ||
| 348 | - } while (++first != last); | ||
| 349 | - | ||
| 350 | - return true; | ||
| 351 | +template <class Address, class Value, class Compare > | ||
| 352 | +typename extents<Address, Value, Compare>::mapped_value_type extents<Address, Value, Compare>::at(key_type address) { | ||
| 353 | + return at(address, address); | ||
| 354 | } | ||
| 355 | |||
| 356 | -// Assumes 'key' is within the range of the range. | ||
| 357 | -template <typename Key, typename Tp, unsigned int TableSize, unsigned int TableBits> | ||
| 358 | -const typename extents_base<Key, Tp, TableSize, TableBits>::mapped_value_type& | ||
| 359 | -extents_base<Key, Tp, TableSize, TableBits>::at(key_type key) const { | ||
| 360 | - typename table_type::const_iterator itr = partition_at(key); | ||
| 361 | - | ||
| 362 | - while (itr->first != NULL) | ||
| 363 | - itr = itr->first->partition_at(key); | ||
| 364 | - | ||
| 365 | - return itr->second; | ||
| 366 | +////////////////////////////////////////////////////////////////////// | ||
| 367 | +// SIZEOF_DATA O(1) | ||
| 368 | +////////////////////////////////////////////////////////////////////// | ||
| 369 | +template <class Address, class Value, class Compare > | ||
| 370 | +unsigned int extents<Address, Value, Compare>::sizeof_data() const { | ||
| 371 | + // we don't know overhead on map, so this won't be accurate. just estimate. | ||
| 372 | + unsigned int entry_size = sizeof(key_type) + sizeof(mapped_type); | ||
| 373 | + return entry_size * range_map.size(); | ||
| 374 | } | ||
| 375 | |||
| 376 | + | ||
| 377 | } | ||
| 378 | |||
| 379 | #endif | ||
diff --git a/meta-oe/recipes-connectivity/libtorrent/libtorrent/0005-Disable-extents-test-to-pass-TravisCI-See-11.patch b/meta-oe/recipes-connectivity/libtorrent/libtorrent/0005-Disable-extents-test-to-pass-TravisCI-See-11.patch new file mode 100644 index 0000000000..45f92524fc --- /dev/null +++ b/meta-oe/recipes-connectivity/libtorrent/libtorrent/0005-Disable-extents-test-to-pass-TravisCI-See-11.patch | |||
| @@ -0,0 +1,47 @@ | |||
| 1 | From 4a5ed3897e772c75929b376b08985d844898b619 Mon Sep 17 00:00:00 2001 | ||
| 2 | From: chros <chros@chrosGX620> | ||
| 3 | Date: Tue, 12 Dec 2017 15:19:51 +0000 | ||
| 4 | Subject: [PATCH] Disable extents test to pass TravisCI (See #11) | ||
| 5 | |||
| 6 | --- | ||
| 7 | test/torrent/utils/test_extents.cc | 10 ++++++---- | ||
| 8 | 1 file changed, 6 insertions(+), 4 deletions(-) | ||
| 9 | |||
| 10 | diff --git a/test/torrent/utils/test_extents.cc b/test/torrent/utils/test_extents.cc | ||
| 11 | index 6ac5a57d..d6b8d11d 100644 | ||
| 12 | --- a/test/torrent/utils/test_extents.cc | ||
| 13 | +++ b/test/torrent/utils/test_extents.cc | ||
| 14 | @@ -16,10 +16,11 @@ void | ||
| 15 | ExtentsTest::tearDown() { | ||
| 16 | } | ||
| 17 | |||
| 18 | -typedef torrent::extents<uint32_t, int, 8, 16, 4> extent_type_1; | ||
| 19 | +//typedef torrent::extents<uint32_t, int, 8, 16, 4> extent_type_1; | ||
| 20 | +typedef torrent::extents<uint32_t, int> extent_type_1; | ||
| 21 | |||
| 22 | // typedef torrent::extents<uint32_t, int, 0, 256, 16> extent_type_3; | ||
| 23 | - | ||
| 24 | +/* | ||
| 25 | template <typename Extent> | ||
| 26 | bool | ||
| 27 | verify_extent_data(Extent& extent, const uint32_t* idx, const int* val) { | ||
| 28 | @@ -46,11 +47,11 @@ static const int val_basic_1[] = {1, 0, 1}; | ||
| 29 | |||
| 30 | // static const uint32_t idx_basic_2[] = {0, 1, 16, 255, 256, 256}; | ||
| 31 | // static const int val_basic_2[] = {1, 0, 2, 1}; | ||
| 32 | - | ||
| 33 | +*/ | ||
| 34 | void | ||
| 35 | ExtentsTest::test_basic() { | ||
| 36 | extent_type_1 extent_1; | ||
| 37 | - | ||
| 38 | +/* | ||
| 39 | // Test empty. | ||
| 40 | CPPUNIT_ASSERT(verify_extent_data(extent_1, idx_empty, val_empty)); | ||
| 41 | |||
| 42 | @@ -68,4 +69,5 @@ ExtentsTest::test_basic() { | ||
| 43 | // extent_1.insert(38, 3, 2); | ||
| 44 | |||
| 45 | // CPPUNIT_ASSERT(verify_extent_data(extent_1, idx_basic_2, val_basic_2)); | ||
| 46 | +*/ | ||
| 47 | } | ||
diff --git a/meta-oe/recipes-connectivity/libtorrent/libtorrent/0006-Bumped-version-to-0.13.7.patch b/meta-oe/recipes-connectivity/libtorrent/libtorrent/0006-Bumped-version-to-0.13.7.patch new file mode 100644 index 0000000000..645cf0f990 --- /dev/null +++ b/meta-oe/recipes-connectivity/libtorrent/libtorrent/0006-Bumped-version-to-0.13.7.patch | |||
| @@ -0,0 +1,30 @@ | |||
| 1 | From da7db7db29a8488e29d3b0f02906c5db379d4b6d Mon Sep 17 00:00:00 2001 | ||
| 2 | From: rakshasa <sundell.software@gmail.com> | ||
| 3 | Date: Thu, 7 Jun 2018 13:18:03 +0900 | ||
| 4 | Subject: [PATCH] Bumped version to 0.13.7. | ||
| 5 | |||
| 6 | --- | ||
| 7 | configure.ac | 8 ++++---- | ||
| 8 | 1 file changed, 4 insertions(+), 4 deletions(-) | ||
| 9 | |||
| 10 | diff --git a/configure.ac b/configure.ac | ||
| 11 | index a6df6b80..5b1ea237 100644 | ||
| 12 | --- a/configure.ac | ||
| 13 | +++ b/configure.ac | ||
| 14 | @@ -1,12 +1,12 @@ | ||
| 15 | -AC_INIT(libtorrent, 0.13.6, sundell.software@gmail.com) | ||
| 16 | +AC_INIT(libtorrent, 0.13.7, sundell.software@gmail.com) | ||
| 17 | |||
| 18 | LT_INIT([disable-static]) | ||
| 19 | |||
| 20 | dnl Find a better way to do this | ||
| 21 | -AC_DEFINE(PEER_NAME, "-lt0D60-", Identifier that is part of the default peer id) | ||
| 22 | -AC_DEFINE(PEER_VERSION, "lt\x0D\x60", 4 byte client and version identifier for DHT) | ||
| 23 | +AC_DEFINE(PEER_NAME, "-lt0D70-", Identifier that is part of the default peer id) | ||
| 24 | +AC_DEFINE(PEER_VERSION, "lt\x0D\x70", 4 byte client and version identifier for DHT) | ||
| 25 | |||
| 26 | -LIBTORRENT_CURRENT=19 | ||
| 27 | +LIBTORRENT_CURRENT=20 | ||
| 28 | LIBTORRENT_REVISION=0 | ||
| 29 | LIBTORRENT_AGE=0 | ||
| 30 | |||
diff --git a/meta-oe/recipes-connectivity/libtorrent/libtorrent/0007-Added-support-for-openssl-1.1.patch b/meta-oe/recipes-connectivity/libtorrent/libtorrent/0007-Added-support-for-openssl-1.1.patch new file mode 100644 index 0000000000..eaec545bbb --- /dev/null +++ b/meta-oe/recipes-connectivity/libtorrent/libtorrent/0007-Added-support-for-openssl-1.1.patch | |||
| @@ -0,0 +1,105 @@ | |||
| 1 | From dbf6abfd6f905b9218465d15eebec7eedaaed6b0 Mon Sep 17 00:00:00 2001 | ||
| 2 | From: rakshasa <sundell.software@gmail.com> | ||
| 3 | Date: Tue, 20 Dec 2016 19:51:02 +0900 | ||
| 4 | Subject: [PATCH] Added support for openssl 1.1. | ||
| 5 | |||
| 6 | --- | ||
| 7 | configure.ac | 4 ++++ | ||
| 8 | src/utils/diffie_hellman.cc | 36 ++++++++++++++++++++++++++++++++++-- | ||
| 9 | 2 files changed, 38 insertions(+), 2 deletions(-) | ||
| 10 | |||
| 11 | diff --git a/configure.ac b/configure.ac | ||
| 12 | index 5b1ea237..b885714d 100644 | ||
| 13 | --- a/configure.ac | ||
| 14 | +++ b/configure.ac | ||
| 15 | @@ -71,12 +71,15 @@ AC_ARG_ENABLE(openssl, | ||
| 16 | [ --disable-openssl Don't use OpenSSL's SHA1 implementation.], | ||
| 17 | [ | ||
| 18 | if test "$enableval" = "yes"; then | ||
| 19 | +dnl move to scripts. | ||
| 20 | PKG_CHECK_MODULES(OPENSSL, libcrypto, | ||
| 21 | CXXFLAGS="$CXXFLAGS $OPENSSL_CFLAGS"; | ||
| 22 | LIBS="$LIBS $OPENSSL_LIBS") | ||
| 23 | |||
| 24 | AC_DEFINE(USE_OPENSSL, 1, Using OpenSSL.) | ||
| 25 | AC_DEFINE(USE_OPENSSL_SHA, 1, Using OpenSSL's SHA1 implementation.) | ||
| 26 | + AC_CHECK_LIB([crypto], [DH_set0_pqg], [AC_DEFINE(USE_OPENSSL_1_1, 1, Using OpenSSL 1.1.)]) | ||
| 27 | + | ||
| 28 | else | ||
| 29 | AC_DEFINE(USE_NSS_SHA, 1, Using Mozilla's SHA1 implementation.) | ||
| 30 | fi | ||
| 31 | @@ -87,6 +90,7 @@ AC_ARG_ENABLE(openssl, | ||
| 32 | |||
| 33 | AC_DEFINE(USE_OPENSSL, 1, Using OpenSSL.) | ||
| 34 | AC_DEFINE(USE_OPENSSL_SHA, 1, Using OpenSSL's SHA1 implementation.) | ||
| 35 | + AC_CHECK_LIB([crypto], [DH_set0_pqg], [AC_DEFINE(USE_OPENSSL_1_1, 1, Using OpenSSL 1.1.)]) | ||
| 36 | ] | ||
| 37 | ) | ||
| 38 | |||
| 39 | diff --git a/src/utils/diffie_hellman.cc b/src/utils/diffie_hellman.cc | ||
| 40 | index aa653d45..7ec13165 100644 | ||
| 41 | --- a/src/utils/diffie_hellman.cc | ||
| 42 | +++ b/src/utils/diffie_hellman.cc | ||
| 43 | @@ -54,11 +54,23 @@ DiffieHellman::DiffieHellman(const unsigned char *prime, int primeLength, | ||
| 44 | m_secret(NULL), m_size(0) { | ||
| 45 | |||
| 46 | #ifdef USE_OPENSSL | ||
| 47 | + | ||
| 48 | m_dh = DH_new(); | ||
| 49 | + | ||
| 50 | +#ifdef USE_OPENSSL_1_1 | ||
| 51 | + BIGNUM * const dh_p = BN_bin2bn(prime, primeLength, NULL); | ||
| 52 | + BIGNUM * const dh_g = BN_bin2bn(generator, generatorLength, NULL); | ||
| 53 | + | ||
| 54 | + if (dh_p == NULL || dh_g == NULL || | ||
| 55 | + !DH_set0_pqg(m_dh, dh_p, NULL, dh_g)) | ||
| 56 | + throw internal_error("Could not generate Diffie-Hellman parameters"); | ||
| 57 | +#else | ||
| 58 | m_dh->p = BN_bin2bn(prime, primeLength, NULL); | ||
| 59 | m_dh->g = BN_bin2bn(generator, generatorLength, NULL); | ||
| 60 | +#endif | ||
| 61 | |||
| 62 | DH_generate_key(m_dh); | ||
| 63 | + | ||
| 64 | #else | ||
| 65 | throw internal_error("Compiled without encryption support."); | ||
| 66 | #endif | ||
| 67 | @@ -74,7 +86,19 @@ DiffieHellman::~DiffieHellman() { | ||
| 68 | bool | ||
| 69 | DiffieHellman::is_valid() const { | ||
| 70 | #ifdef USE_OPENSSL | ||
| 71 | + if (m_dh == NULL) | ||
| 72 | + return false; | ||
| 73 | + | ||
| 74 | +#ifdef USE_OPENSSL_1_1 | ||
| 75 | + const BIGNUM *pub_key; | ||
| 76 | + | ||
| 77 | + DH_get0_key(m_dh, &pub_key, NULL); | ||
| 78 | + | ||
| 79 | + return pub_key != NULL; | ||
| 80 | +#else | ||
| 81 | return m_dh != NULL && m_dh->pub_key != NULL; | ||
| 82 | +#endif | ||
| 83 | + | ||
| 84 | #else | ||
| 85 | return false; | ||
| 86 | #endif | ||
| 87 | @@ -103,8 +127,16 @@ DiffieHellman::store_pub_key(unsigned char* dest, unsigned int length) { | ||
| 88 | #ifdef USE_OPENSSL | ||
| 89 | std::memset(dest, 0, length); | ||
| 90 | |||
| 91 | - if ((int)length >= BN_num_bytes(m_dh->pub_key)) | ||
| 92 | - BN_bn2bin(m_dh->pub_key, dest + length - BN_num_bytes(m_dh->pub_key)); | ||
| 93 | + const BIGNUM *pub_key; | ||
| 94 | + | ||
| 95 | +#ifdef USE_OPENSSL_1_1 | ||
| 96 | + DH_get0_key(m_dh, &pub_key, NULL); | ||
| 97 | +#else | ||
| 98 | + pub_key = m_dh->pub_key; | ||
| 99 | +#endif | ||
| 100 | + | ||
| 101 | + if ((int)length >= BN_num_bytes(pub_key)) | ||
| 102 | + BN_bn2bin(pub_key, dest + length - BN_num_bytes(pub_key)); | ||
| 103 | #endif | ||
| 104 | } | ||
| 105 | |||
diff --git a/meta-oe/recipes-connectivity/libtorrent/libtorrent/0008-Use-AC_COMPILE-instead-of-AC_RUN-to-check-for-execin.patch b/meta-oe/recipes-connectivity/libtorrent/libtorrent/0008-Use-AC_COMPILE-instead-of-AC_RUN-to-check-for-execin.patch new file mode 100644 index 0000000000..6625fb55cc --- /dev/null +++ b/meta-oe/recipes-connectivity/libtorrent/libtorrent/0008-Use-AC_COMPILE-instead-of-AC_RUN-to-check-for-execin.patch | |||
| @@ -0,0 +1,24 @@ | |||
| 1 | From c2ec5e0fb8ce7a0df513b5f4086e23d92049ef0e Mon Sep 17 00:00:00 2001 | ||
| 2 | From: Stephen Shkardoon <ss23@ss23.geek.nz> | ||
| 3 | Date: Mon, 25 Jun 2018 20:05:18 +1200 | ||
| 4 | Subject: [PATCH] Use AC_COMPILE instead of AC_RUN to check for execinfo.h | ||
| 5 | |||
| 6 | This way enables cross compiling, since we don't need to run anything | ||
| 7 | during the configure script. | ||
| 8 | --- | ||
| 9 | scripts/common.m4 | 2 +- | ||
| 10 | 1 file changed, 1 insertion(+), 1 deletion(-) | ||
| 11 | |||
| 12 | diff --git a/scripts/common.m4 b/scripts/common.m4 | ||
| 13 | index ff023928..b6d051f5 100644 | ||
| 14 | --- a/scripts/common.m4 | ||
| 15 | +++ b/scripts/common.m4 | ||
| 16 | @@ -153,7 +153,7 @@ dnl Need to fix this so that it uses the stuff defined by the system. | ||
| 17 | AC_DEFUN([TORRENT_CHECK_EXECINFO], [ | ||
| 18 | AC_MSG_CHECKING(for execinfo.h) | ||
| 19 | |||
| 20 | - AC_RUN_IFELSE([AC_LANG_SOURCE([ | ||
| 21 | + AC_COMPILE_IFELSE([AC_LANG_SOURCE([ | ||
| 22 | #include <execinfo.h> | ||
| 23 | int main() { backtrace((void**)0, 0); backtrace_symbols((char**)0, 0); return 0;} | ||
| 24 | ])], | ||
diff --git a/meta-oe/recipes-connectivity/libtorrent/libtorrent/0009-Modify-configure-to-prevent-unnecessary-kqueue-check.patch b/meta-oe/recipes-connectivity/libtorrent/libtorrent/0009-Modify-configure-to-prevent-unnecessary-kqueue-check.patch new file mode 100644 index 0000000000..974f992def --- /dev/null +++ b/meta-oe/recipes-connectivity/libtorrent/libtorrent/0009-Modify-configure-to-prevent-unnecessary-kqueue-check.patch | |||
| @@ -0,0 +1,46 @@ | |||
| 1 | From b0fb874a8921fa4ba2ea0923d779fae8f70c82b1 Mon Sep 17 00:00:00 2001 | ||
| 2 | From: Stephen Shkardoon <ss23@ss23.geek.nz> | ||
| 3 | Date: Thu, 21 Jun 2018 14:38:30 +1200 | ||
| 4 | Subject: [PATCH] Modify configure to prevent unnecessary kqueue checks | ||
| 5 | |||
| 6 | By only running the TORRENT_CHECK_KQUEUE_SOCKET_ONLY check if kqueue support | ||
| 7 | is already detected, we increase the number of platforms that we can | ||
| 8 | cross compile on. | ||
| 9 | Otherwise, the cross compilation fails due to TORRENT_CHECK_KQUEUE_SOCKET_ONLY | ||
| 10 | using AC_RUN_IFELSE, which fails during cross compilation. | ||
| 11 | --- | ||
| 12 | scripts/checks.m4 | 4 +--- | ||
| 13 | 1 file changed, 1 insertion(+), 3 deletions(-) | ||
| 14 | |||
| 15 | diff --git a/scripts/checks.m4 b/scripts/checks.m4 | ||
| 16 | index 8d77fc5e..c9333561 100644 | ||
| 17 | --- a/scripts/checks.m4 | ||
| 18 | +++ b/scripts/checks.m4 | ||
| 19 | @@ -88,6 +88,7 @@ AC_DEFUN([TORRENT_CHECK_KQUEUE], [ | ||
| 20 | [ | ||
| 21 | AC_DEFINE(USE_KQUEUE, 1, Use kqueue.) | ||
| 22 | AC_MSG_RESULT(yes) | ||
| 23 | + TORRENT_CHECK_KQUEUE_SOCKET_ONLY | ||
| 24 | ], [ | ||
| 25 | AC_MSG_RESULT(no) | ||
| 26 | ]) | ||
| 27 | @@ -137,7 +138,6 @@ AC_DEFUN([TORRENT_WITH_KQUEUE], [ | ||
| 28 | [ | ||
| 29 | if test "$withval" = "yes"; then | ||
| 30 | TORRENT_CHECK_KQUEUE | ||
| 31 | - TORRENT_CHECK_KQUEUE_SOCKET_ONLY | ||
| 32 | fi | ||
| 33 | ]) | ||
| 34 | ]) | ||
| 35 | @@ -149,11 +149,9 @@ AC_DEFUN([TORRENT_WITHOUT_KQUEUE], [ | ||
| 36 | [ | ||
| 37 | if test "$withval" = "yes"; then | ||
| 38 | TORRENT_CHECK_KQUEUE | ||
| 39 | - TORRENT_CHECK_KQUEUE_SOCKET_ONLY | ||
| 40 | fi | ||
| 41 | ], [ | ||
| 42 | TORRENT_CHECK_KQUEUE | ||
| 43 | - TORRENT_CHECK_KQUEUE_SOCKET_ONLY | ||
| 44 | ]) | ||
| 45 | ]) | ||
| 46 | |||
diff --git a/meta-oe/recipes-connectivity/libtorrent/libtorrent/0010-Display-info-on-failed-tracker-bencode-parsing-See-9.patch b/meta-oe/recipes-connectivity/libtorrent/libtorrent/0010-Display-info-on-failed-tracker-bencode-parsing-See-9.patch new file mode 100644 index 0000000000..562cdae7a5 --- /dev/null +++ b/meta-oe/recipes-connectivity/libtorrent/libtorrent/0010-Display-info-on-failed-tracker-bencode-parsing-See-9.patch | |||
| @@ -0,0 +1,58 @@ | |||
| 1 | From 4ff83fc53b2c7462b02f804ee20414d85944e3c9 Mon Sep 17 00:00:00 2001 | ||
| 2 | From: chros <chros@chrosGX620> | ||
| 3 | Date: Sun, 14 May 2017 19:36:09 +0100 | ||
| 4 | Subject: [PATCH] Display info on failed tracker bencode parsing (See #9) | ||
| 5 | |||
| 6 | --- | ||
| 7 | rak/string_manip.h | 20 ++++++++++++++++++++ | ||
| 8 | src/tracker/tracker_http.cc | 6 ++++-- | ||
| 9 | 2 files changed, 24 insertions(+), 2 deletions(-) | ||
| 10 | |||
| 11 | diff --git a/rak/string_manip.h b/rak/string_manip.h | ||
| 12 | index f8d3f590..68614d2a 100644 | ||
| 13 | --- a/rak/string_manip.h | ||
| 14 | +++ b/rak/string_manip.h | ||
| 15 | @@ -371,6 +371,26 @@ is_all_name(const Sequence& src) { | ||
| 16 | return is_all_name(src.begin(), src.end()); | ||
| 17 | } | ||
| 18 | |||
| 19 | +template <typename Iterator> | ||
| 20 | +std::string | ||
| 21 | +sanitize(Iterator first, Iterator last) { | ||
| 22 | + std::string dest; | ||
| 23 | + for (; first != last; ++first) { | ||
| 24 | + if (std::isprint(*first) && *first != '\r' && *first != '\n' && *first != '\t') | ||
| 25 | + dest += *first; | ||
| 26 | + else | ||
| 27 | + dest += " "; | ||
| 28 | + } | ||
| 29 | + | ||
| 30 | + return dest; | ||
| 31 | +} | ||
| 32 | + | ||
| 33 | +template <typename Sequence> | ||
| 34 | +std::string | ||
| 35 | +sanitize(const Sequence& src) { | ||
| 36 | + return trim(sanitize(src.begin(), src.end())); | ||
| 37 | +} | ||
| 38 | + | ||
| 39 | } | ||
| 40 | |||
| 41 | #endif | ||
| 42 | diff --git a/src/tracker/tracker_http.cc b/src/tracker/tracker_http.cc | ||
| 43 | index 553f922c..b6d9e0ac 100644 | ||
| 44 | --- a/src/tracker/tracker_http.cc | ||
| 45 | +++ b/src/tracker/tracker_http.cc | ||
| 46 | @@ -288,8 +288,10 @@ TrackerHttp::receive_done() { | ||
| 47 | Object b; | ||
| 48 | *m_data >> b; | ||
| 49 | |||
| 50 | - if (m_data->fail()) | ||
| 51 | - return receive_failed("Could not parse bencoded data"); | ||
| 52 | + if (m_data->fail()) { | ||
| 53 | + std::string dump = m_data->str(); | ||
| 54 | + return receive_failed("Could not parse bencoded data: " + rak::sanitize(dump).substr(0,99)); | ||
| 55 | + } | ||
| 56 | |||
| 57 | if (!b.is_map()) | ||
| 58 | return receive_failed("Root not a bencoded map"); | ||
diff --git a/meta-oe/recipes-connectivity/libtorrent/libtorrent/0011-Strip-tags-also-when-displaying-info-on-failed-track.patch b/meta-oe/recipes-connectivity/libtorrent/libtorrent/0011-Strip-tags-also-when-displaying-info-on-failed-track.patch new file mode 100644 index 0000000000..7a8c9aa5ae --- /dev/null +++ b/meta-oe/recipes-connectivity/libtorrent/libtorrent/0011-Strip-tags-also-when-displaying-info-on-failed-track.patch | |||
| @@ -0,0 +1,60 @@ | |||
| 1 | From 2f197be69057f793d29272b90300f74d0b588d51 Mon Sep 17 00:00:00 2001 | ||
| 2 | From: chros <chros@chrosGX620> | ||
| 3 | Date: Mon, 15 May 2017 19:24:33 +0100 | ||
| 4 | Subject: [PATCH] Strip tags also when displaying info on failed tracker | ||
| 5 | bencode parsing (See #9) | ||
| 6 | |||
| 7 | --- | ||
| 8 | rak/string_manip.h | 25 +++++++++++++++++++++++++ | ||
| 9 | src/tracker/tracker_http.cc | 2 +- | ||
| 10 | 2 files changed, 26 insertions(+), 1 deletion(-) | ||
| 11 | |||
| 12 | diff --git a/rak/string_manip.h b/rak/string_manip.h | ||
| 13 | index 68614d2a..ae867c98 100644 | ||
| 14 | --- a/rak/string_manip.h | ||
| 15 | +++ b/rak/string_manip.h | ||
| 16 | @@ -391,6 +391,31 @@ sanitize(const Sequence& src) { | ||
| 17 | return trim(sanitize(src.begin(), src.end())); | ||
| 18 | } | ||
| 19 | |||
| 20 | +template <typename Iterator> | ||
| 21 | +std::string striptags(Iterator first, Iterator last) { | ||
| 22 | + bool copychar = true; | ||
| 23 | + std::string dest; | ||
| 24 | + | ||
| 25 | + for (; first != last; ++first) { | ||
| 26 | + if (std::isprint(*first) && *first == '<') { | ||
| 27 | + copychar = false; | ||
| 28 | + } else if (std::isprint(*first) && *first == '>') { | ||
| 29 | + copychar = true; | ||
| 30 | + continue; | ||
| 31 | + } | ||
| 32 | + | ||
| 33 | + if (copychar) | ||
| 34 | + dest += *first; | ||
| 35 | + } | ||
| 36 | + | ||
| 37 | + return dest; | ||
| 38 | +} | ||
| 39 | + | ||
| 40 | +template <typename Sequence> | ||
| 41 | +std::string striptags(const Sequence& src) { | ||
| 42 | + return striptags(src.begin(), src.end()); | ||
| 43 | +} | ||
| 44 | + | ||
| 45 | } | ||
| 46 | |||
| 47 | #endif | ||
| 48 | diff --git a/src/tracker/tracker_http.cc b/src/tracker/tracker_http.cc | ||
| 49 | index b6d9e0ac..eefe5a17 100644 | ||
| 50 | --- a/src/tracker/tracker_http.cc | ||
| 51 | +++ b/src/tracker/tracker_http.cc | ||
| 52 | @@ -290,7 +290,7 @@ TrackerHttp::receive_done() { | ||
| 53 | |||
| 54 | if (m_data->fail()) { | ||
| 55 | std::string dump = m_data->str(); | ||
| 56 | - return receive_failed("Could not parse bencoded data: " + rak::sanitize(dump).substr(0,99)); | ||
| 57 | + return receive_failed("Could not parse bencoded data: " + rak::sanitize(rak::striptags(dump)).substr(0,99)); | ||
| 58 | } | ||
| 59 | |||
| 60 | if (!b.is_map()) | ||
diff --git a/meta-oe/recipes-connectivity/libtorrent/libtorrent/0012-Switch-to-C-11-MRT-RNG-for-random-bytes.patch b/meta-oe/recipes-connectivity/libtorrent/libtorrent/0012-Switch-to-C-11-MRT-RNG-for-random-bytes.patch new file mode 100644 index 0000000000..f4776247de --- /dev/null +++ b/meta-oe/recipes-connectivity/libtorrent/libtorrent/0012-Switch-to-C-11-MRT-RNG-for-random-bytes.patch | |||
| @@ -0,0 +1,45 @@ | |||
| 1 | From 0e86289a8bb5672781e508683bb28aebf9995127 Mon Sep 17 00:00:00 2001 | ||
| 2 | From: lps-rocks <admin@lps.rocks> | ||
| 3 | Date: Mon, 4 Mar 2019 05:03:47 -0500 | ||
| 4 | Subject: [PATCH] Switch to C++11 MRT RNG for random bytes | ||
| 5 | |||
| 6 | Switching to a better RNG for generating strings will prevent the common peerID collisions the rTorrent client has been seeing for YEARS in #440 and #318. | ||
| 7 | --- | ||
| 8 | rak/string_manip.h | 12 +++++++++--- | ||
| 9 | 1 file changed, 9 insertions(+), 3 deletions(-) | ||
| 10 | |||
| 11 | diff --git a/rak/string_manip.h b/rak/string_manip.h | ||
| 12 | index ae867c98..1a09c377 100644 | ||
| 13 | --- a/rak/string_manip.h | ||
| 14 | +++ b/rak/string_manip.h | ||
| 15 | @@ -39,9 +39,13 @@ | ||
| 16 | |||
| 17 | #include <algorithm> | ||
| 18 | #include <cctype> | ||
| 19 | +#include <climits> | ||
| 20 | #include <cstdlib> | ||
| 21 | +#include <functional> | ||
| 22 | #include <iterator> | ||
| 23 | #include <locale> | ||
| 24 | +#include <random> | ||
| 25 | + | ||
| 26 | |||
| 27 | namespace rak { | ||
| 28 | |||
| 29 | @@ -312,11 +316,13 @@ transform_hex_str(const Sequence& seq) { | ||
| 30 | template <typename Sequence> | ||
| 31 | Sequence | ||
| 32 | generate_random(size_t length) { | ||
| 33 | + std::random_device rd; | ||
| 34 | + std::mt19937 mt(rd()); | ||
| 35 | + using bytes_randomizer = std::independent_bits_engine<std::mt19937, CHAR_BIT, uint8_t>; | ||
| 36 | + bytes_randomizer bytes(mt); | ||
| 37 | Sequence s; | ||
| 38 | s.reserve(length); | ||
| 39 | - | ||
| 40 | - std::generate_n(std::back_inserter(s), length, &::random); | ||
| 41 | - | ||
| 42 | + std::generate_n(std::back_inserter(s), length, std::ref(bytes)); | ||
| 43 | return s; | ||
| 44 | } | ||
| 45 | |||
diff --git a/meta-oe/recipes-connectivity/libtorrent/libtorrent/0013-Prevent-loss-of-m_ipv6_socket-attribute-which-led-to.patch b/meta-oe/recipes-connectivity/libtorrent/libtorrent/0013-Prevent-loss-of-m_ipv6_socket-attribute-which-led-to.patch new file mode 100644 index 0000000000..1d4cc3e331 --- /dev/null +++ b/meta-oe/recipes-connectivity/libtorrent/libtorrent/0013-Prevent-loss-of-m_ipv6_socket-attribute-which-led-to.patch | |||
| @@ -0,0 +1,45 @@ | |||
| 1 | From bf35c5f3d4e458a671fdc3c382f4fa06ecaeb119 Mon Sep 17 00:00:00 2001 | ||
| 2 | From: Vladyslav Movchan <vladislav.movchan@gmail.com> | ||
| 3 | Date: Sat, 3 Nov 2018 19:52:56 +0200 | ||
| 4 | Subject: [PATCH] Prevent loss of 'm_ipv6_socket' attribute which led to | ||
| 5 | execution of setsockopt(..., IPPROTO_IP, IP_TOS, ...) on IPv6 socket | ||
| 6 | |||
| 7 | --- | ||
| 8 | src/net/socket_fd.cc | 4 ++-- | ||
| 9 | src/net/socket_fd.h | 1 + | ||
| 10 | 2 files changed, 3 insertions(+), 2 deletions(-) | ||
| 11 | |||
| 12 | diff --git a/src/net/socket_fd.cc b/src/net/socket_fd.cc | ||
| 13 | index 54cb6ded..f04059f6 100644 | ||
| 14 | --- a/src/net/socket_fd.cc | ||
| 15 | +++ b/src/net/socket_fd.cc | ||
| 16 | @@ -251,7 +251,7 @@ SocketFd::accept(rak::socket_address* sa) { | ||
| 17 | socklen_t len = sizeof(rak::socket_address); | ||
| 18 | |||
| 19 | if (sa == NULL) { | ||
| 20 | - return SocketFd(::accept(m_fd, NULL, &len)); | ||
| 21 | + return SocketFd(::accept(m_fd, NULL, &len), m_ipv6_socket); | ||
| 22 | } | ||
| 23 | |||
| 24 | int fd = ::accept(m_fd, sa->c_sockaddr(), &len); | ||
| 25 | @@ -260,7 +260,7 @@ SocketFd::accept(rak::socket_address* sa) { | ||
| 26 | *sa = sa->sa_inet6()->normalize_address(); | ||
| 27 | } | ||
| 28 | |||
| 29 | - return SocketFd(fd); | ||
| 30 | + return SocketFd(fd, m_ipv6_socket); | ||
| 31 | } | ||
| 32 | |||
| 33 | // unsigned int | ||
| 34 | diff --git a/src/net/socket_fd.h b/src/net/socket_fd.h | ||
| 35 | index ca765e88..2329b4e9 100644 | ||
| 36 | --- a/src/net/socket_fd.h | ||
| 37 | +++ b/src/net/socket_fd.h | ||
| 38 | @@ -51,6 +51,7 @@ public: | ||
| 39 | |||
| 40 | SocketFd() : m_fd(-1) {} | ||
| 41 | explicit SocketFd(int fd) : m_fd(fd) {} | ||
| 42 | + SocketFd(int fd, bool ipv6_socket) : m_fd(fd), m_ipv6_socket(ipv6_socket) {} | ||
| 43 | |||
| 44 | bool is_valid() const { return m_fd >= 0; } | ||
| 45 | |||
diff --git a/meta-oe/recipes-connectivity/libtorrent/libtorrent/0014-If-during-socket-creation-AF_INET6-failes-initialize.patch b/meta-oe/recipes-connectivity/libtorrent/libtorrent/0014-If-during-socket-creation-AF_INET6-failes-initialize.patch new file mode 100644 index 0000000000..4bb1ed21c4 --- /dev/null +++ b/meta-oe/recipes-connectivity/libtorrent/libtorrent/0014-If-during-socket-creation-AF_INET6-failes-initialize.patch | |||
| @@ -0,0 +1,27 @@ | |||
| 1 | From 1890bde5c051d932d1b2940e815d0c82964c474c Mon Sep 17 00:00:00 2001 | ||
| 2 | From: Gleb Smirnoff <glebius@FreeBSD.org> | ||
| 3 | Date: Tue, 2 Oct 2018 18:57:43 -0700 | ||
| 4 | Subject: [PATCH] If during socket creation AF_INET6 failes initialize sockaddr | ||
| 5 | as AF_INET. Otherwise any bind(2) would fail due to sockaddr address family | ||
| 6 | not matching socket address family. | ||
| 7 | |||
| 8 | --- | ||
| 9 | src/net/listen.cc | 5 ++++- | ||
| 10 | 1 file changed, 4 insertions(+), 1 deletion(-) | ||
| 11 | |||
| 12 | diff --git a/src/net/listen.cc b/src/net/listen.cc | ||
| 13 | index da1c2e84..d424e94c 100644 | ||
| 14 | --- a/src/net/listen.cc | ||
| 15 | +++ b/src/net/listen.cc | ||
| 16 | @@ -75,7 +75,10 @@ Listen::open(uint16_t first, uint16_t last, int backlog, const rak::socket_addre | ||
| 17 | |||
| 18 | // TODO: Temporary until we refactor: | ||
| 19 | if (bindAddress->family() == 0) { | ||
| 20 | - sa.sa_inet6()->clear(); | ||
| 21 | + if (m_ipv6_socket) | ||
| 22 | + sa.sa_inet6()->clear(); | ||
| 23 | + else | ||
| 24 | + sa.sa_inet()->clear(); | ||
| 25 | } else { | ||
| 26 | sa.copy(*bindAddress, bindAddress->length()); | ||
| 27 | } | ||
diff --git a/meta-oe/recipes-connectivity/libtorrent/libtorrent/0015-Fixes-https-github.com-rakshasa-rtorrent-issues-731.patch b/meta-oe/recipes-connectivity/libtorrent/libtorrent/0015-Fixes-https-github.com-rakshasa-rtorrent-issues-731.patch new file mode 100644 index 0000000000..a33a0103b9 --- /dev/null +++ b/meta-oe/recipes-connectivity/libtorrent/libtorrent/0015-Fixes-https-github.com-rakshasa-rtorrent-issues-731.patch | |||
| @@ -0,0 +1,29 @@ | |||
| 1 | From cbd946b6cad8c93b3d39ab4f338b3640f684cbfc Mon Sep 17 00:00:00 2001 | ||
| 2 | From: Adam Fontenot <adam.m.fontenot@gmail.com> | ||
| 3 | Date: Sat, 7 Jul 2018 16:52:07 -0700 | ||
| 4 | Subject: [PATCH] Fixes https://github.com/rakshasa/rtorrent/issues/731 | ||
| 5 | |||
| 6 | --- | ||
| 7 | src/tracker/tracker_http.cc | 4 ++-- | ||
| 8 | 1 file changed, 2 insertions(+), 2 deletions(-) | ||
| 9 | |||
| 10 | diff --git a/src/tracker/tracker_http.cc b/src/tracker/tracker_http.cc | ||
| 11 | index eefe5a17..1bf94107 100644 | ||
| 12 | --- a/src/tracker/tracker_http.cc | ||
| 13 | +++ b/src/tracker/tracker_http.cc | ||
| 14 | @@ -145,13 +145,13 @@ TrackerHttp::send_state(int state) { | ||
| 15 | if (!localAddress->is_address_any()) | ||
| 16 | s << "&ip=" << localAddress->address_str(); | ||
| 17 | |||
| 18 | - if (localAddress->is_address_any() || localAddress->family() != rak::socket_address::pf_inet6) { | ||
| 19 | + if (localAddress->is_address_any() && localAddress->family() == rak::socket_address::pf_inet) { | ||
| 20 | rak::socket_address local_v6; | ||
| 21 | if (get_local_address(rak::socket_address::af_inet6, &local_v6)) | ||
| 22 | s << "&ipv6=" << rak::copy_escape_html(local_v6.address_str()); | ||
| 23 | } | ||
| 24 | |||
| 25 | - if (localAddress->is_address_any() || localAddress->family() != rak::socket_address::pf_inet) { | ||
| 26 | + if (localAddress->is_address_any() && localAddress->family() == rak::socket_address::pf_inet6) { | ||
| 27 | rak::socket_address local_v4; | ||
| 28 | if (get_local_address(rak::socket_address::af_inet, &local_v4)) | ||
| 29 | s << "&ipv4=" << local_v4.address_str(); | ||
diff --git a/meta-oe/recipes-connectivity/libtorrent/libtorrent/0016-Fix-honoring-throttle.min_peers-settings-in-rtorrent.patch b/meta-oe/recipes-connectivity/libtorrent/libtorrent/0016-Fix-honoring-throttle.min_peers-settings-in-rtorrent.patch new file mode 100644 index 0000000000..6ef5f1ad4d --- /dev/null +++ b/meta-oe/recipes-connectivity/libtorrent/libtorrent/0016-Fix-honoring-throttle.min_peers-settings-in-rtorrent.patch | |||
| @@ -0,0 +1,40 @@ | |||
| 1 | From d49316117401cff4045b1d1194cec60909e45555 Mon Sep 17 00:00:00 2001 | ||
| 2 | From: chros <chros@chrosGX620> | ||
| 3 | Date: Sun, 13 May 2018 11:34:33 +0100 | ||
| 4 | Subject: [PATCH] Fix honoring throttle.min_peers* settings in rtorrent (See | ||
| 5 | #13) | ||
| 6 | |||
| 7 | --- | ||
| 8 | src/download/download_main.cc | 17 ++++++----------- | ||
| 9 | 1 file changed, 6 insertions(+), 11 deletions(-) | ||
| 10 | |||
| 11 | diff --git a/src/download/download_main.cc b/src/download/download_main.cc | ||
| 12 | index 48222c38..efe91d66 100644 | ||
| 13 | --- a/src/download/download_main.cc | ||
| 14 | +++ b/src/download/download_main.cc | ||
| 15 | @@ -355,19 +355,14 @@ DownloadMain::receive_tracker_success() { | ||
| 16 | |||
| 17 | void | ||
| 18 | DownloadMain::receive_tracker_request() { | ||
| 19 | - bool should_stop = false; | ||
| 20 | - bool should_start = false; | ||
| 21 | + if (info()->is_pex_enabled() && info()->size_pex() > 0 | ||
| 22 | + || connection_list()->size() + peer_list()->available_list()->size() / 2 >= connection_list()->min_size()) { | ||
| 23 | |||
| 24 | - if (info()->is_pex_enabled() && info()->size_pex() > 0) | ||
| 25 | - should_stop = true; | ||
| 26 | - | ||
| 27 | - if (connection_list()->size() + peer_list()->available_list()->size() / 2 < connection_list()->min_size()) | ||
| 28 | - should_start = true; | ||
| 29 | - | ||
| 30 | - if (should_stop) | ||
| 31 | m_tracker_controller->stop_requesting(); | ||
| 32 | - else if (should_start) | ||
| 33 | - m_tracker_controller->start_requesting(); | ||
| 34 | + return; | ||
| 35 | + } | ||
| 36 | + | ||
| 37 | + m_tracker_controller->start_requesting(); | ||
| 38 | } | ||
| 39 | |||
| 40 | struct SocketAddressCompact_less { | ||
diff --git a/meta-oe/recipes-connectivity/libtorrent/libtorrent/0017-increase-piece-length-max.patch b/meta-oe/recipes-connectivity/libtorrent/libtorrent/0017-increase-piece-length-max.patch new file mode 100644 index 0000000000..7108507a14 --- /dev/null +++ b/meta-oe/recipes-connectivity/libtorrent/libtorrent/0017-increase-piece-length-max.patch | |||
| @@ -0,0 +1,22 @@ | |||
| 1 | From 9fd2f35f86397b9259e0c9b7c54444c0ec3c8965 Mon Sep 17 00:00:00 2001 | ||
| 2 | From: adam <adam@shinka.sh> | ||
| 3 | Date: Mon, 26 Feb 2018 16:04:34 +0200 | ||
| 4 | Subject: [PATCH] increase piece length max | ||
| 5 | |||
| 6 | --- | ||
| 7 | src/download/download_constructor.cc | 2 +- | ||
| 8 | 1 file changed, 1 insertion(+), 1 deletion(-) | ||
| 9 | |||
| 10 | diff --git a/src/download/download_constructor.cc b/src/download/download_constructor.cc | ||
| 11 | index 1bb261bd..67ef4276 100644 | ||
| 12 | --- a/src/download/download_constructor.cc | ||
| 13 | +++ b/src/download/download_constructor.cc | ||
| 14 | @@ -157,7 +157,7 @@ DownloadConstructor::parse_info(const Object& b) { | ||
| 15 | } else { | ||
| 16 | chunkSize = b.get_key_value("piece length"); | ||
| 17 | |||
| 18 | - if (chunkSize <= (1 << 10) || chunkSize > (128 << 20)) | ||
| 19 | + if (chunkSize <= (1 << 10) || chunkSize > (128 << 22)) | ||
| 20 | throw input_error("Torrent has an invalid \"piece length\"."); | ||
| 21 | } | ||
| 22 | |||
diff --git a/meta-oe/recipes-connectivity/libtorrent/libtorrent/0018-Set-max-piece-size-512mb.patch b/meta-oe/recipes-connectivity/libtorrent/libtorrent/0018-Set-max-piece-size-512mb.patch new file mode 100644 index 0000000000..f864d23c31 --- /dev/null +++ b/meta-oe/recipes-connectivity/libtorrent/libtorrent/0018-Set-max-piece-size-512mb.patch | |||
| @@ -0,0 +1,22 @@ | |||
| 1 | From b263b347f14b9d0ca54d04ca92367a98d791dc17 Mon Sep 17 00:00:00 2001 | ||
| 2 | From: Jari Sundell <sundell.software@gmail.com> | ||
| 3 | Date: Sun, 9 Jun 2019 14:53:32 +0900 | ||
| 4 | Subject: [PATCH] Set max piece size 512mb. | ||
| 5 | |||
| 6 | --- | ||
| 7 | src/download/download_constructor.cc | 2 +- | ||
| 8 | 1 file changed, 1 insertion(+), 1 deletion(-) | ||
| 9 | |||
| 10 | diff --git a/src/download/download_constructor.cc b/src/download/download_constructor.cc | ||
| 11 | index 67ef4276..1bf362fa 100644 | ||
| 12 | --- a/src/download/download_constructor.cc | ||
| 13 | +++ b/src/download/download_constructor.cc | ||
| 14 | @@ -157,7 +157,7 @@ DownloadConstructor::parse_info(const Object& b) { | ||
| 15 | } else { | ||
| 16 | chunkSize = b.get_key_value("piece length"); | ||
| 17 | |||
| 18 | - if (chunkSize <= (1 << 10) || chunkSize > (128 << 22)) | ||
| 19 | + if (chunkSize <= (1 << 10) || chunkSize > (512 << 20)) | ||
| 20 | throw input_error("Torrent has an invalid \"piece length\"."); | ||
| 21 | } | ||
| 22 | |||
diff --git a/meta-oe/recipes-connectivity/libtorrent/libtorrent/0019-Fixed-compiler-warning.patch b/meta-oe/recipes-connectivity/libtorrent/libtorrent/0019-Fixed-compiler-warning.patch new file mode 100644 index 0000000000..0a06a26883 --- /dev/null +++ b/meta-oe/recipes-connectivity/libtorrent/libtorrent/0019-Fixed-compiler-warning.patch | |||
| @@ -0,0 +1,22 @@ | |||
| 1 | From cdfb4381bedb278dabb8ca75c10858d16b895355 Mon Sep 17 00:00:00 2001 | ||
| 2 | From: Jari Sundell <sundell.software@gmail.com> | ||
| 3 | Date: Sun, 9 Jun 2019 14:55:44 +0900 | ||
| 4 | Subject: [PATCH] Fixed compiler warning. | ||
| 5 | |||
| 6 | --- | ||
| 7 | src/download/download_main.cc | 2 +- | ||
| 8 | 1 file changed, 1 insertion(+), 1 deletion(-) | ||
| 9 | |||
| 10 | diff --git a/src/download/download_main.cc b/src/download/download_main.cc | ||
| 11 | index efe91d66..9a3f9df2 100644 | ||
| 12 | --- a/src/download/download_main.cc | ||
| 13 | +++ b/src/download/download_main.cc | ||
| 14 | @@ -355,7 +355,7 @@ DownloadMain::receive_tracker_success() { | ||
| 15 | |||
| 16 | void | ||
| 17 | DownloadMain::receive_tracker_request() { | ||
| 18 | - if (info()->is_pex_enabled() && info()->size_pex() > 0 | ||
| 19 | + if ((info()->is_pex_enabled() && info()->size_pex()) > 0 | ||
| 20 | || connection_list()->size() + peer_list()->available_list()->size() / 2 >= connection_list()->min_size()) { | ||
| 21 | |||
| 22 | m_tracker_controller->stop_requesting(); | ||
diff --git a/meta-oe/recipes-connectivity/libtorrent/libtorrent/0020-Added-_GNU_SOURCE-to-fallocate-test.-neheb.patch b/meta-oe/recipes-connectivity/libtorrent/libtorrent/0020-Added-_GNU_SOURCE-to-fallocate-test.-neheb.patch new file mode 100644 index 0000000000..0f183816cf --- /dev/null +++ b/meta-oe/recipes-connectivity/libtorrent/libtorrent/0020-Added-_GNU_SOURCE-to-fallocate-test.-neheb.patch | |||
| @@ -0,0 +1,74 @@ | |||
| 1 | From 8934703edb5982661483eb8a29d76e6a726b5fe2 Mon Sep 17 00:00:00 2001 | ||
| 2 | From: rakshasa <sundell.software@gmail.com> | ||
| 3 | Date: Mon, 8 Jul 2019 19:37:06 +0200 | ||
| 4 | Subject: [PATCH] Added _GNU_SOURCE to fallocate test. (neheb) | ||
| 5 | |||
| 6 | --- | ||
| 7 | scripts/checks.m4 | 10 ++++++---- | ||
| 8 | src/data/socket_file.cc | 1 + | ||
| 9 | 2 files changed, 7 insertions(+), 4 deletions(-) | ||
| 10 | |||
| 11 | diff --git a/scripts/checks.m4 b/scripts/checks.m4 | ||
| 12 | index c9333561..83be8461 100644 | ||
| 13 | --- a/scripts/checks.m4 | ||
| 14 | +++ b/scripts/checks.m4 | ||
| 15 | @@ -88,7 +88,6 @@ AC_DEFUN([TORRENT_CHECK_KQUEUE], [ | ||
| 16 | [ | ||
| 17 | AC_DEFINE(USE_KQUEUE, 1, Use kqueue.) | ||
| 18 | AC_MSG_RESULT(yes) | ||
| 19 | - TORRENT_CHECK_KQUEUE_SOCKET_ONLY | ||
| 20 | ], [ | ||
| 21 | AC_MSG_RESULT(no) | ||
| 22 | ]) | ||
| 23 | @@ -97,7 +96,7 @@ AC_DEFUN([TORRENT_CHECK_KQUEUE], [ | ||
| 24 | AC_DEFUN([TORRENT_CHECK_KQUEUE_SOCKET_ONLY], [ | ||
| 25 | AC_MSG_CHECKING(whether kqueue supports pipes and ptys) | ||
| 26 | |||
| 27 | - AC_RUN_IFELSE([AC_LANG_SOURCE([ | ||
| 28 | + AC_LINK_IFELSE([AC_LANG_SOURCE([ | ||
| 29 | #include <fcntl.h> | ||
| 30 | #include <stdlib.h> | ||
| 31 | #include <unistd.h> | ||
| 32 | @@ -138,6 +137,7 @@ AC_DEFUN([TORRENT_WITH_KQUEUE], [ | ||
| 33 | [ | ||
| 34 | if test "$withval" = "yes"; then | ||
| 35 | TORRENT_CHECK_KQUEUE | ||
| 36 | + TORRENT_CHECK_KQUEUE_SOCKET_ONLY | ||
| 37 | fi | ||
| 38 | ]) | ||
| 39 | ]) | ||
| 40 | @@ -149,9 +149,11 @@ AC_DEFUN([TORRENT_WITHOUT_KQUEUE], [ | ||
| 41 | [ | ||
| 42 | if test "$withval" = "yes"; then | ||
| 43 | TORRENT_CHECK_KQUEUE | ||
| 44 | + TORRENT_CHECK_KQUEUE_SOCKET_ONLY | ||
| 45 | fi | ||
| 46 | ], [ | ||
| 47 | TORRENT_CHECK_KQUEUE | ||
| 48 | + TORRENT_CHECK_KQUEUE_SOCKET_ONLY | ||
| 49 | ]) | ||
| 50 | ]) | ||
| 51 | |||
| 52 | @@ -172,8 +174,8 @@ AC_DEFUN([TORRENT_WITHOUT_VARIABLE_FDSET], [ | ||
| 53 | AC_DEFUN([TORRENT_CHECK_FALLOCATE], [ | ||
| 54 | AC_MSG_CHECKING(for fallocate) | ||
| 55 | |||
| 56 | - AC_TRY_LINK([#include <fcntl.h> | ||
| 57 | - #include <linux/falloc.h> | ||
| 58 | + AC_TRY_LINK([#define _GNU_SOURCE | ||
| 59 | + #include <fcntl.h> | ||
| 60 | ],[ fallocate(0, FALLOC_FL_KEEP_SIZE, 0, 0); return 0; | ||
| 61 | ], | ||
| 62 | [ | ||
| 63 | diff --git a/src/data/socket_file.cc b/src/data/socket_file.cc | ||
| 64 | index 4b4519ed..b359ef8e 100644 | ||
| 65 | --- a/src/data/socket_file.cc | ||
| 66 | +++ b/src/data/socket_file.cc | ||
| 67 | @@ -48,6 +48,7 @@ | ||
| 68 | #include <sys/types.h> | ||
| 69 | |||
| 70 | #ifdef HAVE_FALLOCATE | ||
| 71 | +#define _GNU_SOURCE | ||
| 72 | #include <linux/falloc.h> | ||
| 73 | #endif | ||
| 74 | |||
diff --git a/meta-oe/recipes-connectivity/libtorrent/libtorrent/0021-Fixed-diffie-hellman-implementation.patch b/meta-oe/recipes-connectivity/libtorrent/libtorrent/0021-Fixed-diffie-hellman-implementation.patch new file mode 100644 index 0000000000..ad9e45758c --- /dev/null +++ b/meta-oe/recipes-connectivity/libtorrent/libtorrent/0021-Fixed-diffie-hellman-implementation.patch | |||
| @@ -0,0 +1,293 @@ | |||
| 1 | From 856d42e2ca3c9810bf84a8bce219000e822540fa Mon Sep 17 00:00:00 2001 | ||
| 2 | From: rakshasa <sundell.software@gmail.com> | ||
| 3 | Date: Fri, 12 Jul 2019 00:29:35 +0200 | ||
| 4 | Subject: [PATCH] Fixed diffie hellman implementation. | ||
| 5 | |||
| 6 | --- | ||
| 7 | src/utils/diffie_hellman.cc | 137 ++++++++++++------------------------ | ||
| 8 | src/utils/diffie_hellman.h | 67 ++++-------------- | ||
| 9 | 2 files changed, 59 insertions(+), 145 deletions(-) | ||
| 10 | |||
| 11 | diff --git a/src/utils/diffie_hellman.cc b/src/utils/diffie_hellman.cc | ||
| 12 | index 7ec13165..d53a857b 100644 | ||
| 13 | --- a/src/utils/diffie_hellman.cc | ||
| 14 | +++ b/src/utils/diffie_hellman.cc | ||
| 15 | @@ -1,118 +1,79 @@ | ||
| 16 | -// libTorrent - BitTorrent library | ||
| 17 | -// Copyright (C) 2005-2011, Jari Sundell | ||
| 18 | -// | ||
| 19 | -// This program is free software; you can redistribute it and/or modify | ||
| 20 | -// it under the terms of the GNU General Public License as published by | ||
| 21 | -// the Free Software Foundation; either version 2 of the License, or | ||
| 22 | -// (at your option) any later version. | ||
| 23 | -// | ||
| 24 | -// This program is distributed in the hope that it will be useful, | ||
| 25 | -// but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
| 26 | -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
| 27 | -// GNU General Public License for more details. | ||
| 28 | -// | ||
| 29 | -// You should have received a copy of the GNU General Public License | ||
| 30 | -// along with this program; if not, write to the Free Software | ||
| 31 | -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | ||
| 32 | -// | ||
| 33 | -// In addition, as a special exception, the copyright holders give | ||
| 34 | -// permission to link the code of portions of this program with the | ||
| 35 | -// OpenSSL library under certain conditions as described in each | ||
| 36 | -// individual source file, and distribute linked combinations | ||
| 37 | -// including the two. | ||
| 38 | -// | ||
| 39 | -// You must obey the GNU General Public License in all respects for | ||
| 40 | -// all of the code used other than OpenSSL. If you modify file(s) | ||
| 41 | -// with this exception, you may extend this exception to your version | ||
| 42 | -// of the file(s), but you are not obligated to do so. If you do not | ||
| 43 | -// wish to do so, delete this exception statement from your version. | ||
| 44 | -// If you delete this exception statement from all source files in the | ||
| 45 | -// program, then also delete it here. | ||
| 46 | -// | ||
| 47 | -// Contact: Jari Sundell <jaris@ifi.uio.no> | ||
| 48 | -// | ||
| 49 | -// Skomakerveien 33 | ||
| 50 | -// 3185 Skoppum, NORWAY | ||
| 51 | - | ||
| 52 | #include "config.h" | ||
| 53 | |||
| 54 | +#include "diffie_hellman.h" | ||
| 55 | + | ||
| 56 | +#include "torrent/exceptions.h" | ||
| 57 | + | ||
| 58 | #include <cstring> | ||
| 59 | -#include <string> | ||
| 60 | |||
| 61 | #ifdef USE_OPENSSL | ||
| 62 | +#include <openssl/dh.h> | ||
| 63 | #include <openssl/bn.h> | ||
| 64 | #endif | ||
| 65 | |||
| 66 | -#include "diffie_hellman.h" | ||
| 67 | -#include "torrent/exceptions.h" | ||
| 68 | - | ||
| 69 | namespace torrent { | ||
| 70 | |||
| 71 | -#pragma GCC diagnostic ignored "-Wdeprecated-declarations" | ||
| 72 | -DiffieHellman::DiffieHellman(const unsigned char *prime, int primeLength, | ||
| 73 | - const unsigned char *generator, int generatorLength) : | ||
| 74 | - m_secret(NULL), m_size(0) { | ||
| 75 | - | ||
| 76 | #ifdef USE_OPENSSL | ||
| 77 | |||
| 78 | - m_dh = DH_new(); | ||
| 79 | - | ||
| 80 | -#ifdef USE_OPENSSL_1_1 | ||
| 81 | - BIGNUM * const dh_p = BN_bin2bn(prime, primeLength, NULL); | ||
| 82 | - BIGNUM * const dh_g = BN_bin2bn(generator, generatorLength, NULL); | ||
| 83 | +static void dh_free(void* dh) { DH_free(reinterpret_cast<DH*>(dh)); } | ||
| 84 | +static DiffieHellman::dh_ptr dh_new() { return DiffieHellman::dh_ptr(reinterpret_cast<void*>(DH_new()), &dh_free); } | ||
| 85 | +static DH* dh_get(DiffieHellman::dh_ptr& dh) { return reinterpret_cast<DH*>(dh.get()); } | ||
| 86 | |||
| 87 | - if (dh_p == NULL || dh_g == NULL || | ||
| 88 | - !DH_set0_pqg(m_dh, dh_p, NULL, dh_g)) | ||
| 89 | - throw internal_error("Could not generate Diffie-Hellman parameters"); | ||
| 90 | +static bool | ||
| 91 | +dh_set_pg(DiffieHellman::dh_ptr& dh, BIGNUM* dh_p, BIGNUM* dh_g) { | ||
| 92 | +#if OPENSSL_VERSION_NUMBER >= 0x10100000L | ||
| 93 | + return DH_set0_pqg(reinterpret_cast<DH*>(dh.get()), dh_p, nullptr, dh_g); | ||
| 94 | #else | ||
| 95 | - m_dh->p = BN_bin2bn(prime, primeLength, NULL); | ||
| 96 | - m_dh->g = BN_bin2bn(generator, generatorLength, NULL); | ||
| 97 | + reinterpret_cast<DH*>(dh.get())->p = dh_p; | ||
| 98 | + reinterpret_cast<DH*>(dh.get())->g = dh_g; | ||
| 99 | + return true; | ||
| 100 | #endif | ||
| 101 | +} | ||
| 102 | |||
| 103 | - DH_generate_key(m_dh); | ||
| 104 | - | ||
| 105 | +static const BIGNUM* dh_get_pub_key(const DiffieHellman::dh_ptr& dh) { | ||
| 106 | +#if OPENSSL_VERSION_NUMBER >= 0x10100000L | ||
| 107 | + const BIGNUM *pub_key; | ||
| 108 | + DH_get0_key(reinterpret_cast<DH*>(dh.get()), &pub_key, nullptr); | ||
| 109 | + return pub_key; | ||
| 110 | #else | ||
| 111 | - throw internal_error("Compiled without encryption support."); | ||
| 112 | + return dh != nullptr ? reinterpret_cast<DH*>(dh.get())->pub_key : nullptr; | ||
| 113 | #endif | ||
| 114 | -}; | ||
| 115 | +} | ||
| 116 | |||
| 117 | -DiffieHellman::~DiffieHellman() { | ||
| 118 | - delete [] m_secret; | ||
| 119 | -#ifdef USE_OPENSSL | ||
| 120 | - DH_free(m_dh); | ||
| 121 | +#else | ||
| 122 | +static DiffieHellman::dh_ptr dh_new() { throw internal_error("Compiled without encryption support."); } | ||
| 123 | +static void dh_free(void* dh) {} | ||
| 124 | +static void* dh_get_pub_key(const DiffieHellman::dh_ptr& dh) { return nullptr; } | ||
| 125 | #endif | ||
| 126 | -}; | ||
| 127 | |||
| 128 | -bool | ||
| 129 | -DiffieHellman::is_valid() const { | ||
| 130 | -#ifdef USE_OPENSSL | ||
| 131 | - if (m_dh == NULL) | ||
| 132 | - return false; | ||
| 133 | +#pragma GCC diagnostic ignored "-Wdeprecated-declarations" | ||
| 134 | +DiffieHellman::DiffieHellman(const unsigned char *prime, int primeLength, | ||
| 135 | + const unsigned char *generator, int generatorLength) : | ||
| 136 | + m_dh(dh_new()), m_size(0) { | ||
| 137 | |||
| 138 | -#ifdef USE_OPENSSL_1_1 | ||
| 139 | - const BIGNUM *pub_key; | ||
| 140 | +#ifdef USE_OPENSSL | ||
| 141 | + BIGNUM* dh_p = BN_bin2bn(prime, primeLength, nullptr); | ||
| 142 | + BIGNUM* dh_g = BN_bin2bn(generator, generatorLength, nullptr); | ||
| 143 | |||
| 144 | - DH_get0_key(m_dh, &pub_key, NULL); | ||
| 145 | + if (dh_p == nullptr || dh_g == nullptr || !dh_set_pg(m_dh, dh_p, dh_g)) | ||
| 146 | + throw internal_error("Could not generate Diffie-Hellman parameters"); | ||
| 147 | |||
| 148 | - return pub_key != NULL; | ||
| 149 | -#else | ||
| 150 | - return m_dh != NULL && m_dh->pub_key != NULL; | ||
| 151 | + DH_generate_key(dh_get(m_dh)); | ||
| 152 | #endif | ||
| 153 | +}; | ||
| 154 | |||
| 155 | -#else | ||
| 156 | - return false; | ||
| 157 | -#endif | ||
| 158 | +bool | ||
| 159 | +DiffieHellman::is_valid() const { | ||
| 160 | + return dh_get_pub_key(m_dh) != nullptr; | ||
| 161 | } | ||
| 162 | |||
| 163 | bool | ||
| 164 | DiffieHellman::compute_secret(const unsigned char *pubkey, unsigned int length) { | ||
| 165 | #ifdef USE_OPENSSL | ||
| 166 | - BIGNUM* k = BN_bin2bn(pubkey, length, NULL); | ||
| 167 | + BIGNUM* k = BN_bin2bn(pubkey, length, nullptr); | ||
| 168 | |||
| 169 | - delete [] m_secret; | ||
| 170 | - m_secret = new char[DH_size(m_dh)]; | ||
| 171 | - | ||
| 172 | - m_size = DH_compute_key((unsigned char*)m_secret, k, m_dh); | ||
| 173 | + m_secret.reset(new char[DH_size(dh_get(m_dh))]); | ||
| 174 | + m_size = DH_compute_key(reinterpret_cast<unsigned char*>(m_secret.get()), k, dh_get(m_dh)); | ||
| 175 | |||
| 176 | BN_free(k); | ||
| 177 | |||
| 178 | @@ -124,16 +85,10 @@ DiffieHellman::compute_secret(const unsigned char *pubkey, unsigned int length) | ||
| 179 | |||
| 180 | void | ||
| 181 | DiffieHellman::store_pub_key(unsigned char* dest, unsigned int length) { | ||
| 182 | -#ifdef USE_OPENSSL | ||
| 183 | std::memset(dest, 0, length); | ||
| 184 | |||
| 185 | - const BIGNUM *pub_key; | ||
| 186 | - | ||
| 187 | -#ifdef USE_OPENSSL_1_1 | ||
| 188 | - DH_get0_key(m_dh, &pub_key, NULL); | ||
| 189 | -#else | ||
| 190 | - pub_key = m_dh->pub_key; | ||
| 191 | -#endif | ||
| 192 | +#ifdef USE_OPENSSL | ||
| 193 | + const BIGNUM *pub_key = dh_get_pub_key(m_dh); | ||
| 194 | |||
| 195 | if ((int)length >= BN_num_bytes(pub_key)) | ||
| 196 | BN_bn2bin(pub_key, dest + length - BN_num_bytes(pub_key)); | ||
| 197 | diff --git a/src/utils/diffie_hellman.h b/src/utils/diffie_hellman.h | ||
| 198 | index 432542be..2cec5bee 100644 | ||
| 199 | --- a/src/utils/diffie_hellman.h | ||
| 200 | +++ b/src/utils/diffie_hellman.h | ||
| 201 | @@ -1,79 +1,38 @@ | ||
| 202 | -// libTorrent - BitTorrent library | ||
| 203 | -// Copyright (C) 2005-2011, Jari Sundell | ||
| 204 | -// | ||
| 205 | -// This program is free software; you can redistribute it and/or modify | ||
| 206 | -// it under the terms of the GNU General Public License as published by | ||
| 207 | -// the Free Software Foundation; either version 2 of the License, or | ||
| 208 | -// (at your option) any later version. | ||
| 209 | -// | ||
| 210 | -// This program is distributed in the hope that it will be useful, | ||
| 211 | -// but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
| 212 | -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
| 213 | -// GNU General Public License for more details. | ||
| 214 | -// | ||
| 215 | -// You should have received a copy of the GNU General Public License | ||
| 216 | -// along with this program; if not, write to the Free Software | ||
| 217 | -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | ||
| 218 | -// | ||
| 219 | -// In addition, as a special exception, the copyright holders give | ||
| 220 | -// permission to link the code of portions of this program with the | ||
| 221 | -// OpenSSL library under certain conditions as described in each | ||
| 222 | -// individual source file, and distribute linked combinations | ||
| 223 | -// including the two. | ||
| 224 | -// | ||
| 225 | -// You must obey the GNU General Public License in all respects for | ||
| 226 | -// all of the code used other than OpenSSL. If you modify file(s) | ||
| 227 | -// with this exception, you may extend this exception to your version | ||
| 228 | -// of the file(s), but you are not obligated to do so. If you do not | ||
| 229 | -// wish to do so, delete this exception statement from your version. | ||
| 230 | -// If you delete this exception statement from all source files in the | ||
| 231 | -// program, then also delete it here. | ||
| 232 | -// | ||
| 233 | -// Contact: Jari Sundell <jaris@ifi.uio.no> | ||
| 234 | -// | ||
| 235 | -// Skomakerveien 33 | ||
| 236 | -// 3185 Skoppum, NORWAY | ||
| 237 | - | ||
| 238 | #ifndef LIBTORRENT_DIFFIE_HELLMAN_H | ||
| 239 | #define LIBTORRENT_DIFFIE_HELLMAN_H | ||
| 240 | |||
| 241 | #include "config.h" | ||
| 242 | |||
| 243 | +#include <memory> | ||
| 244 | #include <string> | ||
| 245 | |||
| 246 | -#ifdef USE_OPENSSL | ||
| 247 | -#include <openssl/dh.h> | ||
| 248 | -#endif | ||
| 249 | - | ||
| 250 | namespace torrent { | ||
| 251 | |||
| 252 | class DiffieHellman { | ||
| 253 | public: | ||
| 254 | + typedef std::unique_ptr<char[]> secret_ptr; | ||
| 255 | + typedef std::unique_ptr<void, void (*)(void*)> dh_ptr; | ||
| 256 | + | ||
| 257 | DiffieHellman(const unsigned char prime[], int primeLength, | ||
| 258 | const unsigned char generator[], int generatorLength); | ||
| 259 | - ~DiffieHellman(); | ||
| 260 | |||
| 261 | - bool compute_secret(const unsigned char pubkey[], unsigned int length); | ||
| 262 | - void store_pub_key(unsigned char* dest, unsigned int length); | ||
| 263 | + bool is_valid() const; | ||
| 264 | |||
| 265 | - bool is_valid() const; | ||
| 266 | + bool compute_secret(const unsigned char pubkey[], unsigned int length); | ||
| 267 | + void store_pub_key(unsigned char* dest, unsigned int length); | ||
| 268 | |||
| 269 | - unsigned int size() const { return m_size; } | ||
| 270 | + unsigned int size() const { return m_size; } | ||
| 271 | |||
| 272 | - const char* c_str() const { return m_secret; } | ||
| 273 | - std::string secret_str() const { return std::string(m_secret, m_size); } | ||
| 274 | + const char* c_str() const { return m_secret.get(); } | ||
| 275 | + std::string secret_str() const { return std::string(m_secret.get(), m_size); } | ||
| 276 | |||
| 277 | private: | ||
| 278 | DiffieHellman(const DiffieHellman& dh); | ||
| 279 | DiffieHellman& operator = (const DiffieHellman& dh); | ||
| 280 | |||
| 281 | -#ifdef USE_OPENSSL | ||
| 282 | - DH* m_dh; | ||
| 283 | -#else | ||
| 284 | - void* m_void; | ||
| 285 | -#endif | ||
| 286 | - char* m_secret; | ||
| 287 | - unsigned int m_size; | ||
| 288 | + dh_ptr m_dh; | ||
| 289 | + secret_ptr m_secret; | ||
| 290 | + int m_size; | ||
| 291 | }; | ||
| 292 | |||
| 293 | }; | ||
diff --git a/meta-oe/recipes-connectivity/libtorrent/libtorrent/0022-Increased-max-timeout-for-tracker-requests.patch b/meta-oe/recipes-connectivity/libtorrent/libtorrent/0022-Increased-max-timeout-for-tracker-requests.patch new file mode 100644 index 0000000000..66f43f0ce5 --- /dev/null +++ b/meta-oe/recipes-connectivity/libtorrent/libtorrent/0022-Increased-max-timeout-for-tracker-requests.patch | |||
| @@ -0,0 +1,64 @@ | |||
| 1 | From 660bbc17e32c518c2727607ee5b73039c7109207 Mon Sep 17 00:00:00 2001 | ||
| 2 | From: rakshasa <sundell.software@gmail.com> | ||
| 3 | Date: Sat, 13 Jul 2019 00:07:43 +0200 | ||
| 4 | Subject: [PATCH] Increased max timeout for tracker requests. | ||
| 5 | |||
| 6 | --- | ||
| 7 | src/torrent/tracker.h | 40 ++-------------------------------------- | ||
| 8 | 1 file changed, 2 insertions(+), 38 deletions(-) | ||
| 9 | |||
| 10 | diff --git a/src/torrent/tracker.h b/src/torrent/tracker.h | ||
| 11 | index 2b00ad47..a528ef6a 100644 | ||
| 12 | --- a/src/torrent/tracker.h | ||
| 13 | +++ b/src/torrent/tracker.h | ||
| 14 | @@ -1,39 +1,3 @@ | ||
| 15 | -// libTorrent - BitTorrent library | ||
| 16 | -// Copyright (C) 2005-2011, Jari Sundell | ||
| 17 | -// | ||
| 18 | -// This program is free software; you can redistribute it and/or modify | ||
| 19 | -// it under the terms of the GNU General Public License as published by | ||
| 20 | -// the Free Software Foundation; either version 2 of the License, or | ||
| 21 | -// (at your option) any later version. | ||
| 22 | -// | ||
| 23 | -// This program is distributed in the hope that it will be useful, | ||
| 24 | -// but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
| 25 | -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
| 26 | -// GNU General Public License for more details. | ||
| 27 | -// | ||
| 28 | -// You should have received a copy of the GNU General Public License | ||
| 29 | -// along with this program; if not, write to the Free Software | ||
| 30 | -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | ||
| 31 | -// | ||
| 32 | -// In addition, as a special exception, the copyright holders give | ||
| 33 | -// permission to link the code of portions of this program with the | ||
| 34 | -// OpenSSL library under certain conditions as described in each | ||
| 35 | -// individual source file, and distribute linked combinations | ||
| 36 | -// including the two. | ||
| 37 | -// | ||
| 38 | -// You must obey the GNU General Public License in all respects for | ||
| 39 | -// all of the code used other than OpenSSL. If you modify file(s) | ||
| 40 | -// with this exception, you may extend this exception to your version | ||
| 41 | -// of the file(s), but you are not obligated to do so. If you do not | ||
| 42 | -// wish to do so, delete this exception statement from your version. | ||
| 43 | -// If you delete this exception statement from all source files in the | ||
| 44 | -// program, then also delete it here. | ||
| 45 | -// | ||
| 46 | -// Contact: Jari Sundell <jaris@ifi.uio.no> | ||
| 47 | -// | ||
| 48 | -// Skomakerveien 33 | ||
| 49 | -// 3185 Skoppum, NORWAY | ||
| 50 | - | ||
| 51 | #ifndef LIBTORRENT_TRACKER_H | ||
| 52 | #define LIBTORRENT_TRACKER_H | ||
| 53 | |||
| 54 | @@ -148,8 +112,8 @@ protected: | ||
| 55 | |||
| 56 | void set_group(uint32_t v) { m_group = v; } | ||
| 57 | |||
| 58 | - void set_normal_interval(int v) { m_normal_interval = std::min(std::max(600, v), 3600); } | ||
| 59 | - void set_min_interval(int v) { m_min_interval = std::min(std::max(300, v), 1800); } | ||
| 60 | + void set_normal_interval(int v) { m_normal_interval = std::min(std::max(600, v), 8 * 3600); } | ||
| 61 | + void set_min_interval(int v) { m_min_interval = std::min(std::max(300, v), 4 * 3600); } | ||
| 62 | |||
| 63 | int m_flags; | ||
| 64 | |||
diff --git a/meta-oe/recipes-connectivity/libtorrent/libtorrent/0023-Close-log-files-when-reusing-a-name.patch b/meta-oe/recipes-connectivity/libtorrent/libtorrent/0023-Close-log-files-when-reusing-a-name.patch new file mode 100644 index 0000000000..885b1828d1 --- /dev/null +++ b/meta-oe/recipes-connectivity/libtorrent/libtorrent/0023-Close-log-files-when-reusing-a-name.patch | |||
| @@ -0,0 +1,123 @@ | |||
| 1 | From efc75948253c1a8db482daabf45d9eabaaf4b099 Mon Sep 17 00:00:00 2001 | ||
| 2 | From: rakshasa <sundell.software@gmail.com> | ||
| 3 | Date: Wed, 17 Jul 2019 19:41:04 +0200 | ||
| 4 | Subject: [PATCH] Close log files when reusing a name. | ||
| 5 | |||
| 6 | --- | ||
| 7 | src/torrent/utils/log.cc | 20 ++++++++++++++++---- | ||
| 8 | src/torrent/utils/log.h | 7 +++++++ | ||
| 9 | test/torrent/tracker_timeout_test.cc | 8 ++++---- | ||
| 10 | test/torrent/utils/log_test.cc | 12 ++++++------ | ||
| 11 | 4 files changed, 33 insertions(+), 14 deletions(-) | ||
| 12 | |||
| 13 | diff --git a/src/torrent/utils/log.cc b/src/torrent/utils/log.cc | ||
| 14 | index 58b563a6..5169a730 100644 | ||
| 15 | --- a/src/torrent/utils/log.cc | ||
| 16 | +++ b/src/torrent/utils/log.cc | ||
| 17 | @@ -294,12 +294,16 @@ log_open_output(const char* name, log_slot slot) { | ||
| 18 | throw input_error("Cannot open more than 64 log output handlers."); | ||
| 19 | } | ||
| 20 | |||
| 21 | - if (log_find_output_name(name) != log_outputs.end()) { | ||
| 22 | - pthread_mutex_unlock(&log_mutex); | ||
| 23 | - throw input_error("Log name already used."); | ||
| 24 | + log_output_list::iterator itr = log_find_output_name(name); | ||
| 25 | + | ||
| 26 | + if (itr == log_outputs.end()) { | ||
| 27 | + log_outputs.push_back(std::make_pair(name, slot)); | ||
| 28 | + } else { | ||
| 29 | + // by replacing the "write" slot binding, the old file gets closed | ||
| 30 | + // (handles are shared pointers) | ||
| 31 | + itr->second = slot; | ||
| 32 | } | ||
| 33 | |||
| 34 | - log_outputs.push_back(std::make_pair(name, slot)); | ||
| 35 | log_rebuild_cache(); | ||
| 36 | |||
| 37 | pthread_mutex_unlock(&log_mutex); | ||
| 38 | @@ -307,6 +311,14 @@ log_open_output(const char* name, log_slot slot) { | ||
| 39 | |||
| 40 | void | ||
| 41 | log_close_output(const char* name) { | ||
| 42 | + pthread_mutex_lock(&log_mutex); | ||
| 43 | + | ||
| 44 | + log_output_list::iterator itr = log_find_output_name(name); | ||
| 45 | + | ||
| 46 | + if (itr != log_outputs.end()) | ||
| 47 | + log_outputs.erase(itr); | ||
| 48 | + | ||
| 49 | + pthread_mutex_unlock(&log_mutex); | ||
| 50 | } | ||
| 51 | |||
| 52 | void | ||
| 53 | diff --git a/src/torrent/utils/log.h b/src/torrent/utils/log.h | ||
| 54 | index a053d6ec..430bda5e 100644 | ||
| 55 | --- a/src/torrent/utils/log.h | ||
| 56 | +++ b/src/torrent/utils/log.h | ||
| 57 | @@ -229,6 +229,7 @@ void log_cleanup() LIBTORRENT_EXPORT; | ||
| 58 | |||
| 59 | void log_open_output(const char* name, log_slot slot) LIBTORRENT_EXPORT; | ||
| 60 | void log_close_output(const char* name) LIBTORRENT_EXPORT; | ||
| 61 | +void log_close_output_str(const std::string name) LIBTORRENT_EXPORT; | ||
| 62 | |||
| 63 | void log_add_group_output(int group, const char* name) LIBTORRENT_EXPORT; | ||
| 64 | void log_remove_group_output(int group, const char* name) LIBTORRENT_EXPORT; | ||
| 65 | @@ -240,6 +241,12 @@ void log_open_file_output(const char* name, const char* filename) LIBTORR | ||
| 66 | void log_open_gz_file_output(const char* name, const char* filename) LIBTORRENT_EXPORT; | ||
| 67 | log_buffer* log_open_log_buffer(const char* name) LIBTORRENT_EXPORT; | ||
| 68 | |||
| 69 | +// | ||
| 70 | +// Implementation: | ||
| 71 | +// | ||
| 72 | + | ||
| 73 | +inline void log_close_output_str(const std::string name) { log_close_output(name.c_str()); } | ||
| 74 | + | ||
| 75 | } | ||
| 76 | |||
| 77 | #endif | ||
| 78 | diff --git a/test/torrent/tracker_timeout_test.cc b/test/torrent/tracker_timeout_test.cc | ||
| 79 | index 081b9301..cd060006 100644 | ||
| 80 | --- a/test/torrent/tracker_timeout_test.cc | ||
| 81 | +++ b/test/torrent/tracker_timeout_test.cc | ||
| 82 | @@ -29,13 +29,13 @@ tracker_timeout_test::test_set_timeout() { | ||
| 83 | |||
| 84 | tracker.set_new_normal_interval(100); | ||
| 85 | CPPUNIT_ASSERT(tracker.normal_interval() == 600); | ||
| 86 | - tracker.set_new_normal_interval(4000); | ||
| 87 | - CPPUNIT_ASSERT(tracker.normal_interval() == 3600); | ||
| 88 | + tracker.set_new_normal_interval(8 * 4000); | ||
| 89 | + CPPUNIT_ASSERT(tracker.normal_interval() == 8 * 3600); | ||
| 90 | |||
| 91 | tracker.set_new_min_interval(100); | ||
| 92 | CPPUNIT_ASSERT(tracker.min_interval() == 300); | ||
| 93 | - tracker.set_new_min_interval(4000); | ||
| 94 | - CPPUNIT_ASSERT(tracker.min_interval() == 1800); | ||
| 95 | + tracker.set_new_min_interval(4 * 4000); | ||
| 96 | + CPPUNIT_ASSERT(tracker.min_interval() == 4 * 3600); | ||
| 97 | } | ||
| 98 | |||
| 99 | void | ||
| 100 | diff --git a/test/torrent/utils/log_test.cc b/test/torrent/utils/log_test.cc | ||
| 101 | index 9b99c245..24c22b59 100644 | ||
| 102 | --- a/test/torrent/utils/log_test.cc | ||
| 103 | +++ b/test/torrent/utils/log_test.cc | ||
| 104 | @@ -75,13 +75,13 @@ utils_log_test::test_output_open() { | ||
| 105 | // Test inserting duplicate names, should catch. | ||
| 106 | // CPPUNIT_ASSERT_THROW(torrent::log_open_output("test_output_1", torrent::log_slot());, torrent::input_error); | ||
| 107 | |||
| 108 | - try { | ||
| 109 | - torrent::log_open_output("test_output_1", torrent::log_slot()); | ||
| 110 | - } catch (torrent::input_error& e) { | ||
| 111 | - return; | ||
| 112 | - } | ||
| 113 | + // try { | ||
| 114 | + // torrent::log_open_output("test_output_1", torrent::log_slot()); | ||
| 115 | + // } catch (torrent::input_error& e) { | ||
| 116 | + // return; | ||
| 117 | + // } | ||
| 118 | |||
| 119 | - CPPUNIT_ASSERT(false); | ||
| 120 | + // CPPUNIT_ASSERT(false); | ||
| 121 | |||
| 122 | // Test more than 64 entries. | ||
| 123 | } | ||
diff --git a/meta-oe/recipes-connectivity/libtorrent/libtorrent/0024-Bumped-to-version-0.13.8.patch b/meta-oe/recipes-connectivity/libtorrent/libtorrent/0024-Bumped-to-version-0.13.8.patch new file mode 100644 index 0000000000..ffe6b3f22e --- /dev/null +++ b/meta-oe/recipes-connectivity/libtorrent/libtorrent/0024-Bumped-to-version-0.13.8.patch | |||
| @@ -0,0 +1,30 @@ | |||
| 1 | From 7faa9c58ce098bbdeff83b6add72f3075b47881d Mon Sep 17 00:00:00 2001 | ||
| 2 | From: rakshasa <sundell.software@gmail.com> | ||
| 3 | Date: Fri, 19 Jul 2019 13:38:12 +0200 | ||
| 4 | Subject: [PATCH] Bumped to version 0.13.8. | ||
| 5 | |||
| 6 | --- | ||
| 7 | configure.ac | 8 ++++---- | ||
| 8 | 1 file changed, 4 insertions(+), 4 deletions(-) | ||
| 9 | |||
| 10 | diff --git a/configure.ac b/configure.ac | ||
| 11 | index b885714d..4ed08124 100644 | ||
| 12 | --- a/configure.ac | ||
| 13 | +++ b/configure.ac | ||
| 14 | @@ -1,12 +1,12 @@ | ||
| 15 | -AC_INIT(libtorrent, 0.13.7, sundell.software@gmail.com) | ||
| 16 | +AC_INIT(libtorrent, 0.13.8, sundell.software@gmail.com) | ||
| 17 | |||
| 18 | LT_INIT([disable-static]) | ||
| 19 | |||
| 20 | dnl Find a better way to do this | ||
| 21 | -AC_DEFINE(PEER_NAME, "-lt0D70-", Identifier that is part of the default peer id) | ||
| 22 | -AC_DEFINE(PEER_VERSION, "lt\x0D\x70", 4 byte client and version identifier for DHT) | ||
| 23 | +AC_DEFINE(PEER_NAME, "-lt0D80-", Identifier that is part of the default peer id) | ||
| 24 | +AC_DEFINE(PEER_VERSION, "lt\x0D\x80", 4 byte client and version identifier for DHT) | ||
| 25 | |||
| 26 | -LIBTORRENT_CURRENT=20 | ||
| 27 | +LIBTORRENT_CURRENT=21 | ||
| 28 | LIBTORRENT_REVISION=0 | ||
| 29 | LIBTORRENT_AGE=0 | ||
| 30 | |||
diff --git a/meta-oe/recipes-connectivity/libtorrent/libtorrent/0025-Allow-logs-to-be-appended-rather-than-overwritten.patch b/meta-oe/recipes-connectivity/libtorrent/libtorrent/0025-Allow-logs-to-be-appended-rather-than-overwritten.patch new file mode 100644 index 0000000000..c8884d856d --- /dev/null +++ b/meta-oe/recipes-connectivity/libtorrent/libtorrent/0025-Allow-logs-to-be-appended-rather-than-overwritten.patch | |||
| @@ -0,0 +1,109 @@ | |||
| 1 | From 7667094274879fe158e718bf2765d35f82d924bd Mon Sep 17 00:00:00 2001 | ||
| 2 | From: nicholi <nschell@gmail.com> | ||
| 3 | Date: Tue, 23 Jul 2019 23:59:16 -0700 | ||
| 4 | Subject: [PATCH] Allow logs to be appended rather than overwritten. | ||
| 5 | |||
| 6 | --- | ||
| 7 | src/torrent/utils/log.cc | 13 +++++++++++++ | ||
| 8 | src/torrent/utils/log.h | 1 + | ||
| 9 | test/torrent/utils/log_test.cc | 35 ++++++++++++++++++++++++++++++++++ | ||
| 10 | test/torrent/utils/log_test.h | 2 ++ | ||
| 11 | 4 files changed, 51 insertions(+) | ||
| 12 | |||
| 13 | diff --git a/src/torrent/utils/log.cc b/src/torrent/utils/log.cc | ||
| 14 | index 5169a730..a900c109 100644 | ||
| 15 | --- a/src/torrent/utils/log.cc | ||
| 16 | +++ b/src/torrent/utils/log.cc | ||
| 17 | @@ -428,6 +428,19 @@ log_open_file_output(const char* name, const char* filename) { | ||
| 18 | std::placeholders::_3)); | ||
| 19 | } | ||
| 20 | |||
| 21 | +void | ||
| 22 | +log_open_file_output_append(const char* name, const char* filename) { | ||
| 23 | + std::shared_ptr<std::ofstream> outfile(new std::ofstream(filename, std::ofstream::out | std::ofstream::app)); | ||
| 24 | + | ||
| 25 | + if (!outfile->good()) | ||
| 26 | + throw input_error("Could not open log file '" + std::string(filename) + "'."); | ||
| 27 | + | ||
| 28 | + log_open_output(name, std::bind(&log_file_write, outfile, | ||
| 29 | + std::placeholders::_1, | ||
| 30 | + std::placeholders::_2, | ||
| 31 | + std::placeholders::_3)); | ||
| 32 | +} | ||
| 33 | + | ||
| 34 | void | ||
| 35 | log_open_gz_file_output(const char* name, const char* filename) { | ||
| 36 | std::shared_ptr<log_gz_output> outfile(new log_gz_output(filename)); | ||
| 37 | diff --git a/src/torrent/utils/log.h b/src/torrent/utils/log.h | ||
| 38 | index 430bda5e..531c8565 100644 | ||
| 39 | --- a/src/torrent/utils/log.h | ||
| 40 | +++ b/src/torrent/utils/log.h | ||
| 41 | @@ -238,6 +238,7 @@ void log_add_child(int group, int child) LIBTORRENT_EXPORT; | ||
| 42 | void log_remove_child(int group, int child) LIBTORRENT_EXPORT; | ||
| 43 | |||
| 44 | void log_open_file_output(const char* name, const char* filename) LIBTORRENT_EXPORT; | ||
| 45 | +void log_open_file_output_append(const char* name, const char* filename) LIBTORRENT_EXPORT; | ||
| 46 | void log_open_gz_file_output(const char* name, const char* filename) LIBTORRENT_EXPORT; | ||
| 47 | log_buffer* log_open_log_buffer(const char* name) LIBTORRENT_EXPORT; | ||
| 48 | |||
| 49 | diff --git a/test/torrent/utils/log_test.cc b/test/torrent/utils/log_test.cc | ||
| 50 | index 24c22b59..aa13fff8 100644 | ||
| 51 | --- a/test/torrent/utils/log_test.cc | ||
| 52 | +++ b/test/torrent/utils/log_test.cc | ||
| 53 | @@ -155,3 +155,38 @@ utils_log_test::test_file_output() { | ||
| 54 | |||
| 55 | CPPUNIT_ASSERT_MESSAGE(buffer, std::string(buffer).find("test_file") != std::string::npos); | ||
| 56 | } | ||
| 57 | + | ||
| 58 | +void | ||
| 59 | +utils_log_test::test_file_output_append() { | ||
| 60 | + std::string filename = "utils_log_test.XXXXXX"; | ||
| 61 | + | ||
| 62 | + mktemp(&*filename.begin()); | ||
| 63 | + | ||
| 64 | + torrent::log_open_file_output_append("test_file", filename.c_str()); | ||
| 65 | + torrent::log_add_group_output(GROUP_PARENT_1, "test_file"); | ||
| 66 | + | ||
| 67 | + lt_log_print(GROUP_PARENT_1, "test_line_1"); | ||
| 68 | + | ||
| 69 | + torrent::log_cleanup(); // To ensure we flush the buffers. | ||
| 70 | + | ||
| 71 | + // re-open and write 2nd line | ||
| 72 | + torrent::log_open_file_output_append("test_file", filename.c_str()); | ||
| 73 | + torrent::log_add_group_output(GROUP_PARENT_1, "test_file"); | ||
| 74 | + | ||
| 75 | + lt_log_print(GROUP_PARENT_1, "test_line_2"); | ||
| 76 | + | ||
| 77 | + torrent::log_cleanup(); // To ensure we flush the buffers. | ||
| 78 | + | ||
| 79 | + std::ifstream temp_file(filename.c_str()); | ||
| 80 | + | ||
| 81 | + CPPUNIT_ASSERT(temp_file.good()); | ||
| 82 | + | ||
| 83 | + char buffer_line1[256]; | ||
| 84 | + temp_file.getline(buffer_line1, 256); | ||
| 85 | + | ||
| 86 | + char buffer_line2[256]; | ||
| 87 | + temp_file.getline(buffer_line2, 256); | ||
| 88 | + | ||
| 89 | + CPPUNIT_ASSERT_MESSAGE(buffer_line1, std::string(buffer_line1).find("test_line_1") != std::string::npos); | ||
| 90 | + CPPUNIT_ASSERT_MESSAGE(buffer_line2, std::string(buffer_line2).find("test_line_2") != std::string::npos); | ||
| 91 | +} | ||
| 92 | diff --git a/test/torrent/utils/log_test.h b/test/torrent/utils/log_test.h | ||
| 93 | index 3a66cc24..d4cb3bc6 100644 | ||
| 94 | --- a/test/torrent/utils/log_test.h | ||
| 95 | +++ b/test/torrent/utils/log_test.h | ||
| 96 | @@ -10,6 +10,7 @@ class utils_log_test : public CppUnit::TestFixture { | ||
| 97 | CPPUNIT_TEST(test_print); | ||
| 98 | CPPUNIT_TEST(test_children); | ||
| 99 | CPPUNIT_TEST(test_file_output); | ||
| 100 | + CPPUNIT_TEST(test_file_output_append); | ||
| 101 | CPPUNIT_TEST_SUITE_END(); | ||
| 102 | |||
| 103 | public: | ||
| 104 | @@ -22,4 +23,5 @@ public: | ||
| 105 | void test_print(); | ||
| 106 | void test_children(); | ||
| 107 | void test_file_output(); | ||
| 108 | + void test_file_output_append(); | ||
| 109 | }; | ||
diff --git a/meta-oe/recipes-connectivity/libtorrent/libtorrent/0026-Removed-log-append-function.-Added-append-parameter-.patch b/meta-oe/recipes-connectivity/libtorrent/libtorrent/0026-Removed-log-append-function.-Added-append-parameter-.patch new file mode 100644 index 0000000000..9859f954c9 --- /dev/null +++ b/meta-oe/recipes-connectivity/libtorrent/libtorrent/0026-Removed-log-append-function.-Added-append-parameter-.patch | |||
| @@ -0,0 +1,101 @@ | |||
| 1 | From df54913c34c8b584d6d2072a65ad1590766780c5 Mon Sep 17 00:00:00 2001 | ||
| 2 | From: nicholi <nschell@gmail.com> | ||
| 3 | Date: Fri, 26 Jul 2019 00:50:52 -0700 | ||
| 4 | Subject: [PATCH] Removed log append function. Added append parameter with | ||
| 5 | default value (false) to log_open_file functions. | ||
| 6 | |||
| 7 | --- | ||
| 8 | src/torrent/utils/log.cc | 26 ++++++++------------------ | ||
| 9 | src/torrent/utils/log.h | 5 ++--- | ||
| 10 | test/torrent/utils/log_test.cc | 4 ++-- | ||
| 11 | 3 files changed, 12 insertions(+), 23 deletions(-) | ||
| 12 | |||
| 13 | diff --git a/src/torrent/utils/log.cc b/src/torrent/utils/log.cc | ||
| 14 | index a900c109..6c605474 100644 | ||
| 15 | --- a/src/torrent/utils/log.cc | ||
| 16 | +++ b/src/torrent/utils/log.cc | ||
| 17 | @@ -73,7 +73,7 @@ struct log_cache_entry { | ||
| 18 | }; | ||
| 19 | |||
| 20 | struct log_gz_output { | ||
| 21 | - log_gz_output(const char* filename) { gz_file = gzopen(filename, "w"); } | ||
| 22 | + log_gz_output(const char* filename, bool append) { gz_file = gzopen(filename, append ? "a" : "w"); } | ||
| 23 | ~log_gz_output() { if (gz_file != NULL) gzclose(gz_file); } | ||
| 24 | |||
| 25 | bool is_valid() { return gz_file != Z_NULL; } | ||
| 26 | @@ -416,8 +416,11 @@ log_gz_file_write(std::shared_ptr<log_gz_output>& outfile, const char* data, siz | ||
| 27 | } | ||
| 28 | |||
| 29 | void | ||
| 30 | -log_open_file_output(const char* name, const char* filename) { | ||
| 31 | - std::shared_ptr<std::ofstream> outfile(new std::ofstream(filename)); | ||
| 32 | +log_open_file_output(const char* name, const char* filename, bool append) { | ||
| 33 | + std::ios_base::openmode mode = std::ofstream::out; | ||
| 34 | + if (append) | ||
| 35 | + mode |= std::ofstream::app; | ||
| 36 | + std::shared_ptr<std::ofstream> outfile(new std::ofstream(filename, mode)); | ||
| 37 | |||
| 38 | if (!outfile->good()) | ||
| 39 | throw input_error("Could not open log file '" + std::string(filename) + "'."); | ||
| 40 | @@ -429,21 +432,8 @@ log_open_file_output(const char* name, const char* filename) { | ||
| 41 | } | ||
| 42 | |||
| 43 | void | ||
| 44 | -log_open_file_output_append(const char* name, const char* filename) { | ||
| 45 | - std::shared_ptr<std::ofstream> outfile(new std::ofstream(filename, std::ofstream::out | std::ofstream::app)); | ||
| 46 | - | ||
| 47 | - if (!outfile->good()) | ||
| 48 | - throw input_error("Could not open log file '" + std::string(filename) + "'."); | ||
| 49 | - | ||
| 50 | - log_open_output(name, std::bind(&log_file_write, outfile, | ||
| 51 | - std::placeholders::_1, | ||
| 52 | - std::placeholders::_2, | ||
| 53 | - std::placeholders::_3)); | ||
| 54 | -} | ||
| 55 | - | ||
| 56 | -void | ||
| 57 | -log_open_gz_file_output(const char* name, const char* filename) { | ||
| 58 | - std::shared_ptr<log_gz_output> outfile(new log_gz_output(filename)); | ||
| 59 | +log_open_gz_file_output(const char* name, const char* filename, bool append) { | ||
| 60 | + std::shared_ptr<log_gz_output> outfile(new log_gz_output(filename, append)); | ||
| 61 | |||
| 62 | if (!outfile->is_valid()) | ||
| 63 | throw input_error("Could not open log gzip file '" + std::string(filename) + "'."); | ||
| 64 | diff --git a/src/torrent/utils/log.h b/src/torrent/utils/log.h | ||
| 65 | index 531c8565..0dfdc86b 100644 | ||
| 66 | --- a/src/torrent/utils/log.h | ||
| 67 | +++ b/src/torrent/utils/log.h | ||
| 68 | @@ -237,9 +237,8 @@ void log_remove_group_output(int group, const char* name) LIBTORRENT_EXPORT; | ||
| 69 | void log_add_child(int group, int child) LIBTORRENT_EXPORT; | ||
| 70 | void log_remove_child(int group, int child) LIBTORRENT_EXPORT; | ||
| 71 | |||
| 72 | -void log_open_file_output(const char* name, const char* filename) LIBTORRENT_EXPORT; | ||
| 73 | -void log_open_file_output_append(const char* name, const char* filename) LIBTORRENT_EXPORT; | ||
| 74 | -void log_open_gz_file_output(const char* name, const char* filename) LIBTORRENT_EXPORT; | ||
| 75 | +void log_open_file_output(const char* name, const char* filename, bool append = false) LIBTORRENT_EXPORT; | ||
| 76 | +void log_open_gz_file_output(const char* name, const char* filename, bool append = false) LIBTORRENT_EXPORT; | ||
| 77 | log_buffer* log_open_log_buffer(const char* name) LIBTORRENT_EXPORT; | ||
| 78 | |||
| 79 | // | ||
| 80 | diff --git a/test/torrent/utils/log_test.cc b/test/torrent/utils/log_test.cc | ||
| 81 | index aa13fff8..9f975636 100644 | ||
| 82 | --- a/test/torrent/utils/log_test.cc | ||
| 83 | +++ b/test/torrent/utils/log_test.cc | ||
| 84 | @@ -162,7 +162,7 @@ utils_log_test::test_file_output_append() { | ||
| 85 | |||
| 86 | mktemp(&*filename.begin()); | ||
| 87 | |||
| 88 | - torrent::log_open_file_output_append("test_file", filename.c_str()); | ||
| 89 | + torrent::log_open_file_output("test_file", filename.c_str(), false); | ||
| 90 | torrent::log_add_group_output(GROUP_PARENT_1, "test_file"); | ||
| 91 | |||
| 92 | lt_log_print(GROUP_PARENT_1, "test_line_1"); | ||
| 93 | @@ -170,7 +170,7 @@ utils_log_test::test_file_output_append() { | ||
| 94 | torrent::log_cleanup(); // To ensure we flush the buffers. | ||
| 95 | |||
| 96 | // re-open and write 2nd line | ||
| 97 | - torrent::log_open_file_output_append("test_file", filename.c_str()); | ||
| 98 | + torrent::log_open_file_output("test_file", filename.c_str(), true); | ||
| 99 | torrent::log_add_group_output(GROUP_PARENT_1, "test_file"); | ||
| 100 | |||
| 101 | lt_log_print(GROUP_PARENT_1, "test_line_2"); | ||
diff --git a/meta-oe/recipes-connectivity/libtorrent/libtorrent/0027-Backport-changes-from-feature-bind.-200.patch b/meta-oe/recipes-connectivity/libtorrent/libtorrent/0027-Backport-changes-from-feature-bind.-200.patch new file mode 100644 index 0000000000..6b1578bde7 --- /dev/null +++ b/meta-oe/recipes-connectivity/libtorrent/libtorrent/0027-Backport-changes-from-feature-bind.-200.patch | |||
| @@ -0,0 +1,7365 @@ | |||
| 1 | From b0f945e11d6afe43c917b58291c6fbcf5468a908 Mon Sep 17 00:00:00 2001 | ||
| 2 | From: Jari Sundell <sundell.software@gmail.com> | ||
| 3 | Date: Fri, 23 Aug 2019 23:23:48 +0900 | ||
| 4 | Subject: [PATCH] Backport changes from feature-bind. (#200) | ||
| 5 | |||
| 6 | --- | ||
| 7 | .dir-locals.el | 7 + | ||
| 8 | Makefile.am | 1 + | ||
| 9 | configure.ac | 40 +- | ||
| 10 | extra/corrupt_file.cc | 2 +- | ||
| 11 | rak/file_stat.h | 2 +- | ||
| 12 | rak/fs_stat.h | 2 +- | ||
| 13 | rak/partial_queue.h | 2 +- | ||
| 14 | rak/path.h | 2 +- | ||
| 15 | rak/priority_queue_default.h | 2 +- | ||
| 16 | rak/socket_address.h | 49 +- | ||
| 17 | rak/timer.h | 2 +- | ||
| 18 | scripts/checks.m4 | 4 +- | ||
| 19 | scripts/rak_cxx.m4 | 47 -- | ||
| 20 | scripts/ssl.m4 | 38 ++ | ||
| 21 | src/data/chunk_list.cc | 2 - | ||
| 22 | src/data/chunk_list.h | 2 +- | ||
| 23 | src/data/chunk_list_node.h | 2 +- | ||
| 24 | src/data/hash_check_queue.h | 2 +- | ||
| 25 | src/data/hash_queue.cc | 2 - | ||
| 26 | src/data/hash_queue.h | 2 +- | ||
| 27 | src/data/hash_queue_node.h | 4 +- | ||
| 28 | src/data/hash_torrent.cc | 2 - | ||
| 29 | src/data/hash_torrent.h | 4 +- | ||
| 30 | src/data/memory_chunk.h | 2 +- | ||
| 31 | src/data/socket_file.h | 2 +- | ||
| 32 | src/dht/dht_hash_map.h | 57 +- | ||
| 33 | src/download/chunk_selector.h | 2 +- | ||
| 34 | src/download/chunk_statistics.h | 2 +- | ||
| 35 | src/download/delegator.cc | 2 +- | ||
| 36 | src/download/delegator.h | 2 +- | ||
| 37 | src/download/download_constructor.h | 2 +- | ||
| 38 | src/globals.cc | 15 +- | ||
| 39 | src/globals.h | 36 -- | ||
| 40 | src/manager.cc | 36 -- | ||
| 41 | src/net/Makefile.am | 2 + | ||
| 42 | src/net/data_buffer.h | 2 +- | ||
| 43 | src/net/listen.cc | 40 +- | ||
| 44 | src/net/listen.h | 4 +- | ||
| 45 | src/net/protocol_buffer.h | 2 +- | ||
| 46 | src/net/socket_base.h | 2 +- | ||
| 47 | src/net/socket_fd.cc | 10 + | ||
| 48 | src/net/socket_fd.h | 6 + | ||
| 49 | src/net/socket_listen.cc | 137 +++++ | ||
| 50 | src/net/socket_listen.h | 46 ++ | ||
| 51 | src/net/socket_set.h | 2 +- | ||
| 52 | src/net/throttle_node.h | 2 +- | ||
| 53 | src/protocol/handshake.cc | 13 +- | ||
| 54 | src/protocol/handshake_manager.cc | 56 +- | ||
| 55 | src/protocol/handshake_manager.h | 40 +- | ||
| 56 | src/protocol/peer_connection_base.cc | 2 - | ||
| 57 | src/protocol/request_list.cc | 38 +- | ||
| 58 | src/torrent/Makefile.am | 1 + | ||
| 59 | src/torrent/common.h | 5 +- | ||
| 60 | src/torrent/connection_manager.h | 2 +- | ||
| 61 | src/torrent/data/download_data.h | 2 +- | ||
| 62 | src/torrent/data/file_list.cc | 2 - | ||
| 63 | src/torrent/data/transfer_list.h | 3 +- | ||
| 64 | src/torrent/download.cc | 4 +- | ||
| 65 | src/torrent/download/choke_group.cc | 2 +- | ||
| 66 | src/torrent/download/choke_group.h | 2 +- | ||
| 67 | src/torrent/download/choke_queue.cc | 3 +- | ||
| 68 | src/torrent/download/choke_queue.h | 5 +- | ||
| 69 | src/torrent/download/group_entry.h | 3 +- | ||
| 70 | src/torrent/download/resource_manager.cc | 1 - | ||
| 71 | src/torrent/download/resource_manager.h | 2 +- | ||
| 72 | src/torrent/download_info.h | 4 +- | ||
| 73 | src/torrent/error.cc | 6 +- | ||
| 74 | src/torrent/error.h | 7 +- | ||
| 75 | src/torrent/event.cc | 19 + | ||
| 76 | src/torrent/event.h | 82 ++- | ||
| 77 | src/torrent/http.h | 2 +- | ||
| 78 | src/torrent/net/Makefile.am | 18 +- | ||
| 79 | src/torrent/net/address_info.cc | 43 ++ | ||
| 80 | src/torrent/net/address_info.h | 69 +++ | ||
| 81 | src/torrent/net/fd.cc | 209 +++++++ | ||
| 82 | src/torrent/net/fd.h | 63 ++ | ||
| 83 | src/torrent/net/socket_address.cc | 559 ++++++++++++++++++ | ||
| 84 | src/torrent/net/socket_address.h | 229 +++++++ | ||
| 85 | src/torrent/net/socket_address_key.h | 2 +- | ||
| 86 | src/torrent/net/socket_event.cc | 29 + | ||
| 87 | src/torrent/net/socket_event.h | 31 + | ||
| 88 | src/torrent/net/types.h | 33 ++ | ||
| 89 | src/torrent/object.h | 21 +- | ||
| 90 | src/torrent/peer/client_list.cc | 2 +- | ||
| 91 | src/torrent/peer/connection_list.h | 3 +- | ||
| 92 | src/torrent/peer/peer_list.cc | 7 +- | ||
| 93 | src/torrent/poll.h | 3 +- | ||
| 94 | src/torrent/torrent.cc | 42 +- | ||
| 95 | src/torrent/torrent.h | 11 +- | ||
| 96 | src/torrent/tracker.h | 2 +- | ||
| 97 | src/torrent/tracker_controller.h | 3 +- | ||
| 98 | src/torrent/tracker_list.h | 2 +- | ||
| 99 | src/torrent/utils/Makefile.am | 5 +- | ||
| 100 | src/torrent/utils/directory_events.h | 3 +- | ||
| 101 | src/torrent/utils/log.cc | 66 +-- | ||
| 102 | src/torrent/utils/log.h | 98 ++- | ||
| 103 | src/torrent/utils/log_buffer.cc | 55 +- | ||
| 104 | src/torrent/utils/log_buffer.h | 52 +- | ||
| 105 | src/torrent/utils/net.cc | 72 --- | ||
| 106 | src/torrent/utils/net.h | 56 -- | ||
| 107 | src/torrent/utils/option_strings.cc | 63 +- | ||
| 108 | src/torrent/utils/option_strings.h | 7 +- | ||
| 109 | src/torrent/utils/random.cc | 29 + | ||
| 110 | src/torrent/utils/random.h | 15 + | ||
| 111 | src/torrent/utils/ranges.h | 1 - | ||
| 112 | src/torrent/utils/resume.cc | 2 - | ||
| 113 | src/torrent/utils/signal_bitfield.h | 3 +- | ||
| 114 | src/torrent/utils/thread_base.h | 3 +- | ||
| 115 | src/utils/instrumentation.cc | 2 - | ||
| 116 | src/utils/instrumentation.h | 3 +- | ||
| 117 | src/utils/queue_buckets.h | 4 +- | ||
| 118 | src/utils/sha_fast.h | 2 +- | ||
| 119 | test/Makefile.am | 29 +- | ||
| 120 | test/data/hash_check_queue_test.cc | 2 +- | ||
| 121 | test/data/hash_queue_test.cc | 2 +- | ||
| 122 | test/helpers/expect_fd.h | 107 ++++ | ||
| 123 | test/helpers/expect_utils.h | 13 + | ||
| 124 | test/helpers/mock_compare.h | 96 +++ | ||
| 125 | test/helpers/mock_function.cc | 170 ++++++ | ||
| 126 | test/helpers/mock_function.h | 133 +++++ | ||
| 127 | test/helpers/network.h | 182 ++++++ | ||
| 128 | test/helpers/progress_listener.cc | 63 ++ | ||
| 129 | test/helpers/progress_listener.h | 47 ++ | ||
| 130 | test/helpers/test_fixture.cc | 18 + | ||
| 131 | test/helpers/test_fixture.h | 14 + | ||
| 132 | test/helpers/utils.h | 60 ++ | ||
| 133 | test/main.cc | 82 ++- | ||
| 134 | test/net/test_socket_listen.cc | 398 +++++++++++++ | ||
| 135 | test/net/test_socket_listen.h | 44 ++ | ||
| 136 | test/torrent/net/test_address_info.cc | 62 ++ | ||
| 137 | test/torrent/net/test_address_info.h | 19 + | ||
| 138 | test/torrent/net/test_fd.cc | 24 + | ||
| 139 | test/torrent/net/test_fd.h | 12 + | ||
| 140 | test/torrent/net/test_socket_address.cc | 383 ++++++++++++ | ||
| 141 | test/torrent/net/test_socket_address.h | 43 ++ | ||
| 142 | test/torrent/net/test_socket_address_key.cc | 87 --- | ||
| 143 | test/torrent/object_stream_test.cc | 4 +- | ||
| 144 | test/torrent/tracker_controller_features.cc | 2 +- | ||
| 145 | test/torrent/tracker_controller_requesting.cc | 2 +- | ||
| 146 | test/torrent/tracker_controller_test.cc | 2 +- | ||
| 147 | test/torrent/tracker_list_features_test.cc | 2 +- | ||
| 148 | test/torrent/utils/directory_events_test.cc | 4 +- | ||
| 149 | test/torrent/utils/log_buffer_test.h | 17 - | ||
| 150 | test/torrent/utils/log_test.cc | 4 +- | ||
| 151 | test/torrent/utils/net_test.cc | 32 - | ||
| 152 | test/torrent/utils/net_test.h | 15 - | ||
| 153 | test/torrent/utils/option_strings_test.cc | 3 +- | ||
| 154 | test/torrent/utils/test_extents.cc | 2 +- | ||
| 155 | ...{log_buffer_test.cc => test_log_buffer.cc} | 14 +- | ||
| 156 | test/torrent/utils/test_log_buffer.h | 17 + | ||
| 157 | test/torrent/utils/test_uri_parser.cc | 2 +- | ||
| 158 | test/torrent/utils/thread_base_test.cc | 3 +- | ||
| 159 | 152 files changed, 3968 insertions(+), 1110 deletions(-) | ||
| 160 | create mode 100644 .dir-locals.el | ||
| 161 | create mode 100644 scripts/ssl.m4 | ||
| 162 | create mode 100644 src/net/socket_listen.cc | ||
| 163 | create mode 100644 src/net/socket_listen.h | ||
| 164 | create mode 100644 src/torrent/event.cc | ||
| 165 | create mode 100644 src/torrent/net/address_info.cc | ||
| 166 | create mode 100644 src/torrent/net/address_info.h | ||
| 167 | create mode 100644 src/torrent/net/fd.cc | ||
| 168 | create mode 100644 src/torrent/net/fd.h | ||
| 169 | create mode 100644 src/torrent/net/socket_address.cc | ||
| 170 | create mode 100644 src/torrent/net/socket_address.h | ||
| 171 | create mode 100644 src/torrent/net/socket_event.cc | ||
| 172 | create mode 100644 src/torrent/net/socket_event.h | ||
| 173 | create mode 100644 src/torrent/net/types.h | ||
| 174 | delete mode 100644 src/torrent/utils/net.cc | ||
| 175 | delete mode 100644 src/torrent/utils/net.h | ||
| 176 | create mode 100644 src/torrent/utils/random.cc | ||
| 177 | create mode 100644 src/torrent/utils/random.h | ||
| 178 | create mode 100644 test/helpers/expect_fd.h | ||
| 179 | create mode 100644 test/helpers/expect_utils.h | ||
| 180 | create mode 100644 test/helpers/mock_compare.h | ||
| 181 | create mode 100644 test/helpers/mock_function.cc | ||
| 182 | create mode 100644 test/helpers/mock_function.h | ||
| 183 | create mode 100644 test/helpers/network.h | ||
| 184 | create mode 100644 test/helpers/progress_listener.cc | ||
| 185 | create mode 100644 test/helpers/progress_listener.h | ||
| 186 | create mode 100644 test/helpers/test_fixture.cc | ||
| 187 | create mode 100644 test/helpers/test_fixture.h | ||
| 188 | create mode 100644 test/helpers/utils.h | ||
| 189 | create mode 100644 test/net/test_socket_listen.cc | ||
| 190 | create mode 100644 test/net/test_socket_listen.h | ||
| 191 | create mode 100644 test/torrent/net/test_address_info.cc | ||
| 192 | create mode 100644 test/torrent/net/test_address_info.h | ||
| 193 | create mode 100644 test/torrent/net/test_fd.cc | ||
| 194 | create mode 100644 test/torrent/net/test_fd.h | ||
| 195 | create mode 100644 test/torrent/net/test_socket_address.cc | ||
| 196 | create mode 100644 test/torrent/net/test_socket_address.h | ||
| 197 | delete mode 100644 test/torrent/net/test_socket_address_key.cc | ||
| 198 | delete mode 100644 test/torrent/utils/log_buffer_test.h | ||
| 199 | delete mode 100644 test/torrent/utils/net_test.cc | ||
| 200 | delete mode 100644 test/torrent/utils/net_test.h | ||
| 201 | rename test/torrent/utils/{log_buffer_test.cc => test_log_buffer.cc} (86%) | ||
| 202 | create mode 100644 test/torrent/utils/test_log_buffer.h | ||
| 203 | |||
| 204 | diff --git a/.dir-locals.el b/.dir-locals.el | ||
| 205 | new file mode 100644 | ||
| 206 | index 00000000..af1189f2 | ||
| 207 | --- /dev/null | ||
| 208 | +++ b/.dir-locals.el | ||
| 209 | @@ -0,0 +1,7 @@ | ||
| 210 | +;;; Directory Local Variables | ||
| 211 | +;;; For more information see (info "(emacs) Directory Variables") | ||
| 212 | + | ||
| 213 | +((c++-mode | ||
| 214 | + (flycheck-clang-language-standard . "c++11") | ||
| 215 | + (flycheck-gcc-language-standard . "c++11"))) | ||
| 216 | + | ||
| 217 | diff --git a/Makefile.am b/Makefile.am | ||
| 218 | index f175e634..9507b9ea 100644 | ||
| 219 | --- a/Makefile.am | ||
| 220 | +++ b/Makefile.am | ||
| 221 | @@ -8,6 +8,7 @@ EXTRA_DIST= \ | ||
| 222 | scripts/checks.m4 \ | ||
| 223 | scripts/common.m4 \ | ||
| 224 | scripts/attributes.m4 \ | ||
| 225 | + scripts/ssl.m4 \ | ||
| 226 | doc/main.xml \ | ||
| 227 | doc/http.xml \ | ||
| 228 | doc/torrent.xml \ | ||
| 229 | diff --git a/configure.ac b/configure.ac | ||
| 230 | index 4ed08124..620ca552 100644 | ||
| 231 | --- a/configure.ac | ||
| 232 | +++ b/configure.ac | ||
| 233 | @@ -17,7 +17,7 @@ AC_SUBST(LIBTORRENT_CURRENT) | ||
| 234 | AC_SUBST(LIBTORRENT_INTERFACE_VERSION_INFO) | ||
| 235 | AC_SUBST(LIBTORRENT_INTERFACE_VERSION_NO) | ||
| 236 | |||
| 237 | -AM_INIT_AUTOMAKE | ||
| 238 | +AM_INIT_AUTOMAKE([serial-tests]) | ||
| 239 | AC_CONFIG_HEADERS(config.h) | ||
| 240 | |||
| 241 | AC_PROG_CXX | ||
| 242 | @@ -35,7 +35,6 @@ RAK_ENABLE_EXTRA_DEBUG | ||
| 243 | RAK_ENABLE_WERROR | ||
| 244 | |||
| 245 | RAK_CHECK_CXX11 | ||
| 246 | -RAK_CHECK_TR1_LIB | ||
| 247 | |||
| 248 | AC_SYS_LARGEFILE | ||
| 249 | |||
| 250 | @@ -67,41 +66,8 @@ CFLAGS="$PTHREAD_CFLAGS $CPPUNIT_CFLAGS $CFLAGS" | ||
| 251 | CXXFLAGS="$PTHREAD_CFLAGS $CPPUNIT_CFLAGS $CXXFLAGS" | ||
| 252 | LIBS="$PTHREAD_LIBS $CPPUNIT_LIBS $LIBS" | ||
| 253 | |||
| 254 | -AC_ARG_ENABLE(openssl, | ||
| 255 | - [ --disable-openssl Don't use OpenSSL's SHA1 implementation.], | ||
| 256 | - [ | ||
| 257 | - if test "$enableval" = "yes"; then | ||
| 258 | -dnl move to scripts. | ||
| 259 | - PKG_CHECK_MODULES(OPENSSL, libcrypto, | ||
| 260 | - CXXFLAGS="$CXXFLAGS $OPENSSL_CFLAGS"; | ||
| 261 | - LIBS="$LIBS $OPENSSL_LIBS") | ||
| 262 | - | ||
| 263 | - AC_DEFINE(USE_OPENSSL, 1, Using OpenSSL.) | ||
| 264 | - AC_DEFINE(USE_OPENSSL_SHA, 1, Using OpenSSL's SHA1 implementation.) | ||
| 265 | - AC_CHECK_LIB([crypto], [DH_set0_pqg], [AC_DEFINE(USE_OPENSSL_1_1, 1, Using OpenSSL 1.1.)]) | ||
| 266 | - | ||
| 267 | - else | ||
| 268 | - AC_DEFINE(USE_NSS_SHA, 1, Using Mozilla's SHA1 implementation.) | ||
| 269 | - fi | ||
| 270 | - ],[ | ||
| 271 | - PKG_CHECK_MODULES(OPENSSL, libcrypto, | ||
| 272 | - CXXFLAGS="$CXXFLAGS $OPENSSL_CFLAGS"; | ||
| 273 | - LIBS="$LIBS $OPENSSL_LIBS") | ||
| 274 | - | ||
| 275 | - AC_DEFINE(USE_OPENSSL, 1, Using OpenSSL.) | ||
| 276 | - AC_DEFINE(USE_OPENSSL_SHA, 1, Using OpenSSL's SHA1 implementation.) | ||
| 277 | - AC_CHECK_LIB([crypto], [DH_set0_pqg], [AC_DEFINE(USE_OPENSSL_1_1, 1, Using OpenSSL 1.1.)]) | ||
| 278 | - ] | ||
| 279 | -) | ||
| 280 | - | ||
| 281 | -AC_ARG_ENABLE(cyrus-rc4, | ||
| 282 | - [ --enable-cyrus-rc4=PFX Use Cyrus RC4 implementation.], | ||
| 283 | - [ | ||
| 284 | - CXXFLAGS="$CXXFLAGS -I${enableval}/include"; | ||
| 285 | - LIBS="$LIBS -lrc4 -L${enableval}/lib" | ||
| 286 | - AC_DEFINE(USE_CYRUS_RC4, 1, Using Cyrus RC4 implementation.) | ||
| 287 | - ] | ||
| 288 | -) | ||
| 289 | +TORRENT_ARG_OPENSSL | ||
| 290 | +TORRENT_ARG_CYRUS_RC4 | ||
| 291 | |||
| 292 | AC_CHECK_FUNCS(posix_memalign) | ||
| 293 | |||
| 294 | diff --git a/extra/corrupt_file.cc b/extra/corrupt_file.cc | ||
| 295 | index 2a818cc7..7ae906e6 100644 | ||
| 296 | --- a/extra/corrupt_file.cc | ||
| 297 | +++ b/extra/corrupt_file.cc | ||
| 298 | @@ -1,6 +1,6 @@ | ||
| 299 | #include <iostream> | ||
| 300 | #include <stdexcept> | ||
| 301 | -#include <inttypes.h> | ||
| 302 | +#include <cinttypes> | ||
| 303 | #include <stdio.h> | ||
| 304 | #include <stdlib.h> | ||
| 305 | #include <fcntl.h> | ||
| 306 | diff --git a/rak/file_stat.h b/rak/file_stat.h | ||
| 307 | index 5ad45e8f..f1ad8c2b 100644 | ||
| 308 | --- a/rak/file_stat.h | ||
| 309 | +++ b/rak/file_stat.h | ||
| 310 | @@ -38,7 +38,7 @@ | ||
| 311 | #define RAK_FILE_STAT_H | ||
| 312 | |||
| 313 | #include <string> | ||
| 314 | -#include <inttypes.h> | ||
| 315 | +#include <cinttypes> | ||
| 316 | #include <sys/stat.h> | ||
| 317 | |||
| 318 | namespace rak { | ||
| 319 | diff --git a/rak/fs_stat.h b/rak/fs_stat.h | ||
| 320 | index 5e844277..2d73ff1b 100644 | ||
| 321 | --- a/rak/fs_stat.h | ||
| 322 | +++ b/rak/fs_stat.h | ||
| 323 | @@ -38,7 +38,7 @@ | ||
| 324 | #define RAK_FS_STAT_H | ||
| 325 | |||
| 326 | #include <string> | ||
| 327 | -#include <inttypes.h> | ||
| 328 | +#include <cinttypes> | ||
| 329 | |||
| 330 | #include <rak/error_number.h> | ||
| 331 | |||
| 332 | diff --git a/rak/partial_queue.h b/rak/partial_queue.h | ||
| 333 | index 6650a633..1abfdddf 100644 | ||
| 334 | --- a/rak/partial_queue.h | ||
| 335 | +++ b/rak/partial_queue.h | ||
| 336 | @@ -39,7 +39,7 @@ | ||
| 337 | |||
| 338 | #include <cstring> | ||
| 339 | #include <stdexcept> | ||
| 340 | -#include <inttypes.h> | ||
| 341 | +#include <cinttypes> | ||
| 342 | |||
| 343 | namespace rak { | ||
| 344 | |||
| 345 | diff --git a/rak/path.h b/rak/path.h | ||
| 346 | index bfe8ccc1..64daf355 100644 | ||
| 347 | --- a/rak/path.h | ||
| 348 | +++ b/rak/path.h | ||
| 349 | @@ -99,7 +99,7 @@ path_expand(const char* src, char* first, char* last) { | ||
| 350 | src++; | ||
| 351 | } | ||
| 352 | |||
| 353 | - return std::max(first + strlcpy(first, src, std::distance(first, last)), last); | ||
| 354 | + return std::min(first + strlcpy(first, src, std::distance(first, last)), last); | ||
| 355 | } | ||
| 356 | |||
| 357 | } | ||
| 358 | diff --git a/rak/priority_queue_default.h b/rak/priority_queue_default.h | ||
| 359 | index 01a0070e..a7bba0ce 100644 | ||
| 360 | --- a/rak/priority_queue_default.h | ||
| 361 | +++ b/rak/priority_queue_default.h | ||
| 362 | @@ -37,7 +37,7 @@ | ||
| 363 | #ifndef RAK_PRIORITY_QUEUE_DEFAULT_H | ||
| 364 | #define RAK_PRIORITY_QUEUE_DEFAULT_H | ||
| 365 | |||
| 366 | -#include lt_tr1_functional | ||
| 367 | +#include <functional> | ||
| 368 | #include <rak/allocators.h> | ||
| 369 | #include <rak/priority_queue.h> | ||
| 370 | #include <rak/timer.h> | ||
| 371 | diff --git a/rak/socket_address.h b/rak/socket_address.h | ||
| 372 | index 961c53b2..8eb60116 100644 | ||
| 373 | --- a/rak/socket_address.h | ||
| 374 | +++ b/rak/socket_address.h | ||
| 375 | @@ -47,9 +47,12 @@ | ||
| 376 | #ifndef RAK_SOCKET_ADDRESS_H | ||
| 377 | #define RAK_SOCKET_ADDRESS_H | ||
| 378 | |||
| 379 | +#include <cinttypes> | ||
| 380 | +#include <cstdint> | ||
| 381 | #include <cstring> | ||
| 382 | -#include <string> | ||
| 383 | #include <stdexcept> | ||
| 384 | +#include <string> | ||
| 385 | + | ||
| 386 | #include <arpa/inet.h> | ||
| 387 | #include <netinet/in.h> | ||
| 388 | #include <sys/types.h> | ||
| 389 | @@ -84,7 +87,6 @@ public: | ||
| 390 | |||
| 391 | bool is_valid_inet_class() const { return family() == af_inet || family() == af_inet6; } | ||
| 392 | |||
| 393 | - // Should we need to set AF_UNSPEC? | ||
| 394 | void clear() { std::memset(this, 0, sizeof(socket_address)); set_family(); } | ||
| 395 | |||
| 396 | sa_family_t family() const { return m_sockaddr.sa_family; } | ||
| 397 | @@ -124,6 +126,7 @@ public: | ||
| 398 | // extranous bytes and ensure it does not go beyond the size of this | ||
| 399 | // struct. | ||
| 400 | void copy(const socket_address& src, size_t length); | ||
| 401 | + void copy_sockaddr(const sockaddr* src); | ||
| 402 | |||
| 403 | static socket_address* cast_from(sockaddr* sa) { return reinterpret_cast<socket_address*>(sa); } | ||
| 404 | static const socket_address* cast_from(const sockaddr* sa) { return reinterpret_cast<const socket_address*>(sa); } | ||
| 405 | @@ -220,6 +223,8 @@ public: | ||
| 406 | |||
| 407 | void set_address_any() { set_port(0); set_address(in6addr_any); } | ||
| 408 | |||
| 409 | + std::string pretty_address_str() const; | ||
| 410 | + | ||
| 411 | sa_family_t family() const { return m_sockaddr.sin6_family; } | ||
| 412 | void set_family() { m_sockaddr.sin6_family = AF_INET6; } | ||
| 413 | |||
| 414 | @@ -340,7 +345,7 @@ socket_address::pretty_address_str() const { | ||
| 415 | case af_inet: | ||
| 416 | return sa_inet()->address_str(); | ||
| 417 | case af_inet6: | ||
| 418 | - return sa_inet6()->address_str(); | ||
| 419 | + return sa_inet6()->pretty_address_str(); | ||
| 420 | case af_unspec: | ||
| 421 | return std::string("unspec"); | ||
| 422 | default: | ||
| 423 | @@ -380,13 +385,16 @@ socket_address::length() const { | ||
| 424 | inline void | ||
| 425 | socket_address::copy(const socket_address& src, size_t length) { | ||
| 426 | length = std::min(length, sizeof(socket_address)); | ||
| 427 | - | ||
| 428 | - // Does this get properly optimized? | ||
| 429 | + | ||
| 430 | std::memset(this, 0, sizeof(socket_address)); | ||
| 431 | std::memcpy(this, &src, length); | ||
| 432 | } | ||
| 433 | |||
| 434 | -// Should we be able to compare af_unspec? | ||
| 435 | +inline void | ||
| 436 | +socket_address::copy_sockaddr(const sockaddr* src) { | ||
| 437 | + std::memset(this, 0, sizeof(socket_address)); | ||
| 438 | + std::memcpy(this, src, socket_address::cast_from(src)->length()); | ||
| 439 | +} | ||
| 440 | |||
| 441 | inline bool | ||
| 442 | socket_address::operator == (const socket_address& rhs) const { | ||
| 443 | @@ -488,6 +496,35 @@ socket_address_inet6::set_address_c_str(const char* a) { | ||
| 444 | return inet_pton(AF_INET6, a, &m_sockaddr.sin6_addr); | ||
| 445 | } | ||
| 446 | |||
| 447 | +inline std::string | ||
| 448 | +socket_address_inet6::pretty_address_str() const { | ||
| 449 | + char buf[INET6_ADDRSTRLEN + 2 + 6]; | ||
| 450 | + | ||
| 451 | + if (inet_ntop(family(), &m_sockaddr.sin6_addr, buf + 1, INET6_ADDRSTRLEN) == NULL) | ||
| 452 | + return std::string(); | ||
| 453 | + | ||
| 454 | + buf[0] = '['; | ||
| 455 | + | ||
| 456 | + char* last_char = (char*)std::memchr(buf + 1, 0, INET6_ADDRSTRLEN); | ||
| 457 | + | ||
| 458 | + // TODO: Throw exception here. | ||
| 459 | + | ||
| 460 | + if (last_char == NULL || last_char >= buf + 1 + INET6_ADDRSTRLEN) | ||
| 461 | + throw std::logic_error("inet_ntop for inet6 returned bad buffer"); | ||
| 462 | + | ||
| 463 | + *(last_char++) = ']'; | ||
| 464 | + | ||
| 465 | + if (!is_port_any()) { | ||
| 466 | + if (snprintf(last_char, 7, ":%" PRIu16, port()) == -1) | ||
| 467 | + return std::string("error"); // TODO: Throw here. | ||
| 468 | + | ||
| 469 | + } else { | ||
| 470 | + *last_char = '\0'; | ||
| 471 | + } | ||
| 472 | + | ||
| 473 | + return std::string(buf); | ||
| 474 | +} | ||
| 475 | + | ||
| 476 | inline socket_address | ||
| 477 | socket_address_inet6::normalize_address() const { | ||
| 478 | const uint32_t *addr32 = reinterpret_cast<const uint32_t *>(m_sockaddr.sin6_addr.s6_addr); | ||
| 479 | diff --git a/rak/timer.h b/rak/timer.h | ||
| 480 | index e25ad2e6..842a2e53 100644 | ||
| 481 | --- a/rak/timer.h | ||
| 482 | +++ b/rak/timer.h | ||
| 483 | @@ -38,7 +38,7 @@ | ||
| 484 | #define RAK_TIMER_H | ||
| 485 | |||
| 486 | #include <limits> | ||
| 487 | -#include <inttypes.h> | ||
| 488 | +#include <cinttypes> | ||
| 489 | #include <sys/time.h> | ||
| 490 | |||
| 491 | namespace rak { | ||
| 492 | diff --git a/scripts/checks.m4 b/scripts/checks.m4 | ||
| 493 | index 83be8461..98ef17f8 100644 | ||
| 494 | --- a/scripts/checks.m4 | ||
| 495 | +++ b/scripts/checks.m4 | ||
| 496 | @@ -88,6 +88,7 @@ AC_DEFUN([TORRENT_CHECK_KQUEUE], [ | ||
| 497 | [ | ||
| 498 | AC_DEFINE(USE_KQUEUE, 1, Use kqueue.) | ||
| 499 | AC_MSG_RESULT(yes) | ||
| 500 | + TORRENT_CHECK_KQUEUE_SOCKET_ONLY | ||
| 501 | ], [ | ||
| 502 | AC_MSG_RESULT(no) | ||
| 503 | ]) | ||
| 504 | @@ -137,7 +138,6 @@ AC_DEFUN([TORRENT_WITH_KQUEUE], [ | ||
| 505 | [ | ||
| 506 | if test "$withval" = "yes"; then | ||
| 507 | TORRENT_CHECK_KQUEUE | ||
| 508 | - TORRENT_CHECK_KQUEUE_SOCKET_ONLY | ||
| 509 | fi | ||
| 510 | ]) | ||
| 511 | ]) | ||
| 512 | @@ -149,11 +149,9 @@ AC_DEFUN([TORRENT_WITHOUT_KQUEUE], [ | ||
| 513 | [ | ||
| 514 | if test "$withval" = "yes"; then | ||
| 515 | TORRENT_CHECK_KQUEUE | ||
| 516 | - TORRENT_CHECK_KQUEUE_SOCKET_ONLY | ||
| 517 | fi | ||
| 518 | ], [ | ||
| 519 | TORRENT_CHECK_KQUEUE | ||
| 520 | - TORRENT_CHECK_KQUEUE_SOCKET_ONLY | ||
| 521 | ]) | ||
| 522 | ]) | ||
| 523 | |||
| 524 | diff --git a/scripts/rak_cxx.m4 b/scripts/rak_cxx.m4 | ||
| 525 | index 3660f3a7..0db61b83 100644 | ||
| 526 | --- a/scripts/rak_cxx.m4 | ||
| 527 | +++ b/scripts/rak_cxx.m4 | ||
| 528 | @@ -12,50 +12,3 @@ AC_DEFUN([RAK_CHECK_CXX11], [ | ||
| 529 | ] | ||
| 530 | ) | ||
| 531 | ]) | ||
| 532 | - | ||
| 533 | -AC_DEFUN([RAK_CHECK_TR1_LIB], [ | ||
| 534 | - AC_LANG_PUSH(C++) | ||
| 535 | - AC_MSG_CHECKING(should use TR1 headers) | ||
| 536 | - | ||
| 537 | - AC_COMPILE_IFELSE([AC_LANG_SOURCE([ | ||
| 538 | - #include <unordered_map> | ||
| 539 | - class Foo; typedef std::unordered_map<Foo*, int> Bar; | ||
| 540 | - Bar b1; | ||
| 541 | - ]) | ||
| 542 | - ], [ | ||
| 543 | - AC_MSG_RESULT(no) | ||
| 544 | - AC_DEFINE(USE_TR1_LIB, 0, Define to 1 if you need to use TR1 containers.) | ||
| 545 | - | ||
| 546 | - AC_DEFINE([lt_tr1_array], [<array>], [TR1 array]) | ||
| 547 | - AC_DEFINE([lt_tr1_functional], [<functional>], [TR1 functional]) | ||
| 548 | - AC_DEFINE([lt_tr1_memory], [<memory>], [TR1 memory]) | ||
| 549 | - AC_DEFINE([lt_tr1_unordered_map], [<unordered_map>], [TR1 unordered_map]) | ||
| 550 | - | ||
| 551 | - ], [ | ||
| 552 | - AC_COMPILE_IFELSE([AC_LANG_SOURCE([ | ||
| 553 | - #include <tr1/unordered_map> | ||
| 554 | - class Foo; typedef std::tr1::unordered_map<Foo*, int> Bar; | ||
| 555 | - Bar b1; | ||
| 556 | - ]) | ||
| 557 | - ], [ | ||
| 558 | - AC_MSG_RESULT([yes]) | ||
| 559 | - AC_DEFINE(USE_TR1_LIB, 1, Define to 1 if you need to use TR1 containers.) | ||
| 560 | - | ||
| 561 | - AC_DEFINE([lt_tr1_array], [<tr1/array>], [TR1 array]) | ||
| 562 | - AC_DEFINE([lt_tr1_functional], [<tr1/functional>], [TR1 functional]) | ||
| 563 | - AC_DEFINE([lt_tr1_memory], [<tr1/memory>], [TR1 memory]) | ||
| 564 | - AC_DEFINE([lt_tr1_unordered_map], [<tr1/unordered_map>], [TR1 unordered_map]) | ||
| 565 | - | ||
| 566 | - ], [ | ||
| 567 | - AC_MSG_ERROR([No support for C++11 standard library nor TR1 extensions found.]) | ||
| 568 | - ]) | ||
| 569 | - ]) | ||
| 570 | - | ||
| 571 | - AH_VERBATIM(lt_tr1_zzz, [ | ||
| 572 | -#if USE_TR1_LIB == 1 | ||
| 573 | -namespace std { namespace tr1 {} using namespace tr1; } | ||
| 574 | -#endif | ||
| 575 | -]) | ||
| 576 | - | ||
| 577 | - AC_LANG_POP(C++) | ||
| 578 | -]) | ||
| 579 | diff --git a/scripts/ssl.m4 b/scripts/ssl.m4 | ||
| 580 | new file mode 100644 | ||
| 581 | index 00000000..f07349a1 | ||
| 582 | --- /dev/null | ||
| 583 | +++ b/scripts/ssl.m4 | ||
| 584 | @@ -0,0 +1,38 @@ | ||
| 585 | +AC_DEFUN([TORRENT_CHECK_OPENSSL], | ||
| 586 | + [ | ||
| 587 | + PKG_CHECK_MODULES(OPENSSL, libcrypto, | ||
| 588 | + CXXFLAGS="$CXXFLAGS $OPENSSL_CFLAGS"; | ||
| 589 | + LIBS="$LIBS $OPENSSL_LIBS") | ||
| 590 | + | ||
| 591 | + AC_DEFINE(USE_OPENSSL, 1, Using OpenSSL.) | ||
| 592 | + AC_DEFINE(USE_OPENSSL_SHA, 1, Using OpenSSL's SHA1 implementation.) | ||
| 593 | + ] | ||
| 594 | +) | ||
| 595 | + | ||
| 596 | +AC_DEFUN([TORRENT_ARG_OPENSSL], | ||
| 597 | + [ | ||
| 598 | + AC_ARG_ENABLE(openssl, | ||
| 599 | + [ --disable-openssl Don't use OpenSSL's SHA1 implementation.], | ||
| 600 | + [ | ||
| 601 | + if test "$enableval" = "yes"; then | ||
| 602 | + TORRENT_CHECK_OPENSSL | ||
| 603 | + else | ||
| 604 | + AC_DEFINE(USE_NSS_SHA, 1, Using Mozilla's SHA1 implementation.) | ||
| 605 | + fi | ||
| 606 | + ],[ | ||
| 607 | + TORRENT_CHECK_OPENSSL | ||
| 608 | + ]) | ||
| 609 | + ] | ||
| 610 | +) | ||
| 611 | + | ||
| 612 | +AC_DEFUN([TORRENT_ARG_CYRUS_RC4], | ||
| 613 | + [ | ||
| 614 | + AC_ARG_ENABLE(cyrus-rc4, | ||
| 615 | + [ --enable-cyrus-rc4=PFX Use Cyrus RC4 implementation.], | ||
| 616 | + [ | ||
| 617 | + CXXFLAGS="$CXXFLAGS -I${enableval}/include"; | ||
| 618 | + LIBS="$LIBS -lrc4 -L${enableval}/lib" | ||
| 619 | + AC_DEFINE(USE_CYRUS_RC4, 1, Using Cyrus RC4 implementation.) | ||
| 620 | + ]) | ||
| 621 | + ] | ||
| 622 | +) | ||
| 623 | diff --git a/src/data/chunk_list.cc b/src/data/chunk_list.cc | ||
| 624 | index 00abbc2a..7622b825 100644 | ||
| 625 | --- a/src/data/chunk_list.cc | ||
| 626 | +++ b/src/data/chunk_list.cc | ||
| 627 | @@ -36,8 +36,6 @@ | ||
| 628 | |||
| 629 | #include "config.h" | ||
| 630 | |||
| 631 | -#define __STDC_FORMAT_MACROS | ||
| 632 | - | ||
| 633 | #include <rak/error_number.h> | ||
| 634 | #include <rak/functional.h> | ||
| 635 | |||
| 636 | diff --git a/src/data/chunk_list.h b/src/data/chunk_list.h | ||
| 637 | index b6ff4cdb..4b40dc42 100644 | ||
| 638 | --- a/src/data/chunk_list.h | ||
| 639 | +++ b/src/data/chunk_list.h | ||
| 640 | @@ -37,9 +37,9 @@ | ||
| 641 | #ifndef LIBTORRENT_DATA_CHUNK_LIST_H | ||
| 642 | #define LIBTORRENT_DATA_CHUNK_LIST_H | ||
| 643 | |||
| 644 | +#include <functional> | ||
| 645 | #include <string> | ||
| 646 | #include <vector> | ||
| 647 | -#include lt_tr1_functional | ||
| 648 | |||
| 649 | #include "chunk.h" | ||
| 650 | #include "chunk_handle.h" | ||
| 651 | diff --git a/src/data/chunk_list_node.h b/src/data/chunk_list_node.h | ||
| 652 | index 76de6671..95e4ed4f 100644 | ||
| 653 | --- a/src/data/chunk_list_node.h | ||
| 654 | +++ b/src/data/chunk_list_node.h | ||
| 655 | @@ -37,7 +37,7 @@ | ||
| 656 | #ifndef LIBTORRENT_DATA_CHUNK_LIST_NODE_H | ||
| 657 | #define LIBTORRENT_DATA_CHUNK_LIST_NODE_H | ||
| 658 | |||
| 659 | -#include <inttypes.h> | ||
| 660 | +#include <cinttypes> | ||
| 661 | #include <rak/timer.h> | ||
| 662 | |||
| 663 | namespace torrent { | ||
| 664 | diff --git a/src/data/hash_check_queue.h b/src/data/hash_check_queue.h | ||
| 665 | index b933f137..9f28c118 100644 | ||
| 666 | --- a/src/data/hash_check_queue.h | ||
| 667 | +++ b/src/data/hash_check_queue.h | ||
| 668 | @@ -38,8 +38,8 @@ | ||
| 669 | #define LIBTORRENT_DATA_HASH_CHECK_QUEUE_H | ||
| 670 | |||
| 671 | #include <deque> | ||
| 672 | +#include <functional> | ||
| 673 | #include <pthread.h> | ||
| 674 | -#include lt_tr1_functional | ||
| 675 | |||
| 676 | #include "rak/allocators.h" | ||
| 677 | |||
| 678 | diff --git a/src/data/hash_queue.cc b/src/data/hash_queue.cc | ||
| 679 | index 7dffaee4..3f54892b 100644 | ||
| 680 | --- a/src/data/hash_queue.cc | ||
| 681 | +++ b/src/data/hash_queue.cc | ||
| 682 | @@ -36,8 +36,6 @@ | ||
| 683 | |||
| 684 | #include "config.h" | ||
| 685 | |||
| 686 | -#define __STDC_FORMAT_MACROS | ||
| 687 | - | ||
| 688 | #include <functional> | ||
| 689 | #include <rak/functional.h> | ||
| 690 | #include <unistd.h> | ||
| 691 | diff --git a/src/data/hash_queue.h b/src/data/hash_queue.h | ||
| 692 | index 6885a383..3a841967 100644 | ||
| 693 | --- a/src/data/hash_queue.h | ||
| 694 | +++ b/src/data/hash_queue.h | ||
| 695 | @@ -38,9 +38,9 @@ | ||
| 696 | #define LIBTORRENT_DATA_HASH_QUEUE_H | ||
| 697 | |||
| 698 | #include <deque> | ||
| 699 | +#include <functional> | ||
| 700 | #include <map> | ||
| 701 | #include <pthread.h> | ||
| 702 | -#include lt_tr1_functional | ||
| 703 | |||
| 704 | #include "torrent/hash_string.h" | ||
| 705 | #include "hash_queue_node.h" | ||
| 706 | diff --git a/src/data/hash_queue_node.h b/src/data/hash_queue_node.h | ||
| 707 | index aa59a062..c8367b7c 100644 | ||
| 708 | --- a/src/data/hash_queue_node.h | ||
| 709 | +++ b/src/data/hash_queue_node.h | ||
| 710 | @@ -37,9 +37,9 @@ | ||
| 711 | #ifndef LIBTORRENT_DATA_HASH_QUEUE_NODE_H | ||
| 712 | #define LIBTORRENT_DATA_HASH_QUEUE_NODE_H | ||
| 713 | |||
| 714 | +#include <cinttypes> | ||
| 715 | +#include <functional> | ||
| 716 | #include <string> | ||
| 717 | -#include lt_tr1_functional | ||
| 718 | -#include <inttypes.h> | ||
| 719 | |||
| 720 | #include "chunk_handle.h" | ||
| 721 | #include "hash_chunk.h" | ||
| 722 | diff --git a/src/data/hash_torrent.cc b/src/data/hash_torrent.cc | ||
| 723 | index 758a10fa..e803f1cb 100644 | ||
| 724 | --- a/src/data/hash_torrent.cc | ||
| 725 | +++ b/src/data/hash_torrent.cc | ||
| 726 | @@ -36,8 +36,6 @@ | ||
| 727 | |||
| 728 | #include "config.h" | ||
| 729 | |||
| 730 | -#define __STDC_FORMAT_MACROS | ||
| 731 | - | ||
| 732 | #include "data/chunk_list.h" | ||
| 733 | #include "torrent/exceptions.h" | ||
| 734 | #include "torrent/data/download_data.h" | ||
| 735 | diff --git a/src/data/hash_torrent.h b/src/data/hash_torrent.h | ||
| 736 | index 6af643f2..9ce2f100 100644 | ||
| 737 | --- a/src/data/hash_torrent.h | ||
| 738 | +++ b/src/data/hash_torrent.h | ||
| 739 | @@ -37,9 +37,9 @@ | ||
| 740 | #ifndef LIBTORRENT_DATA_HASH_TORRENT_H | ||
| 741 | #define LIBTORRENT_DATA_HASH_TORRENT_H | ||
| 742 | |||
| 743 | +#include <cinttypes> | ||
| 744 | +#include <functional> | ||
| 745 | #include <string> | ||
| 746 | -#include <inttypes.h> | ||
| 747 | -#include lt_tr1_functional | ||
| 748 | #include <rak/priority_queue_default.h> | ||
| 749 | |||
| 750 | #include "data/chunk_handle.h" | ||
| 751 | diff --git a/src/data/memory_chunk.h b/src/data/memory_chunk.h | ||
| 752 | index cc32eff1..d2b5565d 100644 | ||
| 753 | --- a/src/data/memory_chunk.h | ||
| 754 | +++ b/src/data/memory_chunk.h | ||
| 755 | @@ -38,7 +38,7 @@ | ||
| 756 | #define LIBTORRENT_DATA_MEMORY_CHUNK_H | ||
| 757 | |||
| 758 | #include <algorithm> | ||
| 759 | -#include <inttypes.h> | ||
| 760 | +#include <cinttypes> | ||
| 761 | #include <sys/mman.h> | ||
| 762 | #include <cstddef> | ||
| 763 | |||
| 764 | diff --git a/src/data/socket_file.h b/src/data/socket_file.h | ||
| 765 | index 7b27af8c..d25c4a44 100644 | ||
| 766 | --- a/src/data/socket_file.h | ||
| 767 | +++ b/src/data/socket_file.h | ||
| 768 | @@ -38,7 +38,7 @@ | ||
| 769 | #define LIBTORRENT_SOCKET_FILE_H | ||
| 770 | |||
| 771 | #include <string> | ||
| 772 | -#include <inttypes.h> | ||
| 773 | +#include <cinttypes> | ||
| 774 | #include <fcntl.h> | ||
| 775 | #include <sys/types.h> | ||
| 776 | |||
| 777 | diff --git a/src/dht/dht_hash_map.h b/src/dht/dht_hash_map.h | ||
| 778 | index 140f070b..1506db56 100644 | ||
| 779 | --- a/src/dht/dht_hash_map.h | ||
| 780 | +++ b/src/dht/dht_hash_map.h | ||
| 781 | @@ -39,20 +39,14 @@ | ||
| 782 | |||
| 783 | #include "config.h" | ||
| 784 | |||
| 785 | -#if HAVE_TR1 | ||
| 786 | -#include <lt_tr1_unordered_map> | ||
| 787 | -#else | ||
| 788 | -#include <map> | ||
| 789 | -#endif | ||
| 790 | - | ||
| 791 | -#include "torrent/hash_string.h" | ||
| 792 | +#include <unordered_map> | ||
| 793 | |||
| 794 | #include "dht_node.h" | ||
| 795 | #include "dht_tracker.h" | ||
| 796 | +#include "torrent/hash_string.h" | ||
| 797 | |||
| 798 | namespace torrent { | ||
| 799 | |||
| 800 | -#if HAVE_TR1 | ||
| 801 | // Hash functions for HashString keys, and dereferencing HashString pointers. | ||
| 802 | |||
| 803 | // Since the first few bits are very similar if not identical (since the IDs | ||
| 804 | @@ -142,53 +136,6 @@ public: | ||
| 805 | |||
| 806 | }; | ||
| 807 | |||
| 808 | -#else | ||
| 809 | - | ||
| 810 | -// Compare HashString pointers by dereferencing them. | ||
| 811 | -struct hashstring_ptr_less : public std::binary_function<const HashString*, const HashString*, bool> { | ||
| 812 | - size_t operator () (const HashString* one, const HashString* two) const | ||
| 813 | - { return *one < *two; } | ||
| 814 | -}; | ||
| 815 | - | ||
| 816 | -class DhtNodeList : public std::map<const HashString*, DhtNode*, hashstring_ptr_less> { | ||
| 817 | -public: | ||
| 818 | - typedef std::map<const HashString*, DhtNode*, hashstring_ptr_less> base_type; | ||
| 819 | - | ||
| 820 | - // Define accessor iterator with more convenient access to the key and | ||
| 821 | - // element values. Allows changing the map definition more easily if needed. | ||
| 822 | - template<typename T> | ||
| 823 | - struct accessor_wrapper : public T { | ||
| 824 | - accessor_wrapper(const T& itr) : T(itr) { } | ||
| 825 | - | ||
| 826 | - const HashString& id() const { return *(**this).first; } | ||
| 827 | - DhtNode* node() const { return (**this).second; } | ||
| 828 | - }; | ||
| 829 | - | ||
| 830 | - typedef accessor_wrapper<const_iterator> const_accessor; | ||
| 831 | - typedef accessor_wrapper<iterator> accessor; | ||
| 832 | - | ||
| 833 | - DhtNode* add_node(DhtNode* n); | ||
| 834 | - | ||
| 835 | -}; | ||
| 836 | - | ||
| 837 | -class DhtTrackerList : public std::map<HashString, DhtTracker*> { | ||
| 838 | -public: | ||
| 839 | - typedef std::map<HashString, DhtTracker*> base_type; | ||
| 840 | - | ||
| 841 | - template<typename T> | ||
| 842 | - struct accessor_wrapper : public T { | ||
| 843 | - accessor_wrapper(const T& itr) : T(itr) { } | ||
| 844 | - | ||
| 845 | - const HashString& id() const { return (**this).first; } | ||
| 846 | - DhtTracker* tracker() const { return (**this).second; } | ||
| 847 | - }; | ||
| 848 | - | ||
| 849 | - typedef accessor_wrapper<const_iterator> const_accessor; | ||
| 850 | - typedef accessor_wrapper<iterator> accessor; | ||
| 851 | - | ||
| 852 | -}; | ||
| 853 | -#endif // HAVE_TR1 | ||
| 854 | - | ||
| 855 | inline | ||
| 856 | DhtNode* DhtNodeList::add_node(DhtNode* n) { | ||
| 857 | insert(std::make_pair((const HashString*)n, (DhtNode*)n)); | ||
| 858 | diff --git a/src/download/chunk_selector.h b/src/download/chunk_selector.h | ||
| 859 | index 52c31fd5..ab1b8c17 100644 | ||
| 860 | --- a/src/download/chunk_selector.h | ||
| 861 | +++ b/src/download/chunk_selector.h | ||
| 862 | @@ -37,7 +37,7 @@ | ||
| 863 | #ifndef LIBTORRENT_DOWNLOAD_CHUNK_SELECTOR_H | ||
| 864 | #define LIBTORRENT_DOWNLOAD_CHUNK_SELECTOR_H | ||
| 865 | |||
| 866 | -#include <inttypes.h> | ||
| 867 | +#include <cinttypes> | ||
| 868 | #include <rak/partial_queue.h> | ||
| 869 | |||
| 870 | #include "torrent/bitfield.h" | ||
| 871 | diff --git a/src/download/chunk_statistics.h b/src/download/chunk_statistics.h | ||
| 872 | index 816ec6c9..62f76c5a 100644 | ||
| 873 | --- a/src/download/chunk_statistics.h | ||
| 874 | +++ b/src/download/chunk_statistics.h | ||
| 875 | @@ -37,7 +37,7 @@ | ||
| 876 | #ifndef LIBTORRENT_DOWNLOAD_CHUNK_STATISTICS_H | ||
| 877 | #define LIBTORRENT_DOWNLOAD_CHUNK_STATISTICS_H | ||
| 878 | |||
| 879 | -#include <inttypes.h> | ||
| 880 | +#include <cinttypes> | ||
| 881 | #include <vector> | ||
| 882 | |||
| 883 | namespace torrent { | ||
| 884 | diff --git a/src/download/delegator.cc b/src/download/delegator.cc | ||
| 885 | index 711cd461..27ae42ec 100644 | ||
| 886 | --- a/src/download/delegator.cc | ||
| 887 | +++ b/src/download/delegator.cc | ||
| 888 | @@ -39,7 +39,7 @@ | ||
| 889 | #include "config.h" | ||
| 890 | |||
| 891 | #include <algorithm> | ||
| 892 | -#include <inttypes.h> | ||
| 893 | +#include <cinttypes> | ||
| 894 | |||
| 895 | #include "torrent/exceptions.h" | ||
| 896 | #include "torrent/bitfield.h" | ||
| 897 | diff --git a/src/download/delegator.h b/src/download/delegator.h | ||
| 898 | index 3b997b81..b75d4c2a 100644 | ||
| 899 | --- a/src/download/delegator.h | ||
| 900 | +++ b/src/download/delegator.h | ||
| 901 | @@ -37,9 +37,9 @@ | ||
| 902 | #ifndef LIBTORRENT_DELEGATOR_H | ||
| 903 | #define LIBTORRENT_DELEGATOR_H | ||
| 904 | |||
| 905 | +#include <functional> | ||
| 906 | #include <string> | ||
| 907 | #include <vector> | ||
| 908 | -#include lt_tr1_functional | ||
| 909 | |||
| 910 | #include "torrent/data/transfer_list.h" | ||
| 911 | |||
| 912 | diff --git a/src/download/download_constructor.h b/src/download/download_constructor.h | ||
| 913 | index 7d43aba3..6a09b7f1 100644 | ||
| 914 | --- a/src/download/download_constructor.h | ||
| 915 | +++ b/src/download/download_constructor.h | ||
| 916 | @@ -39,7 +39,7 @@ | ||
| 917 | |||
| 918 | #include <list> | ||
| 919 | #include <string> | ||
| 920 | -#include <inttypes.h> | ||
| 921 | +#include <cinttypes> | ||
| 922 | |||
| 923 | namespace torrent { | ||
| 924 | |||
| 925 | diff --git a/src/globals.cc b/src/globals.cc | ||
| 926 | index 88130c19..20644fbd 100644 | ||
| 927 | --- a/src/globals.cc | ||
| 928 | +++ b/src/globals.cc | ||
| 929 | @@ -37,11 +37,24 @@ | ||
| 930 | #include "config.h" | ||
| 931 | |||
| 932 | #include "globals.h" | ||
| 933 | -#include "torrent/common.h" | ||
| 934 | +#include "manager.h" | ||
| 935 | +#include "torrent/connection_manager.h" | ||
| 936 | +#include "torrent/event.h" | ||
| 937 | +#include "torrent/poll.h" | ||
| 938 | |||
| 939 | namespace torrent { | ||
| 940 | |||
| 941 | LIBTORRENT_EXPORT rak::priority_queue_default taskScheduler; | ||
| 942 | LIBTORRENT_EXPORT rak::timer cachedTime; | ||
| 943 | |||
| 944 | +void poll_event_open(Event* event) { manager->poll()->open(event); manager->connection_manager()->inc_socket_count(); } | ||
| 945 | +void poll_event_close(Event* event) { manager->poll()->close(event); manager->connection_manager()->dec_socket_count(); } | ||
| 946 | +void poll_event_closed(Event* event) { manager->poll()->closed(event); manager->connection_manager()->dec_socket_count(); } | ||
| 947 | +void poll_event_insert_read(Event* event) { manager->poll()->insert_read(event); } | ||
| 948 | +void poll_event_insert_write(Event* event) { manager->poll()->insert_write(event); } | ||
| 949 | +void poll_event_insert_error(Event* event) { manager->poll()->insert_error(event); } | ||
| 950 | +void poll_event_remove_read(Event* event) { manager->poll()->remove_read(event); } | ||
| 951 | +void poll_event_remove_write(Event* event) { manager->poll()->remove_write(event); } | ||
| 952 | +void poll_event_remove_error(Event* event) { manager->poll()->remove_error(event); } | ||
| 953 | + | ||
| 954 | } | ||
| 955 | diff --git a/src/globals.h b/src/globals.h | ||
| 956 | index 564ac86d..e9fe1177 100644 | ||
| 957 | --- a/src/globals.h | ||
| 958 | +++ b/src/globals.h | ||
| 959 | @@ -1,39 +1,3 @@ | ||
| 960 | -// libTorrent - BitTorrent library | ||
| 961 | -// Copyright (C) 2005-2011, Jari Sundell | ||
| 962 | -// | ||
| 963 | -// This program is free software; you can redistribute it and/or modify | ||
| 964 | -// it under the terms of the GNU General Public License as published by | ||
| 965 | -// the Free Software Foundation; either version 2 of the License, or | ||
| 966 | -// (at your option) any later version. | ||
| 967 | -// | ||
| 968 | -// This program is distributed in the hope that it will be useful, | ||
| 969 | -// but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
| 970 | -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
| 971 | -// GNU General Public License for more details. | ||
| 972 | -// | ||
| 973 | -// You should have received a copy of the GNU General Public License | ||
| 974 | -// along with this program; if not, write to the Free Software | ||
| 975 | -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | ||
| 976 | -// | ||
| 977 | -// In addition, as a special exception, the copyright holders give | ||
| 978 | -// permission to link the code of portions of this program with the | ||
| 979 | -// OpenSSL library under certain conditions as described in each | ||
| 980 | -// individual source file, and distribute linked combinations | ||
| 981 | -// including the two. | ||
| 982 | -// | ||
| 983 | -// You must obey the GNU General Public License in all respects for | ||
| 984 | -// all of the code used other than OpenSSL. If you modify file(s) | ||
| 985 | -// with this exception, you may extend this exception to your version | ||
| 986 | -// of the file(s), but you are not obligated to do so. If you do not | ||
| 987 | -// wish to do so, delete this exception statement from your version. | ||
| 988 | -// If you delete this exception statement from all source files in the | ||
| 989 | -// program, then also delete it here. | ||
| 990 | -// | ||
| 991 | -// Contact: Jari Sundell <jaris@ifi.uio.no> | ||
| 992 | -// | ||
| 993 | -// Skomakerveien 33 | ||
| 994 | -// 3185 Skoppum, NORWAY | ||
| 995 | - | ||
| 996 | #ifndef LIBTORRENT_GLOBALS_H | ||
| 997 | #define LIBTORRENT_GLOBALS_H | ||
| 998 | |||
| 999 | diff --git a/src/manager.cc b/src/manager.cc | ||
| 1000 | index c503974d..11ef4b0f 100644 | ||
| 1001 | --- a/src/manager.cc | ||
| 1002 | +++ b/src/manager.cc | ||
| 1003 | @@ -1,39 +1,3 @@ | ||
| 1004 | -// libTorrent - BitTorrent library | ||
| 1005 | -// Copyright (C) 2005-2011, Jari Sundell | ||
| 1006 | -// | ||
| 1007 | -// This program is free software; you can redistribute it and/or modify | ||
| 1008 | -// it under the terms of the GNU General Public License as published by | ||
| 1009 | -// the Free Software Foundation; either version 2 of the License, or | ||
| 1010 | -// (at your option) any later version. | ||
| 1011 | -// | ||
| 1012 | -// This program is distributed in the hope that it will be useful, | ||
| 1013 | -// but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
| 1014 | -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
| 1015 | -// GNU General Public License for more details. | ||
| 1016 | -// | ||
| 1017 | -// You should have received a copy of the GNU General Public License | ||
| 1018 | -// along with this program; if not, write to the Free Software | ||
| 1019 | -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | ||
| 1020 | -// | ||
| 1021 | -// In addition, as a special exception, the copyright holders give | ||
| 1022 | -// permission to link the code of portions of this program with the | ||
| 1023 | -// OpenSSL library under certain conditions as described in each | ||
| 1024 | -// individual source file, and distribute linked combinations | ||
| 1025 | -// including the two. | ||
| 1026 | -// | ||
| 1027 | -// You must obey the GNU General Public License in all respects for | ||
| 1028 | -// all of the code used other than OpenSSL. If you modify file(s) | ||
| 1029 | -// with this exception, you may extend this exception to your version | ||
| 1030 | -// of the file(s), but you are not obligated to do so. If you do not | ||
| 1031 | -// wish to do so, delete this exception statement from your version. | ||
| 1032 | -// If you delete this exception statement from all source files in the | ||
| 1033 | -// program, then also delete it here. | ||
| 1034 | -// | ||
| 1035 | -// Contact: Jari Sundell <jaris@ifi.uio.no> | ||
| 1036 | -// | ||
| 1037 | -// Skomakerveien 33 | ||
| 1038 | -// 3185 Skoppum, NORWAY | ||
| 1039 | - | ||
| 1040 | #include "config.h" | ||
| 1041 | |||
| 1042 | #include "torrent/exceptions.h" | ||
| 1043 | diff --git a/src/net/Makefile.am b/src/net/Makefile.am | ||
| 1044 | index fb4da4f3..e3a8c7e1 100644 | ||
| 1045 | --- a/src/net/Makefile.am | ||
| 1046 | +++ b/src/net/Makefile.am | ||
| 1047 | @@ -15,6 +15,8 @@ libsub_net_la_SOURCES = \ | ||
| 1048 | socket_datagram.h \ | ||
| 1049 | socket_fd.cc \ | ||
| 1050 | socket_fd.h \ | ||
| 1051 | + socket_listen.cc \ | ||
| 1052 | + socket_listen.h \ | ||
| 1053 | socket_set.cc \ | ||
| 1054 | socket_set.h \ | ||
| 1055 | socket_stream.cc \ | ||
| 1056 | diff --git a/src/net/data_buffer.h b/src/net/data_buffer.h | ||
| 1057 | index d35cdc48..5dd0cb30 100644 | ||
| 1058 | --- a/src/net/data_buffer.h | ||
| 1059 | +++ b/src/net/data_buffer.h | ||
| 1060 | @@ -38,7 +38,7 @@ | ||
| 1061 | #define LIBTORRENT_NET_DATA_BUFFER_H | ||
| 1062 | |||
| 1063 | #include <memory> | ||
| 1064 | -#include <inttypes.h> | ||
| 1065 | +#include <cinttypes> | ||
| 1066 | |||
| 1067 | namespace torrent { | ||
| 1068 | |||
| 1069 | diff --git a/src/net/listen.cc b/src/net/listen.cc | ||
| 1070 | index d424e94c..61fedbf8 100644 | ||
| 1071 | --- a/src/net/listen.cc | ||
| 1072 | +++ b/src/net/listen.cc | ||
| 1073 | @@ -1,39 +1,3 @@ | ||
| 1074 | -// libTorrent - BitTorrent library | ||
| 1075 | -// Copyright (C) 2005-2011, Jari Sundell | ||
| 1076 | -// | ||
| 1077 | -// This program is free software; you can redistribute it and/or modify | ||
| 1078 | -// it under the terms of the GNU General Public License as published by | ||
| 1079 | -// the Free Software Foundation; either version 2 of the License, or | ||
| 1080 | -// (at your option) any later version. | ||
| 1081 | -// | ||
| 1082 | -// This program is distributed in the hope that it will be useful, | ||
| 1083 | -// but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
| 1084 | -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
| 1085 | -// GNU General Public License for more details. | ||
| 1086 | -// | ||
| 1087 | -// You should have received a copy of the GNU General Public License | ||
| 1088 | -// along with this program; if not, write to the Free Software | ||
| 1089 | -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | ||
| 1090 | -// | ||
| 1091 | -// In addition, as a special exception, the copyright holders give | ||
| 1092 | -// permission to link the code of portions of this program with the | ||
| 1093 | -// OpenSSL library under certain conditions as described in each | ||
| 1094 | -// individual source file, and distribute linked combinations | ||
| 1095 | -// including the two. | ||
| 1096 | -// | ||
| 1097 | -// You must obey the GNU General Public License in all respects for | ||
| 1098 | -// all of the code used other than OpenSSL. If you modify file(s) | ||
| 1099 | -// with this exception, you may extend this exception to your version | ||
| 1100 | -// of the file(s), but you are not obligated to do so. If you do not | ||
| 1101 | -// wish to do so, delete this exception statement from your version. | ||
| 1102 | -// If you delete this exception statement from all source files in the | ||
| 1103 | -// program, then also delete it here. | ||
| 1104 | -// | ||
| 1105 | -// Contact: Jari Sundell <jaris@ifi.uio.no> | ||
| 1106 | -// | ||
| 1107 | -// Skomakerveien 33 | ||
| 1108 | -// 3185 Skoppum, NORWAY | ||
| 1109 | - | ||
| 1110 | #include "config.h" | ||
| 1111 | |||
| 1112 | #define __STDC_FORMAT_MACROS | ||
| 1113 | @@ -95,7 +59,7 @@ Listen::open(uint16_t first, uint16_t last, int backlog, const rak::socket_addre | ||
| 1114 | manager->poll()->insert_read(this); | ||
| 1115 | manager->poll()->insert_error(this); | ||
| 1116 | |||
| 1117 | - lt_log_print(LOG_CONNECTION_INFO, "listen port %" PRIu16 " opened with backlog set to %i", | ||
| 1118 | + lt_log_print(LOG_CONNECTION_LISTEN, "listen port %" PRIu16 " opened with backlog set to %i", | ||
| 1119 | m_port, backlog); | ||
| 1120 | |||
| 1121 | return true; | ||
| 1122 | @@ -107,7 +71,7 @@ Listen::open(uint16_t first, uint16_t last, int backlog, const rak::socket_addre | ||
| 1123 | get_fd().close(); | ||
| 1124 | get_fd().clear(); | ||
| 1125 | |||
| 1126 | - lt_log_print(LOG_CONNECTION_INFO, "failed to open listen port"); | ||
| 1127 | + lt_log_print(LOG_CONNECTION_LISTEN, "failed to open listen port"); | ||
| 1128 | |||
| 1129 | return false; | ||
| 1130 | } | ||
| 1131 | diff --git a/src/net/listen.h b/src/net/listen.h | ||
| 1132 | index b3c845aa..58c06c7e 100644 | ||
| 1133 | --- a/src/net/listen.h | ||
| 1134 | +++ b/src/net/listen.h | ||
| 1135 | @@ -37,8 +37,8 @@ | ||
| 1136 | #ifndef LIBTORRENT_LISTEN_H | ||
| 1137 | #define LIBTORRENT_LISTEN_H | ||
| 1138 | |||
| 1139 | -#include <inttypes.h> | ||
| 1140 | -#include lt_tr1_functional | ||
| 1141 | +#include <cinttypes> | ||
| 1142 | +#include <functional> | ||
| 1143 | #include <rak/socket_address.h> | ||
| 1144 | |||
| 1145 | #include "socket_base.h" | ||
| 1146 | diff --git a/src/net/protocol_buffer.h b/src/net/protocol_buffer.h | ||
| 1147 | index b64d47ea..f9711ded 100644 | ||
| 1148 | --- a/src/net/protocol_buffer.h | ||
| 1149 | +++ b/src/net/protocol_buffer.h | ||
| 1150 | @@ -38,7 +38,7 @@ | ||
| 1151 | #define LIBTORRENT_NET_PROTOCOL_BUFFER_H | ||
| 1152 | |||
| 1153 | #include <memory> | ||
| 1154 | -#include <inttypes.h> | ||
| 1155 | +#include <cinttypes> | ||
| 1156 | #include <netinet/in.h> | ||
| 1157 | |||
| 1158 | #include "torrent/exceptions.h" | ||
| 1159 | diff --git a/src/net/socket_base.h b/src/net/socket_base.h | ||
| 1160 | index 02c9497d..20ae1d9f 100644 | ||
| 1161 | --- a/src/net/socket_base.h | ||
| 1162 | +++ b/src/net/socket_base.h | ||
| 1163 | @@ -38,7 +38,7 @@ | ||
| 1164 | #define LIBTORRENT_NET_SOCKET_BASE_H | ||
| 1165 | |||
| 1166 | #include <list> | ||
| 1167 | -#include <inttypes.h> | ||
| 1168 | +#include <cinttypes> | ||
| 1169 | |||
| 1170 | #include "torrent/event.h" | ||
| 1171 | #include "socket_fd.h" | ||
| 1172 | diff --git a/src/net/socket_fd.cc b/src/net/socket_fd.cc | ||
| 1173 | index f04059f6..c36ff4b9 100644 | ||
| 1174 | --- a/src/net/socket_fd.cc | ||
| 1175 | +++ b/src/net/socket_fd.cc | ||
| 1176 | @@ -210,6 +210,11 @@ SocketFd::bind(const rak::socket_address& sa, unsigned int length) { | ||
| 1177 | return !::bind(m_fd, sa.c_sockaddr(), length); | ||
| 1178 | } | ||
| 1179 | |||
| 1180 | +bool | ||
| 1181 | +SocketFd::bind_sa(const sockaddr* sa) { | ||
| 1182 | + return bind(*rak::socket_address::cast_from(sa)); | ||
| 1183 | +} | ||
| 1184 | + | ||
| 1185 | bool | ||
| 1186 | SocketFd::connect(const rak::socket_address& sa) { | ||
| 1187 | check_valid(); | ||
| 1188 | @@ -222,6 +227,11 @@ SocketFd::connect(const rak::socket_address& sa) { | ||
| 1189 | return !::connect(m_fd, sa.c_sockaddr(), sa.length()) || errno == EINPROGRESS; | ||
| 1190 | } | ||
| 1191 | |||
| 1192 | +bool | ||
| 1193 | +SocketFd::connect_sa(const sockaddr* sa) { | ||
| 1194 | + return connect(*rak::socket_address::cast_from(sa)); | ||
| 1195 | +} | ||
| 1196 | + | ||
| 1197 | bool | ||
| 1198 | SocketFd::getsockname(rak::socket_address *sa) { | ||
| 1199 | check_valid(); | ||
| 1200 | diff --git a/src/net/socket_fd.h b/src/net/socket_fd.h | ||
| 1201 | index 2329b4e9..4db0087b 100644 | ||
| 1202 | --- a/src/net/socket_fd.h | ||
| 1203 | +++ b/src/net/socket_fd.h | ||
| 1204 | @@ -39,6 +39,8 @@ | ||
| 1205 | |||
| 1206 | #include <unistd.h> | ||
| 1207 | |||
| 1208 | +struct sockaddr; | ||
| 1209 | + | ||
| 1210 | namespace rak { | ||
| 1211 | class socket_address; | ||
| 1212 | } | ||
| 1213 | @@ -80,7 +82,11 @@ public: | ||
| 1214 | |||
| 1215 | bool bind(const rak::socket_address& sa); | ||
| 1216 | bool bind(const rak::socket_address& sa, unsigned int length); | ||
| 1217 | + bool bind_sa(const sockaddr* sa); | ||
| 1218 | + | ||
| 1219 | bool connect(const rak::socket_address& sa); | ||
| 1220 | + bool connect_sa(const sockaddr* sa); | ||
| 1221 | + | ||
| 1222 | bool getsockname(rak::socket_address* sa); | ||
| 1223 | |||
| 1224 | bool listen(int size); | ||
| 1225 | diff --git a/src/net/socket_listen.cc b/src/net/socket_listen.cc | ||
| 1226 | new file mode 100644 | ||
| 1227 | index 00000000..97f006e0 | ||
| 1228 | --- /dev/null | ||
| 1229 | +++ b/src/net/socket_listen.cc | ||
| 1230 | @@ -0,0 +1,137 @@ | ||
| 1231 | +#include "config.h" | ||
| 1232 | + | ||
| 1233 | +#include "socket_listen.h" | ||
| 1234 | + | ||
| 1235 | +#include <algorithm> | ||
| 1236 | + | ||
| 1237 | +#include "torrent/connection_manager.h" | ||
| 1238 | +#include "torrent/exceptions.h" | ||
| 1239 | +#include "torrent/utils/log.h" | ||
| 1240 | +#include "torrent/utils/random.h" | ||
| 1241 | + | ||
| 1242 | +#define LT_LOG_SAP(log_fmt, sap, ...) \ | ||
| 1243 | + lt_log_print(LOG_CONNECTION_LISTEN, "listen->%s: " log_fmt, sap_pretty_str(sap).c_str(), __VA_ARGS__); | ||
| 1244 | + | ||
| 1245 | +namespace torrent { | ||
| 1246 | + | ||
| 1247 | +socket_listen::socket_listen() : m_backlog(SOMAXCONN) { | ||
| 1248 | +} | ||
| 1249 | + | ||
| 1250 | +void | ||
| 1251 | +socket_listen::set_backlog(int backlog) { | ||
| 1252 | + if (backlog < 0 || backlog > SOMAXCONN) | ||
| 1253 | + throw internal_error("Could not set socket_listen backlog, out-of-range value."); | ||
| 1254 | + | ||
| 1255 | + m_backlog = backlog; | ||
| 1256 | +} | ||
| 1257 | + | ||
| 1258 | +bool | ||
| 1259 | +socket_listen::open(sa_unique_ptr&& sap, uint16_t first_port, uint16_t last_port, uint16_t start_port, fd_flags open_flags) { | ||
| 1260 | + if (is_open()) | ||
| 1261 | + throw internal_error("socket_listen::open: already open"); | ||
| 1262 | + | ||
| 1263 | + if (!(sap_is_inet(sap) || sap_is_inet6(sap)) || sap_is_v4mapped(sap) || !sap_is_port_any(sap) || sap_is_broadcast(sap)) | ||
| 1264 | + throw internal_error("socket_listen::open: socket address must be inet/inet6 with no port, and not v4mapped nor broadcast: " + sap_pretty_str(sap)); | ||
| 1265 | + | ||
| 1266 | + if (sap_is_inet(sap) && !(open_flags & fd_flag_v4only)) | ||
| 1267 | + throw internal_error("socket_listen::open: socket address is inet without v4only flag"); | ||
| 1268 | + | ||
| 1269 | + if (first_port == 0 || last_port == 0 || start_port == 0 || | ||
| 1270 | + !(first_port <= last_port && first_port <= start_port && start_port <= last_port)) | ||
| 1271 | + throw internal_error("socket_listen::open: port range not valid"); | ||
| 1272 | + | ||
| 1273 | + int fd = fd_open(open_flags); | ||
| 1274 | + | ||
| 1275 | + if (fd == -1) { | ||
| 1276 | + LT_LOG_SAP("open failed (flags:0x%x errno:%i message:'%s')", sap, open_flags, errno, std::strerror(errno)); | ||
| 1277 | + return false; | ||
| 1278 | + } | ||
| 1279 | + | ||
| 1280 | + uint16_t p = start_port; | ||
| 1281 | + | ||
| 1282 | + do { | ||
| 1283 | + if (m_open_port(fd, sap, p)) | ||
| 1284 | + return is_open(); | ||
| 1285 | + | ||
| 1286 | + if (p == last_port) | ||
| 1287 | + p = first_port; | ||
| 1288 | + else | ||
| 1289 | + p++; | ||
| 1290 | + } while (p != start_port); | ||
| 1291 | + | ||
| 1292 | + LT_LOG_SAP("listen ports exhausted (fd:%i first_port:%" PRIu16 " last_port:%" PRIu16 ")", | ||
| 1293 | + sap, fd, first_port, last_port); | ||
| 1294 | + fd_close(fd); | ||
| 1295 | + return false; | ||
| 1296 | +} | ||
| 1297 | + | ||
| 1298 | +bool | ||
| 1299 | +socket_listen::open_randomize(sa_unique_ptr&& sap, uint16_t first_port, uint16_t last_port, fd_flags open_flags) { | ||
| 1300 | + if (last_port < first_port) | ||
| 1301 | + throw internal_error("socket_listen::open_randomize: port range not valid"); | ||
| 1302 | + | ||
| 1303 | + return open(std::move(sap), first_port, last_port, random_uniform_uint16(first_port, last_port), open_flags); | ||
| 1304 | +} | ||
| 1305 | + | ||
| 1306 | +bool | ||
| 1307 | +socket_listen::open_sequential(sa_unique_ptr&& sap, uint16_t first_port, uint16_t last_port, fd_flags open_flags) { | ||
| 1308 | + return open(std::move(sap), first_port, last_port, first_port, open_flags); | ||
| 1309 | +} | ||
| 1310 | + | ||
| 1311 | +void | ||
| 1312 | +socket_listen::close() { | ||
| 1313 | + if (!is_open()) | ||
| 1314 | + return; | ||
| 1315 | + | ||
| 1316 | + torrent::poll_event_closed(this); | ||
| 1317 | + | ||
| 1318 | + fd_close(file_descriptor()); | ||
| 1319 | + set_file_descriptor(-1); | ||
| 1320 | + m_socket_address.reset(); | ||
| 1321 | +} | ||
| 1322 | + | ||
| 1323 | +void | ||
| 1324 | +socket_listen::event_read() { | ||
| 1325 | +} | ||
| 1326 | + | ||
| 1327 | +void | ||
| 1328 | +socket_listen::event_error() { | ||
| 1329 | +} | ||
| 1330 | + | ||
| 1331 | +// Returns true if open is successful or if we cannot bind to the | ||
| 1332 | +// address, returns false if other ports can be used. | ||
| 1333 | +bool | ||
| 1334 | +socket_listen::m_open_port(int fd, sa_unique_ptr& sap, uint16_t port) { | ||
| 1335 | + sap_set_port(sap, port); | ||
| 1336 | + | ||
| 1337 | + if (!fd_bind(fd, sap.get())) { | ||
| 1338 | + if (errno == EADDRNOTAVAIL || errno == EAFNOSUPPORT) { | ||
| 1339 | + LT_LOG_SAP("listen address not usable (fd:%i errno:%i message:'%s')", | ||
| 1340 | + sap, fd, errno, std::strerror(errno)); | ||
| 1341 | + fd_close(fd); | ||
| 1342 | + return true; | ||
| 1343 | + } | ||
| 1344 | + | ||
| 1345 | + return false; | ||
| 1346 | + } | ||
| 1347 | + | ||
| 1348 | + if (!fd_listen(fd, m_backlog)) { | ||
| 1349 | + LT_LOG_SAP("call to listen failed (fd:%i backlog:%i errno:%i message:'%s')", | ||
| 1350 | + sap, fd, m_backlog, errno, std::strerror(errno)); | ||
| 1351 | + fd_close(fd); | ||
| 1352 | + return true; | ||
| 1353 | + } | ||
| 1354 | + | ||
| 1355 | + LT_LOG_SAP("open listen port success (fd:%i backlog:%i)", sap, fd, m_backlog); | ||
| 1356 | + | ||
| 1357 | + m_fileDesc = fd; | ||
| 1358 | + m_socket_address.swap(sap); | ||
| 1359 | + | ||
| 1360 | + torrent::poll_event_open(this); | ||
| 1361 | + torrent::poll_event_insert_read(this); | ||
| 1362 | + torrent::poll_event_insert_error(this); | ||
| 1363 | + | ||
| 1364 | + return true; | ||
| 1365 | +} | ||
| 1366 | + | ||
| 1367 | +} | ||
| 1368 | diff --git a/src/net/socket_listen.h b/src/net/socket_listen.h | ||
| 1369 | new file mode 100644 | ||
| 1370 | index 00000000..817d5fa5 | ||
| 1371 | --- /dev/null | ||
| 1372 | +++ b/src/net/socket_listen.h | ||
| 1373 | @@ -0,0 +1,46 @@ | ||
| 1374 | +#ifndef LIBTORRENT_SOCKET_LISTEN_H | ||
| 1375 | +#define LIBTORRENT_SOCKET_LISTEN_H | ||
| 1376 | + | ||
| 1377 | +#include <cinttypes> | ||
| 1378 | +#include <functional> | ||
| 1379 | + | ||
| 1380 | +#include "torrent/net/fd.h" | ||
| 1381 | +#include "torrent/net/socket_address.h" | ||
| 1382 | +#include "torrent/net/socket_event.h" | ||
| 1383 | + | ||
| 1384 | +namespace torrent { | ||
| 1385 | + | ||
| 1386 | +class socket_listen : public socket_event { | ||
| 1387 | +public: | ||
| 1388 | + typedef std::function<void (int, sa_unique_ptr)> accepted_ftor; | ||
| 1389 | + | ||
| 1390 | + socket_listen(); | ||
| 1391 | + | ||
| 1392 | + int backlog() const; | ||
| 1393 | + | ||
| 1394 | + void set_backlog(int backlog); | ||
| 1395 | + void set_slot_accepted(accepted_ftor&& ftor); | ||
| 1396 | + | ||
| 1397 | + bool open(sa_unique_ptr&& sap, uint16_t first_port, uint16_t last_port, uint16_t start_port, fd_flags open_flags); | ||
| 1398 | + bool open_randomize(sa_unique_ptr&& sap, uint16_t first_port, uint16_t last_port, fd_flags open_flags); | ||
| 1399 | + bool open_sequential(sa_unique_ptr&& sap, uint16_t first_port, uint16_t last_port, fd_flags open_flags); | ||
| 1400 | + void close(); | ||
| 1401 | + | ||
| 1402 | + void event_read() override; | ||
| 1403 | + void event_error() override; | ||
| 1404 | + | ||
| 1405 | + const char* type_name() const override { return "socket_listen"; } | ||
| 1406 | + | ||
| 1407 | +private: | ||
| 1408 | + bool m_open_port(int fd, sa_unique_ptr& sap, uint16_t port); | ||
| 1409 | + | ||
| 1410 | + int m_backlog; | ||
| 1411 | + accepted_ftor m_slot_accepted; | ||
| 1412 | +}; | ||
| 1413 | + | ||
| 1414 | +inline int socket_listen::backlog() const { return m_backlog; } | ||
| 1415 | +inline void socket_listen::set_slot_accepted(accepted_ftor&& ftor) { m_slot_accepted = ftor; } | ||
| 1416 | + | ||
| 1417 | +} | ||
| 1418 | + | ||
| 1419 | +#endif | ||
| 1420 | diff --git a/src/net/socket_set.h b/src/net/socket_set.h | ||
| 1421 | index 9264edf7..78443c88 100644 | ||
| 1422 | --- a/src/net/socket_set.h | ||
| 1423 | +++ b/src/net/socket_set.h | ||
| 1424 | @@ -39,7 +39,7 @@ | ||
| 1425 | |||
| 1426 | #include <list> | ||
| 1427 | #include <vector> | ||
| 1428 | -#include <inttypes.h> | ||
| 1429 | +#include <cinttypes> | ||
| 1430 | #include <rak/allocators.h> | ||
| 1431 | |||
| 1432 | #include "torrent/exceptions.h" | ||
| 1433 | diff --git a/src/net/throttle_node.h b/src/net/throttle_node.h | ||
| 1434 | index 77cb6cc7..5af27a22 100644 | ||
| 1435 | --- a/src/net/throttle_node.h | ||
| 1436 | +++ b/src/net/throttle_node.h | ||
| 1437 | @@ -37,7 +37,7 @@ | ||
| 1438 | #ifndef LIBTORRENT_NET_THROTTLE_NODE_H | ||
| 1439 | #define LIBTORRENT_NET_THROTTLE_NODE_H | ||
| 1440 | |||
| 1441 | -#include lt_tr1_functional | ||
| 1442 | +#include <functional> | ||
| 1443 | |||
| 1444 | #include "torrent/rate.h" | ||
| 1445 | |||
| 1446 | diff --git a/src/protocol/handshake.cc b/src/protocol/handshake.cc | ||
| 1447 | index 6b41bbe3..1b877c7a 100644 | ||
| 1448 | --- a/src/protocol/handshake.cc | ||
| 1449 | +++ b/src/protocol/handshake.cc | ||
| 1450 | @@ -46,6 +46,7 @@ | ||
| 1451 | #include "torrent/error.h" | ||
| 1452 | #include "torrent/poll.h" | ||
| 1453 | #include "torrent/throttle.h" | ||
| 1454 | +#include "torrent/utils/log.h" | ||
| 1455 | #include "utils/diffie_hellman.h" | ||
| 1456 | |||
| 1457 | #include "globals.h" | ||
| 1458 | @@ -55,6 +56,10 @@ | ||
| 1459 | #include "handshake.h" | ||
| 1460 | #include "handshake_manager.h" | ||
| 1461 | |||
| 1462 | +#define LT_LOG(log_fmt, ...) \ | ||
| 1463 | + lt_log_print(LOG_CONNECTION_HANDSHAKE, "handshake->%s: " log_fmt, \ | ||
| 1464 | + m_address.pretty_address_str().c_str(), __VA_ARGS__); | ||
| 1465 | + | ||
| 1466 | namespace torrent { | ||
| 1467 | |||
| 1468 | const char* Handshake::m_protocol = "BitTorrent protocol"; | ||
| 1469 | @@ -862,7 +867,7 @@ restart: | ||
| 1470 | m_manager->receive_failed(this, e.type(), e.error()); | ||
| 1471 | |||
| 1472 | } catch (network_error& e) { | ||
| 1473 | - m_manager->receive_failed(this, ConnectionManager::handshake_failed, e_handshake_network_error); | ||
| 1474 | + m_manager->receive_failed(this, ConnectionManager::handshake_failed, e_handshake_network_read_error); | ||
| 1475 | } | ||
| 1476 | } | ||
| 1477 | |||
| 1478 | @@ -969,7 +974,7 @@ Handshake::event_write() { | ||
| 1479 | m_manager->receive_failed(this, e.type(), e.error()); | ||
| 1480 | |||
| 1481 | } catch (network_error& e) { | ||
| 1482 | - m_manager->receive_failed(this, ConnectionManager::handshake_failed, e_handshake_network_error); | ||
| 1483 | + m_manager->receive_failed(this, ConnectionManager::handshake_failed, e_handshake_network_write_error); | ||
| 1484 | } | ||
| 1485 | } | ||
| 1486 | |||
| 1487 | @@ -1070,7 +1075,7 @@ Handshake::prepare_peer_info() { | ||
| 1488 | m_peerInfo = m_download->peer_list()->connected(m_address.c_sockaddr(), PeerList::connect_incoming); | ||
| 1489 | |||
| 1490 | if (m_peerInfo == NULL) | ||
| 1491 | - throw handshake_error(ConnectionManager::handshake_failed, e_handshake_network_error); | ||
| 1492 | + throw handshake_error(ConnectionManager::handshake_failed, e_handshake_no_peer_info); | ||
| 1493 | |||
| 1494 | if (m_peerInfo->failed_counter() > m_manager->max_failed) | ||
| 1495 | throw handshake_error(ConnectionManager::handshake_dropped, e_handshake_toomanyfailed); | ||
| 1496 | @@ -1221,7 +1226,7 @@ Handshake::event_error() { | ||
| 1497 | if (m_state == INACTIVE) | ||
| 1498 | throw internal_error("Handshake::event_error() called on an inactive handshake."); | ||
| 1499 | |||
| 1500 | - m_manager->receive_failed(this, ConnectionManager::handshake_failed, e_handshake_network_error); | ||
| 1501 | + m_manager->receive_failed(this, ConnectionManager::handshake_failed, e_handshake_network_socket_error); | ||
| 1502 | } | ||
| 1503 | |||
| 1504 | } | ||
| 1505 | diff --git a/src/protocol/handshake_manager.cc b/src/protocol/handshake_manager.cc | ||
| 1506 | index b52c8d4e..99592ba8 100644 | ||
| 1507 | --- a/src/protocol/handshake_manager.cc | ||
| 1508 | +++ b/src/protocol/handshake_manager.cc | ||
| 1509 | @@ -1,39 +1,3 @@ | ||
| 1510 | -// libTorrent - BitTorrent library | ||
| 1511 | -// Copyright (C) 2005-2011, Jari Sundell | ||
| 1512 | -// | ||
| 1513 | -// This program is free software; you can redistribute it and/or modify | ||
| 1514 | -// it under the terms of the GNU General Public License as published by | ||
| 1515 | -// the Free Software Foundation; either version 2 of the License, or | ||
| 1516 | -// (at your option) any later version. | ||
| 1517 | -// | ||
| 1518 | -// This program is distributed in the hope that it will be useful, | ||
| 1519 | -// but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
| 1520 | -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
| 1521 | -// GNU General Public License for more details. | ||
| 1522 | -// | ||
| 1523 | -// You should have received a copy of the GNU General Public License | ||
| 1524 | -// along with this program; if not, write to the Free Software | ||
| 1525 | -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | ||
| 1526 | -// | ||
| 1527 | -// In addition, as a special exception, the copyright holders give | ||
| 1528 | -// permission to link the code of portions of this program with the | ||
| 1529 | -// OpenSSL library under certain conditions as described in each | ||
| 1530 | -// individual source file, and distribute linked combinations | ||
| 1531 | -// including the two. | ||
| 1532 | -// | ||
| 1533 | -// You must obey the GNU General Public License in all respects for | ||
| 1534 | -// all of the code used other than OpenSSL. If you modify file(s) | ||
| 1535 | -// with this exception, you may extend this exception to your version | ||
| 1536 | -// of the file(s), but you are not obligated to do so. If you do not | ||
| 1537 | -// wish to do so, delete this exception statement from your version. | ||
| 1538 | -// If you delete this exception statement from all source files in the | ||
| 1539 | -// program, then also delete it here. | ||
| 1540 | -// | ||
| 1541 | -// Contact: Jari Sundell <jaris@ifi.uio.no> | ||
| 1542 | -// | ||
| 1543 | -// Skomakerveien 33 | ||
| 1544 | -// 3185 Skoppum, NORWAY | ||
| 1545 | - | ||
| 1546 | #include "config.h" | ||
| 1547 | |||
| 1548 | #include <rak/socket_address.h> | ||
| 1549 | @@ -54,10 +18,10 @@ | ||
| 1550 | |||
| 1551 | #include "manager.h" | ||
| 1552 | |||
| 1553 | -#define LT_LOG_SA(log_level, sa, log_fmt, ...) \ | ||
| 1554 | - lt_log_print(LOG_CONNECTION_##log_level, "handshake_manager->%s: " log_fmt, (sa)->address_str().c_str(), __VA_ARGS__); | ||
| 1555 | -#define LT_LOG_SA_C(log_level, sa, log_fmt, ...) \ | ||
| 1556 | - lt_log_print(LOG_CONNECTION_##log_level, "handshake_manager->%s: " log_fmt, \ | ||
| 1557 | +#define LT_LOG_SA(sa, log_fmt, ...) \ | ||
| 1558 | + lt_log_print(LOG_CONNECTION_HANDSHAKE, "handshake_manager->%s: " log_fmt, (sa)->address_str().c_str(), __VA_ARGS__); | ||
| 1559 | +#define LT_LOG_SA_C(sa, log_fmt, ...) \ | ||
| 1560 | + lt_log_print(LOG_CONNECTION_HANDSHAKE, "handshake_manager->%s: " log_fmt, \ | ||
| 1561 | reinterpret_cast<const rak::socket_address*>(sa)->address_str().c_str(), __VA_ARGS__); | ||
| 1562 | |||
| 1563 | namespace torrent { | ||
| 1564 | @@ -122,7 +86,7 @@ HandshakeManager::add_incoming(SocketFd fd, const rak::socket_address& sa) { | ||
| 1565 | return; | ||
| 1566 | } | ||
| 1567 | |||
| 1568 | - LT_LOG_SA(INFO, &sa, "Adding incoming connection: fd:%i.", fd.get_fd()); | ||
| 1569 | + LT_LOG_SA(&sa, "Adding incoming connection: fd:%i.", fd.get_fd()); | ||
| 1570 | |||
| 1571 | manager->connection_manager()->inc_socket_count(); | ||
| 1572 | |||
| 1573 | @@ -183,7 +147,7 @@ HandshakeManager::create_outgoing(const rak::socket_address& sa, DownloadMain* d | ||
| 1574 | else | ||
| 1575 | message = ConnectionManager::handshake_outgoing; | ||
| 1576 | |||
| 1577 | - LT_LOG_SA(INFO, &sa, "Adding outcoming connection: encryption:%x message:%x.", encryptionOptions, message); | ||
| 1578 | + LT_LOG_SA(&sa, "Adding outcoming connection: encryption:%x message:%x.", encryptionOptions, message); | ||
| 1579 | manager->connection_manager()->inc_socket_count(); | ||
| 1580 | |||
| 1581 | Handshake* handshake = new Handshake(fd, this, encryptionOptions); | ||
| 1582 | @@ -213,7 +177,7 @@ HandshakeManager::receive_succeeded(Handshake* handshake) { | ||
| 1583 | handshake->extensions())) != NULL) { | ||
| 1584 | |||
| 1585 | manager->client_list()->retrieve_id(&handshake->peer_info()->mutable_client_info(), handshake->peer_info()->id()); | ||
| 1586 | - LT_LOG_SA_C(INFO, handshake->peer_info()->socket_address(), "Handshake success.", 0); | ||
| 1587 | + LT_LOG_SA_C(handshake->peer_info()->socket_address(), "Handshake success.", 0); | ||
| 1588 | |||
| 1589 | pcb->peer_chunks()->set_have_timer(handshake->initialized_time()); | ||
| 1590 | |||
| 1591 | @@ -237,7 +201,7 @@ HandshakeManager::receive_succeeded(Handshake* handshake) { | ||
| 1592 | else | ||
| 1593 | reason = e_handshake_duplicate; | ||
| 1594 | |||
| 1595 | - LT_LOG_SA_C(INFO, handshake->peer_info()->socket_address(), "Handshake dropped: %s.", strerror(reason)); | ||
| 1596 | + LT_LOG_SA_C(handshake->peer_info()->socket_address(), "Handshake dropped: %s.", strerror(reason)); | ||
| 1597 | handshake->destroy_connection(); | ||
| 1598 | } | ||
| 1599 | |||
| 1600 | @@ -255,13 +219,13 @@ HandshakeManager::receive_failed(Handshake* handshake, int message, int error) { | ||
| 1601 | handshake->deactivate_connection(); | ||
| 1602 | handshake->destroy_connection(); | ||
| 1603 | |||
| 1604 | - LT_LOG_SA(INFO, sa, "Received error: message:%x %s.", message, strerror(error)); | ||
| 1605 | + LT_LOG_SA(sa, "Received error: message:%x %s.", message, strerror(error)); | ||
| 1606 | |||
| 1607 | if (handshake->encryption()->should_retry()) { | ||
| 1608 | int retry_options = handshake->retry_options() | ConnectionManager::encryption_retrying; | ||
| 1609 | DownloadMain* download = handshake->download(); | ||
| 1610 | |||
| 1611 | - LT_LOG_SA(INFO, sa, "Retrying %s.", | ||
| 1612 | + LT_LOG_SA(sa, "Retrying %s.", | ||
| 1613 | retry_options & ConnectionManager::encryption_try_outgoing ? "encrypted" : "plaintext"); | ||
| 1614 | |||
| 1615 | create_outgoing(*sa, download, retry_options); | ||
| 1616 | diff --git a/src/protocol/handshake_manager.h b/src/protocol/handshake_manager.h | ||
| 1617 | index cfd52aa0..dc398e3e 100644 | ||
| 1618 | --- a/src/protocol/handshake_manager.h | ||
| 1619 | +++ b/src/protocol/handshake_manager.h | ||
| 1620 | @@ -1,45 +1,9 @@ | ||
| 1621 | -// libTorrent - BitTorrent library | ||
| 1622 | -// Copyright (C) 2005-2011, Jari Sundell | ||
| 1623 | -// | ||
| 1624 | -// This program is free software; you can redistribute it and/or modify | ||
| 1625 | -// it under the terms of the GNU General Public License as published by | ||
| 1626 | -// the Free Software Foundation; either version 2 of the License, or | ||
| 1627 | -// (at your option) any later version. | ||
| 1628 | -// | ||
| 1629 | -// This program is distributed in the hope that it will be useful, | ||
| 1630 | -// but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
| 1631 | -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
| 1632 | -// GNU General Public License for more details. | ||
| 1633 | -// | ||
| 1634 | -// You should have received a copy of the GNU General Public License | ||
| 1635 | -// along with this program; if not, write to the Free Software | ||
| 1636 | -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | ||
| 1637 | -// | ||
| 1638 | -// In addition, as a special exception, the copyright holders give | ||
| 1639 | -// permission to link the code of portions of this program with the | ||
| 1640 | -// OpenSSL library under certain conditions as described in each | ||
| 1641 | -// individual source file, and distribute linked combinations | ||
| 1642 | -// including the two. | ||
| 1643 | -// | ||
| 1644 | -// You must obey the GNU General Public License in all respects for | ||
| 1645 | -// all of the code used other than OpenSSL. If you modify file(s) | ||
| 1646 | -// with this exception, you may extend this exception to your version | ||
| 1647 | -// of the file(s), but you are not obligated to do so. If you do not | ||
| 1648 | -// wish to do so, delete this exception statement from your version. | ||
| 1649 | -// If you delete this exception statement from all source files in the | ||
| 1650 | -// program, then also delete it here. | ||
| 1651 | -// | ||
| 1652 | -// Contact: Jari Sundell <jaris@ifi.uio.no> | ||
| 1653 | -// | ||
| 1654 | -// Skomakerveien 33 | ||
| 1655 | -// 3185 Skoppum, NORWAY | ||
| 1656 | - | ||
| 1657 | #ifndef LIBTORRENT_NET_HANDSHAKE_MANAGER_H | ||
| 1658 | #define LIBTORRENT_NET_HANDSHAKE_MANAGER_H | ||
| 1659 | |||
| 1660 | -#include <string> | ||
| 1661 | +#include <functional> | ||
| 1662 | #include <inttypes.h> | ||
| 1663 | -#include lt_tr1_functional | ||
| 1664 | +#include <string> | ||
| 1665 | #include <rak/functional.h> | ||
| 1666 | #include <rak/unordered_vector.h> | ||
| 1667 | #include <rak/socket_address.h> | ||
| 1668 | diff --git a/src/protocol/peer_connection_base.cc b/src/protocol/peer_connection_base.cc | ||
| 1669 | index c02998fb..bd870425 100644 | ||
| 1670 | --- a/src/protocol/peer_connection_base.cc | ||
| 1671 | +++ b/src/protocol/peer_connection_base.cc | ||
| 1672 | @@ -36,8 +36,6 @@ | ||
| 1673 | |||
| 1674 | #include "config.h" | ||
| 1675 | |||
| 1676 | -#define __STDC_FORMAT_MACROS | ||
| 1677 | - | ||
| 1678 | #include <cstdio> | ||
| 1679 | #include <fcntl.h> | ||
| 1680 | #include <rak/error_number.h> | ||
| 1681 | diff --git a/src/protocol/request_list.cc b/src/protocol/request_list.cc | ||
| 1682 | index a4338bcb..ea5d388a 100644 | ||
| 1683 | --- a/src/protocol/request_list.cc | ||
| 1684 | +++ b/src/protocol/request_list.cc | ||
| 1685 | @@ -1,44 +1,8 @@ | ||
| 1686 | -// libTorrent - BitTorrent library | ||
| 1687 | -// Copyright (C) 2005-2011, Jari Sundell | ||
| 1688 | -// | ||
| 1689 | -// This program is free software; you can redistribute it and/or modify | ||
| 1690 | -// it under the terms of the GNU General Public License as published by | ||
| 1691 | -// the Free Software Foundation; either version 2 of the License, or | ||
| 1692 | -// (at your option) any later version. | ||
| 1693 | -// | ||
| 1694 | -// This program is distributed in the hope that it will be useful, | ||
| 1695 | -// but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
| 1696 | -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
| 1697 | -// GNU General Public License for more details. | ||
| 1698 | -// | ||
| 1699 | -// You should have received a copy of the GNU General Public License | ||
| 1700 | -// along with this program; if not, write to the Free Software | ||
| 1701 | -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | ||
| 1702 | -// | ||
| 1703 | -// In addition, as a special exception, the copyright holders give | ||
| 1704 | -// permission to link the code of portions of this program with the | ||
| 1705 | -// OpenSSL library under certain conditions as described in each | ||
| 1706 | -// individual source file, and distribute linked combinations | ||
| 1707 | -// including the two. | ||
| 1708 | -// | ||
| 1709 | -// You must obey the GNU General Public License in all respects for | ||
| 1710 | -// all of the code used other than OpenSSL. If you modify file(s) | ||
| 1711 | -// with this exception, you may extend this exception to your version | ||
| 1712 | -// of the file(s), but you are not obligated to do so. If you do not | ||
| 1713 | -// wish to do so, delete this exception statement from your version. | ||
| 1714 | -// If you delete this exception statement from all source files in the | ||
| 1715 | -// program, then also delete it here. | ||
| 1716 | -// | ||
| 1717 | -// Contact: Jari Sundell <jaris@ifi.uio.no> | ||
| 1718 | -// | ||
| 1719 | -// Skomakerveien 33 | ||
| 1720 | -// 3185 Skoppum, NORWAY | ||
| 1721 | - | ||
| 1722 | #include "config.h" | ||
| 1723 | |||
| 1724 | #include <algorithm> | ||
| 1725 | #include <functional> | ||
| 1726 | -#include <inttypes.h> | ||
| 1727 | +#include <cinttypes> | ||
| 1728 | #include <rak/functional.h> | ||
| 1729 | |||
| 1730 | #include "torrent/data/block.h" | ||
| 1731 | diff --git a/src/torrent/Makefile.am b/src/torrent/Makefile.am | ||
| 1732 | index 1bdfde3d..8cd26ce7 100644 | ||
| 1733 | --- a/src/torrent/Makefile.am | ||
| 1734 | +++ b/src/torrent/Makefile.am | ||
| 1735 | @@ -22,6 +22,7 @@ libsub_torrent_la_SOURCES = \ | ||
| 1736 | download_info.h \ | ||
| 1737 | error.cc \ | ||
| 1738 | error.h \ | ||
| 1739 | + event.cc \ | ||
| 1740 | event.h \ | ||
| 1741 | exceptions.cc \ | ||
| 1742 | exceptions.h \ | ||
| 1743 | diff --git a/src/torrent/common.h b/src/torrent/common.h | ||
| 1744 | index 3363143d..42cc3246 100644 | ||
| 1745 | --- a/src/torrent/common.h | ||
| 1746 | +++ b/src/torrent/common.h | ||
| 1747 | @@ -37,10 +37,13 @@ | ||
| 1748 | #ifndef LIBTORRENT_COMMON_H | ||
| 1749 | #define LIBTORRENT_COMMON_H | ||
| 1750 | |||
| 1751 | -#include <inttypes.h> | ||
| 1752 | +#include <cinttypes> | ||
| 1753 | #include <cstddef> | ||
| 1754 | |||
| 1755 | struct sockaddr; | ||
| 1756 | +struct sockaddr_in; | ||
| 1757 | +struct sockaddr_in6; | ||
| 1758 | +struct sockaddr_un; | ||
| 1759 | |||
| 1760 | namespace torrent { | ||
| 1761 | |||
| 1762 | diff --git a/src/torrent/connection_manager.h b/src/torrent/connection_manager.h | ||
| 1763 | index 2dcf2b37..cf43b0bf 100644 | ||
| 1764 | --- a/src/torrent/connection_manager.h | ||
| 1765 | +++ b/src/torrent/connection_manager.h | ||
| 1766 | @@ -39,13 +39,13 @@ | ||
| 1767 | #ifndef LIBTORRENT_CONNECTION_MANAGER_H | ||
| 1768 | #define LIBTORRENT_CONNECTION_MANAGER_H | ||
| 1769 | |||
| 1770 | +#include <functional> | ||
| 1771 | #include <list> | ||
| 1772 | #include <arpa/inet.h> | ||
| 1773 | #include <netinet/in.h> | ||
| 1774 | #include <netinet/in_systm.h> | ||
| 1775 | #include <netinet/ip.h> | ||
| 1776 | #include <sys/socket.h> | ||
| 1777 | -#include lt_tr1_functional | ||
| 1778 | #include <torrent/common.h> | ||
| 1779 | |||
| 1780 | namespace torrent { | ||
| 1781 | diff --git a/src/torrent/data/download_data.h b/src/torrent/data/download_data.h | ||
| 1782 | index 2b9c9412..fc212047 100644 | ||
| 1783 | --- a/src/torrent/data/download_data.h | ||
| 1784 | +++ b/src/torrent/data/download_data.h | ||
| 1785 | @@ -37,7 +37,7 @@ | ||
| 1786 | #ifndef LIBTORRENT_DATA_DOWNLOAD_DATA_H | ||
| 1787 | #define LIBTORRENT_DATA_DOWNLOAD_DATA_H | ||
| 1788 | |||
| 1789 | -#include lt_tr1_functional | ||
| 1790 | +#include <functional> | ||
| 1791 | |||
| 1792 | #include <torrent/common.h> | ||
| 1793 | #include <torrent/bitfield.h> | ||
| 1794 | diff --git a/src/torrent/data/file_list.cc b/src/torrent/data/file_list.cc | ||
| 1795 | index 4721bdbd..2e334fa8 100644 | ||
| 1796 | --- a/src/torrent/data/file_list.cc | ||
| 1797 | +++ b/src/torrent/data/file_list.cc | ||
| 1798 | @@ -36,8 +36,6 @@ | ||
| 1799 | |||
| 1800 | #include "config.h" | ||
| 1801 | |||
| 1802 | -#define __STDC_FORMAT_MACROS | ||
| 1803 | - | ||
| 1804 | #include <algorithm> | ||
| 1805 | #include <cstring> | ||
| 1806 | #include <functional> | ||
| 1807 | diff --git a/src/torrent/data/transfer_list.h b/src/torrent/data/transfer_list.h | ||
| 1808 | index 0a359b5e..9813af12 100644 | ||
| 1809 | --- a/src/torrent/data/transfer_list.h | ||
| 1810 | +++ b/src/torrent/data/transfer_list.h | ||
| 1811 | @@ -37,9 +37,10 @@ | ||
| 1812 | #ifndef LIBTORRENT_TRANSFER_LIST_H | ||
| 1813 | #define LIBTORRENT_TRANSFER_LIST_H | ||
| 1814 | |||
| 1815 | +#include <functional> | ||
| 1816 | #include <vector> | ||
| 1817 | + | ||
| 1818 | #include <torrent/common.h> | ||
| 1819 | -#include lt_tr1_functional | ||
| 1820 | |||
| 1821 | namespace torrent { | ||
| 1822 | |||
| 1823 | diff --git a/src/torrent/download.cc b/src/torrent/download.cc | ||
| 1824 | index edddedfb..f72c9351 100644 | ||
| 1825 | --- a/src/torrent/download.cc | ||
| 1826 | +++ b/src/torrent/download.cc | ||
| 1827 | @@ -36,9 +36,7 @@ | ||
| 1828 | |||
| 1829 | #include "config.h" | ||
| 1830 | |||
| 1831 | -#define __STDC_FORMAT_MACROS | ||
| 1832 | - | ||
| 1833 | -#include <inttypes.h> | ||
| 1834 | +#include <cinttypes> | ||
| 1835 | |||
| 1836 | #include "data/block.h" | ||
| 1837 | #include "data/block_list.h" | ||
| 1838 | diff --git a/src/torrent/download/choke_group.cc b/src/torrent/download/choke_group.cc | ||
| 1839 | index a1540fc1..d9b25a9c 100644 | ||
| 1840 | --- a/src/torrent/download/choke_group.cc | ||
| 1841 | +++ b/src/torrent/download/choke_group.cc | ||
| 1842 | @@ -37,7 +37,7 @@ | ||
| 1843 | #include "config.h" | ||
| 1844 | |||
| 1845 | #include <algorithm> | ||
| 1846 | -#include lt_tr1_functional | ||
| 1847 | +#include <functional> | ||
| 1848 | |||
| 1849 | #include "choke_group.h" | ||
| 1850 | #include "choke_queue.h" | ||
| 1851 | diff --git a/src/torrent/download/choke_group.h b/src/torrent/download/choke_group.h | ||
| 1852 | index 93fd1d02..50804b3e 100644 | ||
| 1853 | --- a/src/torrent/download/choke_group.h | ||
| 1854 | +++ b/src/torrent/download/choke_group.h | ||
| 1855 | @@ -39,7 +39,7 @@ | ||
| 1856 | |||
| 1857 | #include <string> | ||
| 1858 | #include <vector> | ||
| 1859 | -#include <inttypes.h> | ||
| 1860 | +#include <cinttypes> | ||
| 1861 | #include <torrent/common.h> | ||
| 1862 | #include <torrent/download/choke_queue.h> | ||
| 1863 | |||
| 1864 | diff --git a/src/torrent/download/choke_queue.cc b/src/torrent/download/choke_queue.cc | ||
| 1865 | index 3827e25e..7c00b686 100644 | ||
| 1866 | --- a/src/torrent/download/choke_queue.cc | ||
| 1867 | +++ b/src/torrent/download/choke_queue.cc | ||
| 1868 | @@ -37,10 +37,9 @@ | ||
| 1869 | #include "config.h" | ||
| 1870 | |||
| 1871 | #include <algorithm> | ||
| 1872 | +#include <cstdlib> | ||
| 1873 | #include <functional> | ||
| 1874 | #include <numeric> | ||
| 1875 | -#include <cstdlib> | ||
| 1876 | -#include lt_tr1_functional | ||
| 1877 | #include <rak/functional.h> | ||
| 1878 | |||
| 1879 | #include "protocol/peer_connection_base.h" | ||
| 1880 | diff --git a/src/torrent/download/choke_queue.h b/src/torrent/download/choke_queue.h | ||
| 1881 | index 973f6522..5e274a99 100644 | ||
| 1882 | --- a/src/torrent/download/choke_queue.h | ||
| 1883 | +++ b/src/torrent/download/choke_queue.h | ||
| 1884 | @@ -39,10 +39,11 @@ | ||
| 1885 | |||
| 1886 | #include <torrent/common.h> | ||
| 1887 | |||
| 1888 | +#include <cinttypes> | ||
| 1889 | +#include <functional> | ||
| 1890 | #include <list> | ||
| 1891 | #include <vector> | ||
| 1892 | -#include <inttypes.h> | ||
| 1893 | -#include lt_tr1_functional | ||
| 1894 | + | ||
| 1895 | #include <torrent/download/group_entry.h> | ||
| 1896 | |||
| 1897 | namespace torrent { | ||
| 1898 | diff --git a/src/torrent/download/group_entry.h b/src/torrent/download/group_entry.h | ||
| 1899 | index e167ecbb..a7c9e429 100644 | ||
| 1900 | --- a/src/torrent/download/group_entry.h | ||
| 1901 | +++ b/src/torrent/download/group_entry.h | ||
| 1902 | @@ -38,8 +38,9 @@ | ||
| 1903 | #define LIBTORRENT_DOWNLOAD_GROUP_ENTRY_H | ||
| 1904 | |||
| 1905 | #include <algorithm> | ||
| 1906 | +#include <functional> | ||
| 1907 | #include <vector> | ||
| 1908 | -#include lt_tr1_functional | ||
| 1909 | + | ||
| 1910 | #include <torrent/common.h> | ||
| 1911 | #include <torrent/exceptions.h> | ||
| 1912 | |||
| 1913 | diff --git a/src/torrent/download/resource_manager.cc b/src/torrent/download/resource_manager.cc | ||
| 1914 | index bc6374d2..51434c91 100644 | ||
| 1915 | --- a/src/torrent/download/resource_manager.cc | ||
| 1916 | +++ b/src/torrent/download/resource_manager.cc | ||
| 1917 | @@ -38,7 +38,6 @@ | ||
| 1918 | |||
| 1919 | #include <algorithm> | ||
| 1920 | #include <functional> | ||
| 1921 | -#include lt_tr1_functional | ||
| 1922 | #include <limits> | ||
| 1923 | #include <numeric> | ||
| 1924 | #include <rak/functional.h> | ||
| 1925 | diff --git a/src/torrent/download/resource_manager.h b/src/torrent/download/resource_manager.h | ||
| 1926 | index b2f861af..ba61b45f 100644 | ||
| 1927 | --- a/src/torrent/download/resource_manager.h | ||
| 1928 | +++ b/src/torrent/download/resource_manager.h | ||
| 1929 | @@ -39,7 +39,7 @@ | ||
| 1930 | |||
| 1931 | #include <string> | ||
| 1932 | #include <vector> | ||
| 1933 | -#include <inttypes.h> | ||
| 1934 | +#include <cinttypes> | ||
| 1935 | #include <torrent/common.h> | ||
| 1936 | |||
| 1937 | namespace torrent { | ||
| 1938 | diff --git a/src/torrent/download_info.h b/src/torrent/download_info.h | ||
| 1939 | index 341e4c25..2c4dbaf2 100644 | ||
| 1940 | --- a/src/torrent/download_info.h | ||
| 1941 | +++ b/src/torrent/download_info.h | ||
| 1942 | @@ -37,10 +37,10 @@ | ||
| 1943 | #ifndef LIBTORRENT_DOWNLOAD_INFO_H | ||
| 1944 | #define LIBTORRENT_DOWNLOAD_INFO_H | ||
| 1945 | |||
| 1946 | +#include <cinttypes> | ||
| 1947 | +#include <functional> | ||
| 1948 | #include <list> | ||
| 1949 | #include <string> | ||
| 1950 | -#include <inttypes.h> | ||
| 1951 | -#include lt_tr1_functional | ||
| 1952 | |||
| 1953 | #include <torrent/rate.h> | ||
| 1954 | #include <torrent/hash_string.h> | ||
| 1955 | diff --git a/src/torrent/error.cc b/src/torrent/error.cc | ||
| 1956 | index 5010c803..eea9bb83 100644 | ||
| 1957 | --- a/src/torrent/error.cc | ||
| 1958 | +++ b/src/torrent/error.cc | ||
| 1959 | @@ -54,11 +54,15 @@ static const char* errorStrings[e_last + 1] = { | ||
| 1960 | "unencrypted connection rejected", // eh_unencrypted_rejected | ||
| 1961 | "invalid encryption method", // eh_invalid_encryption | ||
| 1962 | "encryption sync failed", // eh_encryption_sync_failed | ||
| 1963 | - "network error", // eh_network_error | ||
| 1964 | + "<deprecated>", // eh_ | ||
| 1965 | "network unreachable", // eh_network_unreachable | ||
| 1966 | "network timeout", // eh_network_timeout | ||
| 1967 | "invalid message order", // eh_invalid_order | ||
| 1968 | "too many failed chunks", // eh_toomanyfailed | ||
| 1969 | + "no peer info", // eh_no_peer_info | ||
| 1970 | + "network socket error", // eh_network_socket_error | ||
| 1971 | + "network read error", // eh_network_read_error | ||
| 1972 | + "network write error", // eh_network_write_error | ||
| 1973 | |||
| 1974 | // "", // e_handshake_incoming | ||
| 1975 | // "", // e_handshake_outgoing | ||
| 1976 | diff --git a/src/torrent/error.h b/src/torrent/error.h | ||
| 1977 | index f3fac463..295a595b 100644 | ||
| 1978 | --- a/src/torrent/error.h | ||
| 1979 | +++ b/src/torrent/error.h | ||
| 1980 | @@ -55,11 +55,14 @@ const int e_handshake_invalid_value = 8; | ||
| 1981 | const int e_handshake_unencrypted_rejected = 9; | ||
| 1982 | const int e_handshake_invalid_encryption = 10; | ||
| 1983 | const int e_handshake_encryption_sync_failed = 11; | ||
| 1984 | -const int e_handshake_network_error = 12; | ||
| 1985 | const int e_handshake_network_unreachable = 13; | ||
| 1986 | const int e_handshake_network_timeout = 14; | ||
| 1987 | const int e_handshake_invalid_order = 15; | ||
| 1988 | const int e_handshake_toomanyfailed = 16; | ||
| 1989 | +const int e_handshake_no_peer_info = 17; | ||
| 1990 | +const int e_handshake_network_socket_error = 18; | ||
| 1991 | +const int e_handshake_network_read_error = 19; | ||
| 1992 | +const int e_handshake_network_write_error = 20; | ||
| 1993 | |||
| 1994 | // const int e_handshake_incoming = 13; | ||
| 1995 | // const int e_handshake_outgoing = 14; | ||
| 1996 | @@ -69,7 +72,7 @@ const int e_handshake_toomanyfailed = 16; | ||
| 1997 | // const int e_handshake_retry_plaintext = 18; | ||
| 1998 | // const int e_handshake_retry_encrypted = 19; | ||
| 1999 | |||
| 2000 | -const int e_last = 16; | ||
| 2001 | +const int e_last = 20; | ||
| 2002 | |||
| 2003 | const char* strerror(int err) LIBTORRENT_EXPORT; | ||
| 2004 | |||
| 2005 | diff --git a/src/torrent/event.cc b/src/torrent/event.cc | ||
| 2006 | new file mode 100644 | ||
| 2007 | index 00000000..e68974ea | ||
| 2008 | --- /dev/null | ||
| 2009 | +++ b/src/torrent/event.cc | ||
| 2010 | @@ -0,0 +1,19 @@ | ||
| 2011 | +#include "config.h" | ||
| 2012 | + | ||
| 2013 | +#include "event.h" | ||
| 2014 | + | ||
| 2015 | +#include "torrent/exceptions.h" | ||
| 2016 | +#include "torrent/net/fd.h" | ||
| 2017 | + | ||
| 2018 | +namespace torrent { | ||
| 2019 | + | ||
| 2020 | +void | ||
| 2021 | +Event::close_file_descriptor() { | ||
| 2022 | + if (!is_open()) | ||
| 2023 | + throw internal_error("Tried to close already closed file descriptor on event type " + std::string(type_name())); | ||
| 2024 | + | ||
| 2025 | + fd_close(m_fileDesc); | ||
| 2026 | + m_fileDesc = -1; | ||
| 2027 | +} | ||
| 2028 | + | ||
| 2029 | +} | ||
| 2030 | diff --git a/src/torrent/event.h b/src/torrent/event.h | ||
| 2031 | index f3549762..73f87e46 100644 | ||
| 2032 | --- a/src/torrent/event.h | ||
| 2033 | +++ b/src/torrent/event.h | ||
| 2034 | @@ -1,39 +1,3 @@ | ||
| 2035 | -// libTorrent - BitTorrent library | ||
| 2036 | -// Copyright (C) 2005-2011, Jari Sundell | ||
| 2037 | -// | ||
| 2038 | -// This program is free software; you can redistribute it and/or modify | ||
| 2039 | -// it under the terms of the GNU General Public License as published by | ||
| 2040 | -// the Free Software Foundation; either version 2 of the License, or | ||
| 2041 | -// (at your option) any later version. | ||
| 2042 | -// | ||
| 2043 | -// This program is distributed in the hope that it will be useful, | ||
| 2044 | -// but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
| 2045 | -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
| 2046 | -// GNU General Public License for more details. | ||
| 2047 | -// | ||
| 2048 | -// You should have received a copy of the GNU General Public License | ||
| 2049 | -// along with this program; if not, write to the Free Software | ||
| 2050 | -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | ||
| 2051 | -// | ||
| 2052 | -// In addition, as a special exception, the copyright holders give | ||
| 2053 | -// permission to link the code of portions of this program with the | ||
| 2054 | -// OpenSSL library under certain conditions as described in each | ||
| 2055 | -// individual source file, and distribute linked combinations | ||
| 2056 | -// including the two. | ||
| 2057 | -// | ||
| 2058 | -// You must obey the GNU General Public License in all respects for | ||
| 2059 | -// all of the code used other than OpenSSL. If you modify file(s) | ||
| 2060 | -// with this exception, you may extend this exception to your version | ||
| 2061 | -// of the file(s), but you are not obligated to do so. If you do not | ||
| 2062 | -// wish to do so, delete this exception statement from your version. | ||
| 2063 | -// If you delete this exception statement from all source files in the | ||
| 2064 | -// program, then also delete it here. | ||
| 2065 | -// | ||
| 2066 | -// Contact: Jari Sundell <jaris@ifi.uio.no> | ||
| 2067 | -// | ||
| 2068 | -// Skomakerveien 33 | ||
| 2069 | -// 3185 Skoppum, NORWAY | ||
| 2070 | - | ||
| 2071 | #ifndef LIBTORRENT_TORRENT_EVENT_H | ||
| 2072 | #define LIBTORRENT_TORRENT_EVENT_H | ||
| 2073 | |||
| 2074 | @@ -43,26 +7,48 @@ namespace torrent { | ||
| 2075 | |||
| 2076 | class LIBTORRENT_EXPORT Event { | ||
| 2077 | public: | ||
| 2078 | - virtual ~Event() {} | ||
| 2079 | + Event(); | ||
| 2080 | + virtual ~Event(); | ||
| 2081 | |||
| 2082 | - // These are not virtual as the fd is heavily used in select based | ||
| 2083 | - // polling, thus fast access is critical to performance. | ||
| 2084 | - int file_descriptor() const { return m_fileDesc; } | ||
| 2085 | + // TODO: Disable override. | ||
| 2086 | + bool is_open() const; | ||
| 2087 | |||
| 2088 | - virtual void event_read() = 0; | ||
| 2089 | - virtual void event_write() = 0; | ||
| 2090 | - virtual void event_error() = 0; | ||
| 2091 | + int file_descriptor() const; | ||
| 2092 | |||
| 2093 | - // Require all event types to define this function. | ||
| 2094 | - virtual const char* type_name() const { return "default"; } | ||
| 2095 | + virtual void event_read() = 0; | ||
| 2096 | + virtual void event_write() = 0; | ||
| 2097 | + virtual void event_error() = 0; | ||
| 2098 | |||
| 2099 | - // Event closed? | ||
| 2100 | + // TODO: Require all to define their ownh typename. | ||
| 2101 | + virtual const char* type_name() const { return "default"; } | ||
| 2102 | |||
| 2103 | protected: | ||
| 2104 | - int m_fileDesc; | ||
| 2105 | - bool m_ipv6_socket; | ||
| 2106 | + void close_file_descriptor(); | ||
| 2107 | + void set_file_descriptor(int fd); | ||
| 2108 | + | ||
| 2109 | + int m_fileDesc; | ||
| 2110 | + | ||
| 2111 | + // TODO: Deprecate. | ||
| 2112 | + bool m_ipv6_socket; | ||
| 2113 | }; | ||
| 2114 | |||
| 2115 | +inline Event::Event() : m_fileDesc(-1), m_ipv6_socket(false) {} | ||
| 2116 | +inline Event::~Event() {} | ||
| 2117 | +inline bool Event::is_open() const { return file_descriptor() != -1; } | ||
| 2118 | +inline int Event::file_descriptor() const { return m_fileDesc; } | ||
| 2119 | +inline void Event::set_file_descriptor(int fd) { m_fileDesc = fd; } | ||
| 2120 | + | ||
| 2121 | +// Defined in 'src/globals.cc'. | ||
| 2122 | +[[gnu::weak]] void poll_event_open(Event* event) LIBTORRENT_EXPORT; | ||
| 2123 | +[[gnu::weak]] void poll_event_close(Event* event) LIBTORRENT_EXPORT; | ||
| 2124 | +[[gnu::weak]] void poll_event_closed(Event* event) LIBTORRENT_EXPORT; | ||
| 2125 | +[[gnu::weak]] void poll_event_insert_read(Event* event) LIBTORRENT_EXPORT; | ||
| 2126 | +[[gnu::weak]] void poll_event_insert_write(Event* event) LIBTORRENT_EXPORT; | ||
| 2127 | +[[gnu::weak]] void poll_event_insert_error(Event* event) LIBTORRENT_EXPORT; | ||
| 2128 | +[[gnu::weak]] void poll_event_remove_read(Event* event) LIBTORRENT_EXPORT; | ||
| 2129 | +[[gnu::weak]] void poll_event_remove_write(Event* event) LIBTORRENT_EXPORT; | ||
| 2130 | +[[gnu::weak]] void poll_event_remove_error(Event* event) LIBTORRENT_EXPORT; | ||
| 2131 | + | ||
| 2132 | } | ||
| 2133 | |||
| 2134 | #endif | ||
| 2135 | diff --git a/src/torrent/http.h b/src/torrent/http.h | ||
| 2136 | index c68d3933..c605afa5 100644 | ||
| 2137 | --- a/src/torrent/http.h | ||
| 2138 | +++ b/src/torrent/http.h | ||
| 2139 | @@ -38,9 +38,9 @@ | ||
| 2140 | #define LIBTORRENT_HTTP_H | ||
| 2141 | |||
| 2142 | #include <string> | ||
| 2143 | +#include <functional> | ||
| 2144 | #include <iosfwd> | ||
| 2145 | #include <list> | ||
| 2146 | -#include lt_tr1_functional | ||
| 2147 | #include <torrent/common.h> | ||
| 2148 | |||
| 2149 | namespace torrent { | ||
| 2150 | diff --git a/src/torrent/net/Makefile.am b/src/torrent/net/Makefile.am | ||
| 2151 | index 51999d19..35dd4774 100644 | ||
| 2152 | --- a/src/torrent/net/Makefile.am | ||
| 2153 | +++ b/src/torrent/net/Makefile.am | ||
| 2154 | @@ -1,11 +1,25 @@ | ||
| 2155 | noinst_LTLIBRARIES = libsub_torrentnet.la | ||
| 2156 | |||
| 2157 | libsub_torrentnet_la_SOURCES = \ | ||
| 2158 | + address_info.cc \ | ||
| 2159 | + address_info.h \ | ||
| 2160 | + fd.cc \ | ||
| 2161 | + fd.h \ | ||
| 2162 | + socket_address.cc \ | ||
| 2163 | + socket_address.h \ | ||
| 2164 | socket_address_key.cc \ | ||
| 2165 | - socket_address_key.h | ||
| 2166 | + socket_address_key.h \ | ||
| 2167 | + socket_event.cc \ | ||
| 2168 | + socket_event.h \ | ||
| 2169 | + types.h | ||
| 2170 | |||
| 2171 | AM_CPPFLAGS = -I$(srcdir) -I$(srcdir)/.. -I$(srcdir)/../.. -I$(top_srcdir) | ||
| 2172 | |||
| 2173 | libtorrentincludedir = $(includedir)/torrent/net | ||
| 2174 | libtorrentinclude_HEADERS = \ | ||
| 2175 | - socket_address_key.h | ||
| 2176 | + address_info.h \ | ||
| 2177 | + fd.h \ | ||
| 2178 | + socket_address.h \ | ||
| 2179 | + socket_address_key.h \ | ||
| 2180 | + socket_event.h \ | ||
| 2181 | + types.h | ||
| 2182 | diff --git a/src/torrent/net/address_info.cc b/src/torrent/net/address_info.cc | ||
| 2183 | new file mode 100644 | ||
| 2184 | index 00000000..25a51ebd | ||
| 2185 | --- /dev/null | ||
| 2186 | +++ b/src/torrent/net/address_info.cc | ||
| 2187 | @@ -0,0 +1,43 @@ | ||
| 2188 | +#include "config.h" | ||
| 2189 | + | ||
| 2190 | +#include "address_info.h" | ||
| 2191 | + | ||
| 2192 | +namespace torrent { | ||
| 2193 | + | ||
| 2194 | +int | ||
| 2195 | +ai_get_addrinfo(const char* nodename, const char* servname, const addrinfo* hints, ai_unique_ptr& res) { | ||
| 2196 | + addrinfo* ai; | ||
| 2197 | + int err = ::getaddrinfo(nodename, servname, hints, &ai); | ||
| 2198 | + | ||
| 2199 | + if (err != 0) | ||
| 2200 | + return err; | ||
| 2201 | + | ||
| 2202 | + res.reset(ai); | ||
| 2203 | + return 0; | ||
| 2204 | +} | ||
| 2205 | + | ||
| 2206 | +sa_unique_ptr | ||
| 2207 | +ai_get_first_sa(const char* nodename, const char* servname, const addrinfo* hints) { | ||
| 2208 | + ai_unique_ptr aip; | ||
| 2209 | + | ||
| 2210 | + if (ai_get_addrinfo(nodename, servname, hints, aip) != 0) | ||
| 2211 | + return nullptr; | ||
| 2212 | + | ||
| 2213 | + return sa_copy(aip->ai_addr); | ||
| 2214 | +} | ||
| 2215 | + | ||
| 2216 | +int | ||
| 2217 | +ai_each_inet_inet6_first(const char* nodename, ai_sockaddr_func lambda) { | ||
| 2218 | + int err; | ||
| 2219 | + ai_unique_ptr ai; | ||
| 2220 | + | ||
| 2221 | + // TODO: Change to a single call using hints with both inet/inet6. | ||
| 2222 | + if ((err = ai_get_addrinfo(nodename, NULL, ai_make_hint(0, PF_INET, SOCK_STREAM).get(), ai)) != 0 && | ||
| 2223 | + (err = ai_get_addrinfo(nodename, NULL, ai_make_hint(0, PF_INET6, SOCK_STREAM).get(), ai)) != 0) | ||
| 2224 | + return err; | ||
| 2225 | + | ||
| 2226 | + lambda(ai->ai_addr); | ||
| 2227 | + return 0; | ||
| 2228 | +} | ||
| 2229 | + | ||
| 2230 | +} | ||
| 2231 | diff --git a/src/torrent/net/address_info.h b/src/torrent/net/address_info.h | ||
| 2232 | new file mode 100644 | ||
| 2233 | index 00000000..c0b1c082 | ||
| 2234 | --- /dev/null | ||
| 2235 | +++ b/src/torrent/net/address_info.h | ||
| 2236 | @@ -0,0 +1,69 @@ | ||
| 2237 | +#ifndef LIBTORRENT_NET_ADDRESS_INFO_H | ||
| 2238 | +#define LIBTORRENT_NET_ADDRESS_INFO_H | ||
| 2239 | + | ||
| 2240 | +#include <cstring> | ||
| 2241 | +#include <functional> | ||
| 2242 | +#include <memory> | ||
| 2243 | +#include <string> | ||
| 2244 | +#include <netdb.h> | ||
| 2245 | +#include <torrent/common.h> | ||
| 2246 | +#include <torrent/net/socket_address.h> | ||
| 2247 | + | ||
| 2248 | +namespace torrent { | ||
| 2249 | + | ||
| 2250 | +struct ai_deleter { | ||
| 2251 | + void operator()(addrinfo* ai) const { freeaddrinfo(ai); } | ||
| 2252 | +}; | ||
| 2253 | + | ||
| 2254 | +typedef std::unique_ptr<addrinfo, ai_deleter> ai_unique_ptr; | ||
| 2255 | +typedef std::unique_ptr<const addrinfo, ai_deleter> c_ai_unique_ptr; | ||
| 2256 | +typedef std::function<void (const sockaddr*)> ai_sockaddr_func; | ||
| 2257 | + | ||
| 2258 | +inline void ai_clear(addrinfo* ai); | ||
| 2259 | +inline ai_unique_ptr ai_make_hint(int flags, int family, int socktype); | ||
| 2260 | + | ||
| 2261 | +int ai_get_addrinfo(const char* nodename, const char* servname, const addrinfo* hints, ai_unique_ptr& res) LIBTORRENT_EXPORT; | ||
| 2262 | + | ||
| 2263 | +// Helper functions: | ||
| 2264 | + | ||
| 2265 | +// TODO: Consider servname "0". | ||
| 2266 | +// TODO: ai_get_first_sa_err that returns a tuple? | ||
| 2267 | +sa_unique_ptr ai_get_first_sa(const char* nodename, const char* servname = nullptr, const addrinfo* hints = nullptr) LIBTORRENT_EXPORT; | ||
| 2268 | + | ||
| 2269 | +int ai_each_inet_inet6_first(const char* nodename, ai_sockaddr_func lambda) LIBTORRENT_EXPORT; | ||
| 2270 | + | ||
| 2271 | +// Get all addrinfo's, iterate, etc. | ||
| 2272 | + | ||
| 2273 | +// | ||
| 2274 | +// Safe conversion from unique_ptr arguments: | ||
| 2275 | +// | ||
| 2276 | + | ||
| 2277 | +inline void aip_clear(ai_unique_ptr& aip) { return ai_clear(aip.get()); } | ||
| 2278 | + | ||
| 2279 | +inline int aip_get_addrinfo(const char* nodename, const char* servname, const ai_unique_ptr& hints, ai_unique_ptr& res) { return ai_get_addrinfo(nodename, servname, hints.get(), res); } | ||
| 2280 | +inline int aip_get_addrinfo(const char* nodename, const char* servname, const c_ai_unique_ptr& hints, ai_unique_ptr& res) { return ai_get_addrinfo(nodename, servname, hints.get(), res); } | ||
| 2281 | + | ||
| 2282 | +// | ||
| 2283 | +// Implementations: | ||
| 2284 | +// | ||
| 2285 | + | ||
| 2286 | +inline void | ||
| 2287 | +ai_clear(addrinfo* ai) { | ||
| 2288 | + std::memset(ai, 0, sizeof(addrinfo)); | ||
| 2289 | +} | ||
| 2290 | + | ||
| 2291 | +inline ai_unique_ptr | ||
| 2292 | +ai_make_hint(int flags, int family, int socktype) { | ||
| 2293 | + ai_unique_ptr aip(new addrinfo); | ||
| 2294 | + | ||
| 2295 | + aip_clear(aip); | ||
| 2296 | + aip->ai_flags = flags; | ||
| 2297 | + aip->ai_family = family; | ||
| 2298 | + aip->ai_socktype = socktype; | ||
| 2299 | + | ||
| 2300 | + return aip; | ||
| 2301 | +} | ||
| 2302 | + | ||
| 2303 | +} | ||
| 2304 | + | ||
| 2305 | +#endif | ||
| 2306 | diff --git a/src/torrent/net/fd.cc b/src/torrent/net/fd.cc | ||
| 2307 | new file mode 100644 | ||
| 2308 | index 00000000..07c91779 | ||
| 2309 | --- /dev/null | ||
| 2310 | +++ b/src/torrent/net/fd.cc | ||
| 2311 | @@ -0,0 +1,209 @@ | ||
| 2312 | +#include "config.h" | ||
| 2313 | + | ||
| 2314 | +#include "fd.h" | ||
| 2315 | + | ||
| 2316 | +#include <cerrno> | ||
| 2317 | +#include <fcntl.h> | ||
| 2318 | +#include <unistd.h> | ||
| 2319 | +#include <netinet/in.h> | ||
| 2320 | +#include <netinet/in_systm.h> | ||
| 2321 | +#include <netinet/ip.h> | ||
| 2322 | + | ||
| 2323 | +#include "torrent/exceptions.h" | ||
| 2324 | +#include "torrent/net/socket_address.h" | ||
| 2325 | +#include "torrent/utils/log.h" | ||
| 2326 | + | ||
| 2327 | +#define LT_LOG(log_fmt, ...) \ | ||
| 2328 | + lt_log_print(LOG_CONNECTION_FD, "fd: " log_fmt, __VA_ARGS__); | ||
| 2329 | +#define LT_LOG_FLAG(log_fmt) \ | ||
| 2330 | + lt_log_print(LOG_CONNECTION_FD, "fd: " log_fmt " (flags:0x%x)", flags); | ||
| 2331 | +#define LT_LOG_FLAG_ERROR(log_fmt) \ | ||
| 2332 | + lt_log_print(LOG_CONNECTION_FD, "fd: " log_fmt " (flags:0x%x errno:%i message:'%s')", \ | ||
| 2333 | + flags, errno, std::strerror(errno)); | ||
| 2334 | +#define LT_LOG_FD(log_fmt) \ | ||
| 2335 | + lt_log_print(LOG_CONNECTION_FD, "fd->%i: " log_fmt, fd); | ||
| 2336 | +#define LT_LOG_FD_ERROR(log_fmt) \ | ||
| 2337 | + lt_log_print(LOG_CONNECTION_FD, "fd->%i: " log_fmt " (errno:%i message:'%s')", \ | ||
| 2338 | + fd, errno, std::strerror(errno)); | ||
| 2339 | +#define LT_LOG_FD_SOCKADDR(log_fmt) \ | ||
| 2340 | + lt_log_print(LOG_CONNECTION_FD, "fd->%i: " log_fmt " (address:%s)", \ | ||
| 2341 | + fd, sa_pretty_str(sa).c_str()); | ||
| 2342 | +#define LT_LOG_FD_SOCKADDR_ERROR(log_fmt) \ | ||
| 2343 | + lt_log_print(LOG_CONNECTION_FD, "fd->%i: " log_fmt " (address:%s errno:%i message:'%s')", \ | ||
| 2344 | + fd, sa_pretty_str(sa).c_str(), errno, std::strerror(errno)); | ||
| 2345 | +#define LT_LOG_FD_FLAG(log_fmt) \ | ||
| 2346 | + lt_log_print(LOG_CONNECTION_FD, "fd->%i: " log_fmt " (flags:0x%x)", fd, flags); | ||
| 2347 | +#define LT_LOG_FD_FLAG_ERROR(log_fmt) \ | ||
| 2348 | + lt_log_print(LOG_CONNECTION_FD, "fd->%i: " log_fmt " (flags:0x%x errno:%i message:'%s')", \ | ||
| 2349 | + fd, flags, errno, std::strerror(errno)); | ||
| 2350 | +#define LT_LOG_FD_VALUE(log_fmt, value) \ | ||
| 2351 | + lt_log_print(LOG_CONNECTION_FD, "fd->%i: " log_fmt " (value:%i)", fd, (int)value); | ||
| 2352 | +#define LT_LOG_FD_VALUE_ERROR(log_fmt, value) \ | ||
| 2353 | + lt_log_print(LOG_CONNECTION_FD, "fd->%i: " log_fmt " (value:%i errno:%i message:'%s')", \ | ||
| 2354 | + fd, (int)value, errno, std::strerror(errno)); | ||
| 2355 | + | ||
| 2356 | +namespace torrent { | ||
| 2357 | + | ||
| 2358 | +int fd__accept(int socket, sockaddr *address, socklen_t *address_len) { return ::accept(socket, address, address_len); } | ||
| 2359 | +int fd__bind(int socket, const sockaddr *address, socklen_t address_len) { return ::bind(socket, address, address_len); } | ||
| 2360 | +int fd__close(int fildes) { return ::close(fildes); } | ||
| 2361 | +int fd__connect(int socket, const sockaddr *address, socklen_t address_len) { return ::connect(socket, address, address_len); } | ||
| 2362 | +int fd__fcntl_int(int fildes, int cmd, int arg) { return ::fcntl(fildes, cmd, arg); } | ||
| 2363 | +int fd__listen(int socket, int backlog) { return ::listen(socket, backlog); } | ||
| 2364 | +int fd__setsockopt_int(int socket, int level, int option_name, int option_value) { return ::setsockopt(socket, level, option_name, &option_value, sizeof(int)); } | ||
| 2365 | +int fd__socket(int domain, int type, int protocol) { return ::socket(domain, type, protocol); } | ||
| 2366 | + | ||
| 2367 | +int | ||
| 2368 | +fd_open(fd_flags flags) { | ||
| 2369 | + int domain; | ||
| 2370 | + int protocol; | ||
| 2371 | + | ||
| 2372 | + if (!fd_valid_flags(flags)) | ||
| 2373 | + throw internal_error("torrent::fd_open failed: invalid fd_flags"); | ||
| 2374 | + | ||
| 2375 | + if ((flags & fd_flag_stream)) { | ||
| 2376 | + domain = SOCK_STREAM; | ||
| 2377 | + protocol = IPPROTO_TCP; | ||
| 2378 | + } else { | ||
| 2379 | + LT_LOG_FLAG("fd_open missing socket type"); | ||
| 2380 | + errno = EINVAL; | ||
| 2381 | + return -1; | ||
| 2382 | + } | ||
| 2383 | + | ||
| 2384 | + int fd = -1; | ||
| 2385 | + | ||
| 2386 | + if (fd == -1 && !(flags & fd_flag_v4only)) { | ||
| 2387 | + LT_LOG_FLAG("fd_open opening ipv6 socket"); | ||
| 2388 | + fd = fd__socket(PF_INET6, domain, protocol); | ||
| 2389 | + } | ||
| 2390 | + | ||
| 2391 | + if (fd == -1 && !(flags & fd_flag_v6only)) { | ||
| 2392 | + LT_LOG_FLAG("fd_open opening ipv4 socket"); | ||
| 2393 | + fd = fd__socket(PF_INET, domain, protocol); | ||
| 2394 | + } | ||
| 2395 | + | ||
| 2396 | + if (fd == -1) { | ||
| 2397 | + LT_LOG_FLAG_ERROR("fd_open failed to open socket"); | ||
| 2398 | + return -1; | ||
| 2399 | + } | ||
| 2400 | + | ||
| 2401 | + if ((flags & fd_flag_v6only) && !fd_set_v6only(fd, true)) { | ||
| 2402 | + LT_LOG_FD_FLAG_ERROR("fd_open failed to set v6only"); | ||
| 2403 | + fd_close(fd); | ||
| 2404 | + return -1; | ||
| 2405 | + } | ||
| 2406 | + | ||
| 2407 | + if ((flags & fd_flag_nonblock) && !fd_set_nonblock(fd)) { | ||
| 2408 | + LT_LOG_FD_FLAG_ERROR("fd_open failed to set nonblock"); | ||
| 2409 | + fd_close(fd); | ||
| 2410 | + return -1; | ||
| 2411 | + } | ||
| 2412 | + | ||
| 2413 | + if ((flags & fd_flag_reuse_address) && !fd_set_reuse_address(fd, true)) { | ||
| 2414 | + LT_LOG_FD_FLAG_ERROR("fd_open failed to set reuse_address"); | ||
| 2415 | + fd_close(fd); | ||
| 2416 | + return -1; | ||
| 2417 | + } | ||
| 2418 | + | ||
| 2419 | + LT_LOG_FD_FLAG("fd_open succeeded"); | ||
| 2420 | + return fd; | ||
| 2421 | +} | ||
| 2422 | + | ||
| 2423 | +void | ||
| 2424 | +fd_close(int fd) { | ||
| 2425 | + if (fd == STDIN_FILENO || fd == STDOUT_FILENO || fd == STDERR_FILENO) | ||
| 2426 | + throw internal_error("torrent::fd_close: tried to close stdin/out/err"); | ||
| 2427 | + | ||
| 2428 | + if (fd__close(fd) == -1) | ||
| 2429 | + throw internal_error("torrent::fd_close: " + std::string(strerror(errno))); | ||
| 2430 | + | ||
| 2431 | + LT_LOG_FD("fd_close succeeded"); | ||
| 2432 | +} | ||
| 2433 | + | ||
| 2434 | +fd_sap_tuple | ||
| 2435 | +fd_accept(int fd) { | ||
| 2436 | + sa_unique_ptr sap = sa_make_inet6(); | ||
| 2437 | + socklen_t socklen = sap_length(sap); | ||
| 2438 | + | ||
| 2439 | + int accept_fd = fd__accept(fd, sap.get(), &socklen); | ||
| 2440 | + | ||
| 2441 | + if (accept_fd == -1) { | ||
| 2442 | + LT_LOG_FD_ERROR("fd_accept failed"); | ||
| 2443 | + return fd_sap_tuple{-1, nullptr}; | ||
| 2444 | + } | ||
| 2445 | + | ||
| 2446 | + return fd_sap_tuple{accept_fd, std::move(sap)}; | ||
| 2447 | +} | ||
| 2448 | + | ||
| 2449 | +bool | ||
| 2450 | +fd_bind(int fd, const sockaddr* sa) { | ||
| 2451 | + if (fd__bind(fd, sa, sa_length(sa)) == -1) { | ||
| 2452 | + LT_LOG_FD_SOCKADDR_ERROR("fd_bind failed"); | ||
| 2453 | + return false; | ||
| 2454 | + } | ||
| 2455 | + | ||
| 2456 | + LT_LOG_FD_SOCKADDR("fd_bind succeeded"); | ||
| 2457 | + return true; | ||
| 2458 | +} | ||
| 2459 | + | ||
| 2460 | +bool | ||
| 2461 | +fd_connect(int fd, const sockaddr* sa) { | ||
| 2462 | + if (fd__connect(fd, sa, sa_length(sa)) == 0) { | ||
| 2463 | + LT_LOG_FD_SOCKADDR("fd_connect succeeded"); | ||
| 2464 | + return true; | ||
| 2465 | + } | ||
| 2466 | + | ||
| 2467 | + if (errno == EINPROGRESS) { | ||
| 2468 | + LT_LOG_FD_SOCKADDR("fd_connect succeeded and in progress"); | ||
| 2469 | + return true; | ||
| 2470 | + } | ||
| 2471 | + | ||
| 2472 | + LT_LOG_FD_SOCKADDR_ERROR("fd_connect failed"); | ||
| 2473 | + return false; | ||
| 2474 | +} | ||
| 2475 | + | ||
| 2476 | +bool | ||
| 2477 | +fd_listen(int fd, int backlog) { | ||
| 2478 | + if (fd__listen(fd, backlog) == -1) { | ||
| 2479 | + LT_LOG_FD_VALUE_ERROR("fd_listen failed", backlog); | ||
| 2480 | + return false; | ||
| 2481 | + } | ||
| 2482 | + | ||
| 2483 | + LT_LOG_FD_VALUE("fd_listen succeeded", backlog); | ||
| 2484 | + return true; | ||
| 2485 | +} | ||
| 2486 | + | ||
| 2487 | +bool | ||
| 2488 | +fd_set_nonblock(int fd) { | ||
| 2489 | + if (fd__fcntl_int(fd, F_SETFL, O_NONBLOCK) == -1) { | ||
| 2490 | + LT_LOG_FD_ERROR("fd_set_nonblock failed"); | ||
| 2491 | + return false; | ||
| 2492 | + } | ||
| 2493 | + | ||
| 2494 | + LT_LOG_FD("fd_set_nonblock succeeded"); | ||
| 2495 | + return true; | ||
| 2496 | +} | ||
| 2497 | + | ||
| 2498 | +bool | ||
| 2499 | +fd_set_reuse_address(int fd, bool state) { | ||
| 2500 | + if (fd__setsockopt_int(fd, SOL_SOCKET, SO_REUSEADDR, state) == -1) { | ||
| 2501 | + LT_LOG_FD_VALUE_ERROR("fd_set_reuse_address failed", state); | ||
| 2502 | + return false; | ||
| 2503 | + } | ||
| 2504 | + | ||
| 2505 | + LT_LOG_FD_VALUE("fd_set_reuse_address succeeded", state); | ||
| 2506 | + return true; | ||
| 2507 | +} | ||
| 2508 | + | ||
| 2509 | +bool | ||
| 2510 | +fd_set_v6only(int fd, bool state) { | ||
| 2511 | + if (fd__setsockopt_int(fd, IPPROTO_IPV6, IPV6_V6ONLY, state) == -1) { | ||
| 2512 | + LT_LOG_FD_VALUE_ERROR("fd_set_v6only failed", state); | ||
| 2513 | + return false; | ||
| 2514 | + } | ||
| 2515 | + | ||
| 2516 | + LT_LOG_FD_VALUE("fd_set_v6only succeeded", state); | ||
| 2517 | + return true; | ||
| 2518 | +} | ||
| 2519 | + | ||
| 2520 | +} | ||
| 2521 | diff --git a/src/torrent/net/fd.h b/src/torrent/net/fd.h | ||
| 2522 | new file mode 100644 | ||
| 2523 | index 00000000..a7094646 | ||
| 2524 | --- /dev/null | ||
| 2525 | +++ b/src/torrent/net/fd.h | ||
| 2526 | @@ -0,0 +1,63 @@ | ||
| 2527 | +#ifndef LIBTORRENT_NET_FD_H | ||
| 2528 | +#define LIBTORRENT_NET_FD_H | ||
| 2529 | + | ||
| 2530 | +#include <string> | ||
| 2531 | +#include <torrent/common.h> | ||
| 2532 | +#include <torrent/net/types.h> | ||
| 2533 | + | ||
| 2534 | +namespace torrent { | ||
| 2535 | + | ||
| 2536 | +enum fd_flags : int { | ||
| 2537 | + fd_flag_stream = 0x1, | ||
| 2538 | + fd_flag_nonblock = 0x10, | ||
| 2539 | + fd_flag_reuse_address = 0x20, | ||
| 2540 | + fd_flag_v4only = 0x40, | ||
| 2541 | + fd_flag_v6only = 0x80, | ||
| 2542 | + fd_flag_all = 0xff, | ||
| 2543 | +}; | ||
| 2544 | + | ||
| 2545 | +constexpr bool fd_valid_flags(fd_flags flags); | ||
| 2546 | + | ||
| 2547 | +int fd_open(fd_flags flags) LIBTORRENT_EXPORT; | ||
| 2548 | +void fd_close(int fd) LIBTORRENT_EXPORT; | ||
| 2549 | + | ||
| 2550 | +fd_sap_tuple fd_accept(int fd) LIBTORRENT_EXPORT; | ||
| 2551 | + | ||
| 2552 | +bool fd_bind(int fd, const sockaddr* sa) LIBTORRENT_EXPORT; | ||
| 2553 | +bool fd_connect(int fd, const sockaddr* sa) LIBTORRENT_EXPORT; | ||
| 2554 | +bool fd_listen(int fd, int backlog) LIBTORRENT_EXPORT; | ||
| 2555 | + | ||
| 2556 | +bool fd_set_nonblock(int fd) LIBTORRENT_EXPORT; | ||
| 2557 | +bool fd_set_reuse_address(int fd, bool state) LIBTORRENT_EXPORT; | ||
| 2558 | +bool fd_set_v6only(int fd, bool state) LIBTORRENT_EXPORT; | ||
| 2559 | + | ||
| 2560 | +[[gnu::weak]] int fd__accept(int socket, sockaddr *address, socklen_t *address_len) LIBTORRENT_EXPORT; | ||
| 2561 | +[[gnu::weak]] int fd__bind(int socket, const sockaddr *address, socklen_t address_len) LIBTORRENT_EXPORT; | ||
| 2562 | +[[gnu::weak]] int fd__close(int fildes) LIBTORRENT_EXPORT; | ||
| 2563 | +[[gnu::weak]] int fd__connect(int socket, const sockaddr *address, socklen_t address_len) LIBTORRENT_EXPORT; | ||
| 2564 | +[[gnu::weak]] int fd__fcntl_int(int fildes, int cmd, int arg) LIBTORRENT_EXPORT; | ||
| 2565 | +[[gnu::weak]] int fd__listen(int socket, int backlog) LIBTORRENT_EXPORT; | ||
| 2566 | +[[gnu::weak]] int fd__setsockopt_int(int socket, int level, int option_name, int option_value) LIBTORRENT_EXPORT; | ||
| 2567 | +[[gnu::weak]] int fd__socket(int domain, int type, int protocol) LIBTORRENT_EXPORT; | ||
| 2568 | + | ||
| 2569 | +constexpr fd_flags | ||
| 2570 | +operator |(fd_flags lhs, fd_flags rhs) { | ||
| 2571 | + return static_cast<fd_flags>(static_cast<int>(lhs) | static_cast<int>(rhs)); | ||
| 2572 | +} | ||
| 2573 | + | ||
| 2574 | +inline fd_flags& | ||
| 2575 | +operator |=(fd_flags& lhs, fd_flags rhs) { | ||
| 2576 | + return (lhs = lhs | rhs); | ||
| 2577 | +} | ||
| 2578 | + | ||
| 2579 | +constexpr bool | ||
| 2580 | +fd_valid_flags(fd_flags flags) { | ||
| 2581 | + return | ||
| 2582 | + (flags & fd_flag_stream) && | ||
| 2583 | + !((flags & fd_flag_v4only) && (flags & fd_flag_v6only)) && | ||
| 2584 | + !(flags & ~(fd_flag_all)); | ||
| 2585 | +} | ||
| 2586 | + | ||
| 2587 | +} | ||
| 2588 | + | ||
| 2589 | +#endif | ||
| 2590 | diff --git a/src/torrent/net/socket_address.cc b/src/torrent/net/socket_address.cc | ||
| 2591 | new file mode 100644 | ||
| 2592 | index 00000000..c36ba0ae | ||
| 2593 | --- /dev/null | ||
| 2594 | +++ b/src/torrent/net/socket_address.cc | ||
| 2595 | @@ -0,0 +1,559 @@ | ||
| 2596 | +#include "config.h" | ||
| 2597 | + | ||
| 2598 | +#include "socket_address.h" | ||
| 2599 | + | ||
| 2600 | +#include <cstring> | ||
| 2601 | +#include <arpa/inet.h> | ||
| 2602 | +#include <sys/un.h> | ||
| 2603 | + | ||
| 2604 | +// TODO: Deprecate. | ||
| 2605 | +#include "rak/socket_address.h" | ||
| 2606 | + | ||
| 2607 | +#include "torrent/exceptions.h" | ||
| 2608 | + | ||
| 2609 | +namespace torrent { | ||
| 2610 | + | ||
| 2611 | +constexpr uint32_t | ||
| 2612 | +sin6_addr32_index(const sockaddr_in6* sa, unsigned int index) { | ||
| 2613 | + return | ||
| 2614 | + (sa->sin6_addr.s6_addr[index * 4 + 0] << 24) + | ||
| 2615 | + (sa->sin6_addr.s6_addr[index * 4 + 1] << 16) + | ||
| 2616 | + (sa->sin6_addr.s6_addr[index * 4 + 2] << 8) + | ||
| 2617 | + (sa->sin6_addr.s6_addr[index * 4 + 3] << 0); | ||
| 2618 | +} | ||
| 2619 | + | ||
| 2620 | +inline void | ||
| 2621 | +sin6_addr32_set(sockaddr_in6* sa, unsigned int index, uint32_t value) { | ||
| 2622 | + sa->sin6_addr.s6_addr[index * 4 + 0] = (value >> 24); | ||
| 2623 | + sa->sin6_addr.s6_addr[index * 4 + 1] = (value >> 16); | ||
| 2624 | + sa->sin6_addr.s6_addr[index * 4 + 2] = (value >> 8); | ||
| 2625 | + sa->sin6_addr.s6_addr[index * 4 + 3] = (value >> 0); | ||
| 2626 | +} | ||
| 2627 | + | ||
| 2628 | +inline in6_addr | ||
| 2629 | +sin6_make_addr32(uint32_t addr0, uint32_t addr1, uint32_t addr2, uint32_t addr3) { | ||
| 2630 | + uint32_t addr32[4]; | ||
| 2631 | + addr32[0] = htonl(addr0); | ||
| 2632 | + addr32[1] = htonl(addr1); | ||
| 2633 | + addr32[2] = htonl(addr2); | ||
| 2634 | + addr32[3] = htonl(addr3); | ||
| 2635 | + | ||
| 2636 | + return *reinterpret_cast<in6_addr*>(addr32); | ||
| 2637 | +} | ||
| 2638 | + | ||
| 2639 | +bool | ||
| 2640 | +sa_is_unspec(const sockaddr* sa) { | ||
| 2641 | + return sa != NULL && sa->sa_family == AF_UNSPEC; | ||
| 2642 | +} | ||
| 2643 | + | ||
| 2644 | +bool | ||
| 2645 | +sa_is_inet(const sockaddr* sa) { | ||
| 2646 | + return sa != NULL && sa->sa_family == AF_INET; | ||
| 2647 | +} | ||
| 2648 | + | ||
| 2649 | +bool | ||
| 2650 | +sa_is_inet6(const sockaddr* sa) { | ||
| 2651 | + return sa != NULL && sa->sa_family == AF_INET6; | ||
| 2652 | +} | ||
| 2653 | + | ||
| 2654 | +bool | ||
| 2655 | +sa_is_inet_inet6(const sockaddr* sa) { | ||
| 2656 | + return sa != NULL && (sa->sa_family == AF_INET || sa->sa_family == AF_INET6); | ||
| 2657 | +} | ||
| 2658 | + | ||
| 2659 | +bool | ||
| 2660 | +sa_is_any(const sockaddr* sa) { | ||
| 2661 | + switch (sa->sa_family) { | ||
| 2662 | + case AF_INET: | ||
| 2663 | + return sin_is_any(reinterpret_cast<const sockaddr_in*>(sa)); | ||
| 2664 | + case AF_INET6: | ||
| 2665 | + if (sa_is_v4mapped(sa)) | ||
| 2666 | + return sin6_addr32_index(reinterpret_cast<const sockaddr_in6*>(sa), 3) == htonl(INADDR_ANY); | ||
| 2667 | + return sin6_is_any(reinterpret_cast<const sockaddr_in6*>(sa)); | ||
| 2668 | + default: | ||
| 2669 | + return true; | ||
| 2670 | + } | ||
| 2671 | +} | ||
| 2672 | + | ||
| 2673 | +bool | ||
| 2674 | +sin_is_any(const sockaddr_in* sa) { | ||
| 2675 | + return sa->sin_addr.s_addr == htonl(INADDR_ANY); | ||
| 2676 | +} | ||
| 2677 | + | ||
| 2678 | +bool | ||
| 2679 | +sin6_is_any(const sockaddr_in6* sa) { | ||
| 2680 | + return std::memcmp(&sa->sin6_addr, &in6addr_any, sizeof(in6_addr)) == 0; | ||
| 2681 | +} | ||
| 2682 | + | ||
| 2683 | +bool | ||
| 2684 | +sa_is_broadcast(const sockaddr* sa) { | ||
| 2685 | + switch (sa->sa_family) { | ||
| 2686 | + case AF_INET: | ||
| 2687 | + return sin_is_broadcast(reinterpret_cast<const sockaddr_in*>(sa)); | ||
| 2688 | + case AF_INET6: | ||
| 2689 | + if (sa_is_v4mapped(sa)) | ||
| 2690 | + return sin6_addr32_index(reinterpret_cast<const sockaddr_in6*>(sa), 3) == htonl(INADDR_BROADCAST); | ||
| 2691 | + return false; | ||
| 2692 | + default: | ||
| 2693 | + return false; | ||
| 2694 | + } | ||
| 2695 | +} | ||
| 2696 | + | ||
| 2697 | +bool | ||
| 2698 | +sin_is_broadcast(const sockaddr_in* sa) { | ||
| 2699 | + return sa->sin_addr.s_addr == htonl(INADDR_BROADCAST); | ||
| 2700 | +} | ||
| 2701 | + | ||
| 2702 | +bool | ||
| 2703 | +sa_is_v4mapped(const sockaddr* sa) { | ||
| 2704 | + return sa != NULL && sa->sa_family == AF_INET6 && sin6_is_v4mapped(reinterpret_cast<const sockaddr_in6*>(sa)); | ||
| 2705 | +} | ||
| 2706 | + | ||
| 2707 | +bool | ||
| 2708 | +sin6_is_v4mapped(const sockaddr_in6* sa) { | ||
| 2709 | + return sa != NULL && IN6_IS_ADDR_V4MAPPED(&sa->sin6_addr); | ||
| 2710 | +} | ||
| 2711 | + | ||
| 2712 | +bool | ||
| 2713 | +sa_is_port_any(const sockaddr* sa) { | ||
| 2714 | + return sa_port(sa) == 0; | ||
| 2715 | +} | ||
| 2716 | + | ||
| 2717 | +size_t | ||
| 2718 | +sa_length(const sockaddr* sa) { | ||
| 2719 | + switch(sa->sa_family) { | ||
| 2720 | + case AF_INET: | ||
| 2721 | + return sizeof(sockaddr_in); | ||
| 2722 | + case AF_INET6: | ||
| 2723 | + return sizeof(sockaddr_in6); | ||
| 2724 | + default: | ||
| 2725 | + return sizeof(sa); | ||
| 2726 | + } | ||
| 2727 | +} | ||
| 2728 | + | ||
| 2729 | +sa_unique_ptr | ||
| 2730 | +sa_make_unspec() { | ||
| 2731 | + sa_unique_ptr sa(new sockaddr); | ||
| 2732 | + | ||
| 2733 | + std::memset(sa.get(), 0, sizeof(sa)); | ||
| 2734 | + sa.get()->sa_family = AF_UNSPEC; | ||
| 2735 | + | ||
| 2736 | + return sa; | ||
| 2737 | +} | ||
| 2738 | + | ||
| 2739 | +sa_unique_ptr | ||
| 2740 | +sa_make_inet() { | ||
| 2741 | + return sa_unique_ptr(reinterpret_cast<sockaddr*>(sin_make().release())); | ||
| 2742 | +} | ||
| 2743 | + | ||
| 2744 | +sa_unique_ptr | ||
| 2745 | +sa_make_inet6() { | ||
| 2746 | + return sa_unique_ptr(reinterpret_cast<sockaddr*>(sin6_make().release())); | ||
| 2747 | +} | ||
| 2748 | + | ||
| 2749 | +sa_unique_ptr | ||
| 2750 | +sa_make_unix(const std::string& pathname) { | ||
| 2751 | + if (!pathname.empty()) | ||
| 2752 | + throw internal_error("torrent::sa_make_unix: function not implemented"); | ||
| 2753 | + | ||
| 2754 | + sun_unique_ptr sunp(new sockaddr_un); | ||
| 2755 | + | ||
| 2756 | + std::memset(sunp.get(), 0, sizeof(sockaddr_un)); | ||
| 2757 | + sunp->sun_family = AF_UNIX; | ||
| 2758 | + // TODO: verify length, copy pathname | ||
| 2759 | + | ||
| 2760 | + return sa_unique_ptr(reinterpret_cast<sockaddr*>(sunp.release())); | ||
| 2761 | +} | ||
| 2762 | + | ||
| 2763 | +sa_unique_ptr | ||
| 2764 | +sa_convert(const sockaddr* sa) { | ||
| 2765 | + if (sa == NULL) | ||
| 2766 | + return sa_make_unspec(); | ||
| 2767 | + | ||
| 2768 | + switch(sa->sa_family) { | ||
| 2769 | + case AF_INET: | ||
| 2770 | + return sa_copy_in(reinterpret_cast<const sockaddr_in*>(sa)); | ||
| 2771 | + case AF_INET6: | ||
| 2772 | + if (sin6_is_v4mapped(reinterpret_cast<const sockaddr_in6*>(sa))) | ||
| 2773 | + return sa_from_v4mapped_in6(reinterpret_cast<const sockaddr_in6*>(sa)); | ||
| 2774 | + | ||
| 2775 | + return sa_copy_in6(reinterpret_cast<const sockaddr_in6*>(sa)); | ||
| 2776 | + case AF_UNSPEC: | ||
| 2777 | + return sa_make_unspec(); | ||
| 2778 | + default: | ||
| 2779 | + throw internal_error("torrent::sa_convert: sockaddr is not a valid family"); | ||
| 2780 | + } | ||
| 2781 | +} | ||
| 2782 | + | ||
| 2783 | +sa_unique_ptr | ||
| 2784 | +sa_copy(const sockaddr* sa) { | ||
| 2785 | + if (sa == nullptr) | ||
| 2786 | + throw internal_error("torrent::sa_copy: sockaddr is a nullptr"); | ||
| 2787 | + | ||
| 2788 | + switch(sa->sa_family) { | ||
| 2789 | + case AF_INET: | ||
| 2790 | + return sa_copy_in(reinterpret_cast<const sockaddr_in*>(sa)); | ||
| 2791 | + case AF_INET6: | ||
| 2792 | + return sa_copy_in6(reinterpret_cast<const sockaddr_in6*>(sa)); | ||
| 2793 | + case AF_UNSPEC: | ||
| 2794 | + return sa_make_unspec(); | ||
| 2795 | + default: | ||
| 2796 | + throw internal_error("torrent::sa_copy: sockaddr is not a valid family"); | ||
| 2797 | + } | ||
| 2798 | +} | ||
| 2799 | + | ||
| 2800 | +sa_unique_ptr | ||
| 2801 | +sa_copy_in(const sockaddr_in* sa) { | ||
| 2802 | + sa_unique_ptr result(reinterpret_cast<sockaddr*>(new sockaddr_in)); | ||
| 2803 | + std::memcpy(result.get(), sa, sizeof(sockaddr_in)); | ||
| 2804 | + return result; | ||
| 2805 | +} | ||
| 2806 | + | ||
| 2807 | +sa_unique_ptr | ||
| 2808 | +sa_copy_in6(const sockaddr_in6* sa) { | ||
| 2809 | + sa_unique_ptr result(reinterpret_cast<sockaddr*>(new sockaddr_in6)); | ||
| 2810 | + std::memcpy(result.get(), sa, sizeof(sockaddr_in6)); | ||
| 2811 | + return result; | ||
| 2812 | +} | ||
| 2813 | + | ||
| 2814 | +sa_unique_ptr | ||
| 2815 | +sa_copy_addr(const sockaddr* sa, uint16_t port) { | ||
| 2816 | + if (sa == nullptr) | ||
| 2817 | + throw internal_error("torrent::sa_copy_addr: sockaddr is a nullptr"); | ||
| 2818 | + | ||
| 2819 | + switch(sa->sa_family) { | ||
| 2820 | + case AF_INET: | ||
| 2821 | + return sa_copy_addr_in(reinterpret_cast<const sockaddr_in*>(sa), port); | ||
| 2822 | + case AF_INET6: | ||
| 2823 | + return sa_copy_addr_in6(reinterpret_cast<const sockaddr_in6*>(sa), port); | ||
| 2824 | + case AF_UNSPEC: | ||
| 2825 | + return sa_make_unspec(); | ||
| 2826 | + default: | ||
| 2827 | + throw internal_error("torrent::sa_copy_addr: sockaddr is not a valid family"); | ||
| 2828 | + } | ||
| 2829 | +} | ||
| 2830 | + | ||
| 2831 | +sa_unique_ptr | ||
| 2832 | +sa_copy_addr_in(const sockaddr_in* sa, uint16_t port) { | ||
| 2833 | + sa_unique_ptr result(reinterpret_cast<sockaddr*>(new sockaddr_in)); | ||
| 2834 | + std::memset(result.get(), 0, sizeof(sockaddr_in)); | ||
| 2835 | + reinterpret_cast<sockaddr_in*>(result.get())->sin_family = AF_INET; | ||
| 2836 | + reinterpret_cast<sockaddr_in*>(result.get())->sin_addr = sa->sin_addr; | ||
| 2837 | + reinterpret_cast<sockaddr_in*>(result.get())->sin_port = htons(port); | ||
| 2838 | + return result; | ||
| 2839 | +} | ||
| 2840 | + | ||
| 2841 | +sa_unique_ptr | ||
| 2842 | +sa_copy_addr_in6(const sockaddr_in6* sa, uint16_t port) { | ||
| 2843 | + sa_unique_ptr result(reinterpret_cast<sockaddr*>(new sockaddr_in6)); | ||
| 2844 | + std::memset(result.get(), 0, sizeof(sockaddr_in6)); | ||
| 2845 | + reinterpret_cast<sockaddr_in6*>(result.get())->sin6_family = AF_INET6; | ||
| 2846 | + std::memcpy(&reinterpret_cast<sockaddr_in6*>(result.get())->sin6_addr, &sa->sin6_addr, sizeof(in6_addr)); | ||
| 2847 | + reinterpret_cast<sockaddr_in6*>(result.get())->sin6_port = htons(port); | ||
| 2848 | + return result; | ||
| 2849 | +} | ||
| 2850 | + | ||
| 2851 | +sin_unique_ptr | ||
| 2852 | +sin_copy(const sockaddr_in* sa) { | ||
| 2853 | + sin_unique_ptr result(new sockaddr_in); | ||
| 2854 | + std::memcpy(result.get(), sa, sizeof(sockaddr_in)); | ||
| 2855 | + return result; | ||
| 2856 | +} | ||
| 2857 | + | ||
| 2858 | +sin6_unique_ptr | ||
| 2859 | +sin6_copy(const sockaddr_in6* sa) { | ||
| 2860 | + sin6_unique_ptr result(new sockaddr_in6); | ||
| 2861 | + std::memcpy(result.get(), sa, sizeof(sockaddr_in6)); | ||
| 2862 | + return result; | ||
| 2863 | +} | ||
| 2864 | + | ||
| 2865 | +sin_unique_ptr | ||
| 2866 | +sin_make() { | ||
| 2867 | + sin_unique_ptr sa(new sockaddr_in); | ||
| 2868 | + std::memset(sa.get(), 0, sizeof(sockaddr_in)); | ||
| 2869 | + sa.get()->sin_family = AF_INET; | ||
| 2870 | + | ||
| 2871 | + return sa; | ||
| 2872 | +} | ||
| 2873 | + | ||
| 2874 | +sin6_unique_ptr | ||
| 2875 | +sin6_make() { | ||
| 2876 | + sin6_unique_ptr sa(new sockaddr_in6); | ||
| 2877 | + std::memset(sa.get(), 0, sizeof(sockaddr_in6)); | ||
| 2878 | + sa.get()->sin6_family = AF_INET6; | ||
| 2879 | + | ||
| 2880 | + return sa; | ||
| 2881 | +} | ||
| 2882 | + | ||
| 2883 | +sa_unique_ptr | ||
| 2884 | +sa_from_v4mapped(const sockaddr* sa) { | ||
| 2885 | + if (!sa_is_inet6(sa)) | ||
| 2886 | + throw internal_error("torrent::sa_from_v4mapped: sockaddr is not inet6"); | ||
| 2887 | + | ||
| 2888 | + return sa_from_in(sin_from_v4mapped_in6(reinterpret_cast<const sockaddr_in6*>(sa))); | ||
| 2889 | +} | ||
| 2890 | + | ||
| 2891 | +sa_unique_ptr | ||
| 2892 | +sa_to_v4mapped(const sockaddr* sa) { | ||
| 2893 | + if (!sa_is_inet(sa)) | ||
| 2894 | + throw internal_error("torrent::sa_to_v4mapped: sockaddr is not inet"); | ||
| 2895 | + | ||
| 2896 | + return sa_from_in6(sin6_to_v4mapped_in(reinterpret_cast<const sockaddr_in*>(sa))); | ||
| 2897 | +} | ||
| 2898 | + | ||
| 2899 | +sin_unique_ptr | ||
| 2900 | +sin_from_v4mapped_in6(const sockaddr_in6* sin6) { | ||
| 2901 | + if (!sin6_is_v4mapped(sin6)) | ||
| 2902 | + throw internal_error("torrent::sin6_is_v4mapped: sockaddr_in6 is not v4mapped"); | ||
| 2903 | + | ||
| 2904 | + sin_unique_ptr result = sin_make(); | ||
| 2905 | + result.get()->sin_addr.s_addr = reinterpret_cast<in_addr_t>(htonl(sin6_addr32_index(sin6, 3))); | ||
| 2906 | + result.get()->sin_port = sin6->sin6_port; | ||
| 2907 | + | ||
| 2908 | + return result; | ||
| 2909 | +} | ||
| 2910 | + | ||
| 2911 | +sin6_unique_ptr | ||
| 2912 | +sin6_to_v4mapped_in(const sockaddr_in* sin) { | ||
| 2913 | + sin6_unique_ptr result = sin6_make(); | ||
| 2914 | + | ||
| 2915 | + result.get()->sin6_addr = sin6_make_addr32(0, 0, 0xffff, ntohl(sin->sin_addr.s_addr)); | ||
| 2916 | + result.get()->sin6_port = sin->sin_port; | ||
| 2917 | + | ||
| 2918 | + return result; | ||
| 2919 | +} | ||
| 2920 | + | ||
| 2921 | +sin_unique_ptr | ||
| 2922 | +sin_from_sa(sa_unique_ptr&& sap) { | ||
| 2923 | + if (!sap_is_inet(sap)) | ||
| 2924 | + throw internal_error("torrent::sin_from_sa: sockaddr is nullptr or not inet"); | ||
| 2925 | + | ||
| 2926 | + return sin_unique_ptr(reinterpret_cast<sockaddr_in*>(sap.release())); | ||
| 2927 | +} | ||
| 2928 | + | ||
| 2929 | +sin6_unique_ptr | ||
| 2930 | +sin6_from_sa(sa_unique_ptr&& sap) { | ||
| 2931 | + if (!sap_is_inet6(sap)) | ||
| 2932 | + throw internal_error("torrent::sin6_from_sa: sockaddr is nullptr or not inet6"); | ||
| 2933 | + | ||
| 2934 | + return sin6_unique_ptr(reinterpret_cast<sockaddr_in6*>(sap.release())); | ||
| 2935 | +} | ||
| 2936 | + | ||
| 2937 | +c_sin_unique_ptr | ||
| 2938 | +sin_from_c_sa(c_sa_unique_ptr&& sap) { | ||
| 2939 | + if (!sap_is_inet(sap)) | ||
| 2940 | + throw internal_error("torrent::sin_from_c_sa: sockaddr is nullptr or not inet"); | ||
| 2941 | + | ||
| 2942 | + return c_sin_unique_ptr(reinterpret_cast<const sockaddr_in*>(sap.release())); | ||
| 2943 | +} | ||
| 2944 | + | ||
| 2945 | +c_sin6_unique_ptr | ||
| 2946 | +sin6_from_c_sa(sa_unique_ptr&& sap) { | ||
| 2947 | + if (!sap_is_inet6(sap)) | ||
| 2948 | + throw internal_error("torrent::sin6_from_c_sa: sockaddr is nullptr or not inet6"); | ||
| 2949 | + | ||
| 2950 | + return c_sin6_unique_ptr(reinterpret_cast<const sockaddr_in6*>(sap.release())); | ||
| 2951 | +} | ||
| 2952 | + | ||
| 2953 | +void | ||
| 2954 | +sa_clear_inet6(sockaddr_in6* sa) { | ||
| 2955 | + std::memset(sa, 0, sizeof(sockaddr_in6)); | ||
| 2956 | + sa->sin6_family = AF_INET6; | ||
| 2957 | +} | ||
| 2958 | + | ||
| 2959 | +uint16_t | ||
| 2960 | +sa_port(const sockaddr* sa) { | ||
| 2961 | + if (sa == NULL) | ||
| 2962 | + return 0; | ||
| 2963 | + | ||
| 2964 | + switch(sa->sa_family) { | ||
| 2965 | + case AF_INET: | ||
| 2966 | + return ntohs(reinterpret_cast<const sockaddr_in*>(sa)->sin_port); | ||
| 2967 | + case AF_INET6: | ||
| 2968 | + return ntohs(reinterpret_cast<const sockaddr_in6*>(sa)->sin6_port); | ||
| 2969 | + default: | ||
| 2970 | + return 0; | ||
| 2971 | + } | ||
| 2972 | +} | ||
| 2973 | + | ||
| 2974 | +void | ||
| 2975 | +sa_set_port(sockaddr* sa, uint16_t port) { | ||
| 2976 | + switch(sa->sa_family) { | ||
| 2977 | + case AF_INET: | ||
| 2978 | + reinterpret_cast<sockaddr_in*>(sa)->sin_port = htons(port); | ||
| 2979 | + return; | ||
| 2980 | + case AF_INET6: | ||
| 2981 | + reinterpret_cast<sockaddr_in6*>(sa)->sin6_port = htons(port); | ||
| 2982 | + return; | ||
| 2983 | + default: | ||
| 2984 | + throw internal_error("torrent::sa_set_port: invalid family type"); | ||
| 2985 | + } | ||
| 2986 | +} | ||
| 2987 | + | ||
| 2988 | +bool | ||
| 2989 | +sa_equal(const sockaddr* lhs, const sockaddr* rhs) { | ||
| 2990 | + switch(rhs->sa_family) { | ||
| 2991 | + case AF_INET: | ||
| 2992 | + case AF_INET6: | ||
| 2993 | + case AF_UNSPEC: | ||
| 2994 | + break; | ||
| 2995 | + default: | ||
| 2996 | + throw internal_error("torrent::sa_equal: rhs sockaddr is not a valid family"); | ||
| 2997 | + } | ||
| 2998 | + | ||
| 2999 | + switch(lhs->sa_family) { | ||
| 3000 | + case AF_INET: | ||
| 3001 | + return lhs->sa_family == rhs->sa_family && | ||
| 3002 | + sin_equal(reinterpret_cast<const sockaddr_in*>(lhs), reinterpret_cast<const sockaddr_in*>(rhs)); | ||
| 3003 | + case AF_INET6: | ||
| 3004 | + return lhs->sa_family == rhs->sa_family && | ||
| 3005 | + sin6_equal(reinterpret_cast<const sockaddr_in6*>(lhs), reinterpret_cast<const sockaddr_in6*>(rhs)); | ||
| 3006 | + case AF_UNSPEC: | ||
| 3007 | + return lhs->sa_family == rhs->sa_family; | ||
| 3008 | + default: | ||
| 3009 | + throw internal_error("torrent::sa_equal: lhs sockaddr is not a valid family"); | ||
| 3010 | + } | ||
| 3011 | +} | ||
| 3012 | + | ||
| 3013 | +bool | ||
| 3014 | +sin_equal(const sockaddr_in* lhs, const sockaddr_in* rhs) { | ||
| 3015 | + return lhs->sin_port == rhs->sin_port && lhs->sin_addr.s_addr == rhs->sin_addr.s_addr; | ||
| 3016 | +} | ||
| 3017 | + | ||
| 3018 | +bool | ||
| 3019 | +sin6_equal(const sockaddr_in6* lhs, const sockaddr_in6* rhs) { | ||
| 3020 | + return lhs->sin6_port == rhs->sin6_port && std::equal(lhs->sin6_addr.s6_addr, lhs->sin6_addr.s6_addr + 16, rhs->sin6_addr.s6_addr); | ||
| 3021 | +} | ||
| 3022 | + | ||
| 3023 | +bool | ||
| 3024 | +sa_equal_addr(const sockaddr* lhs, const sockaddr* rhs) { | ||
| 3025 | + switch(rhs->sa_family) { | ||
| 3026 | + case AF_INET: | ||
| 3027 | + case AF_INET6: | ||
| 3028 | + case AF_UNSPEC: | ||
| 3029 | + break; | ||
| 3030 | + default: | ||
| 3031 | + throw internal_error("torrent::sa_equal_addr: rhs sockaddr is not a valid family"); | ||
| 3032 | + } | ||
| 3033 | + | ||
| 3034 | + switch(lhs->sa_family) { | ||
| 3035 | + case AF_INET: | ||
| 3036 | + return lhs->sa_family == rhs->sa_family && | ||
| 3037 | + sin_equal_addr(reinterpret_cast<const sockaddr_in*>(lhs), reinterpret_cast<const sockaddr_in*>(rhs)); | ||
| 3038 | + case AF_INET6: | ||
| 3039 | + return lhs->sa_family == rhs->sa_family && | ||
| 3040 | + sin6_equal_addr(reinterpret_cast<const sockaddr_in6*>(lhs), reinterpret_cast<const sockaddr_in6*>(rhs)); | ||
| 3041 | + case AF_UNSPEC: | ||
| 3042 | + return lhs->sa_family == rhs->sa_family; | ||
| 3043 | + default: | ||
| 3044 | + throw internal_error("torrent::sa_equal_addr: lhs sockaddr is not a valid family"); | ||
| 3045 | + } | ||
| 3046 | +} | ||
| 3047 | + | ||
| 3048 | +bool | ||
| 3049 | +sin_equal_addr(const sockaddr_in* lhs, const sockaddr_in* rhs) { | ||
| 3050 | + return lhs->sin_addr.s_addr == rhs->sin_addr.s_addr; | ||
| 3051 | +} | ||
| 3052 | + | ||
| 3053 | +bool | ||
| 3054 | +sin6_equal_addr(const sockaddr_in6* lhs, const sockaddr_in6* rhs) { | ||
| 3055 | + return std::equal(lhs->sin6_addr.s6_addr, lhs->sin6_addr.s6_addr + 16, rhs->sin6_addr.s6_addr); | ||
| 3056 | +} | ||
| 3057 | + | ||
| 3058 | +std::string | ||
| 3059 | +sa_addr_str(const sockaddr* sa) { | ||
| 3060 | + if (sa == NULL) | ||
| 3061 | + return "unspec"; | ||
| 3062 | + | ||
| 3063 | + switch (sa->sa_family) { | ||
| 3064 | + case AF_INET: | ||
| 3065 | + return sin_addr_str(reinterpret_cast<const sockaddr_in*>(sa)); | ||
| 3066 | + case AF_INET6: | ||
| 3067 | + return sin6_addr_str(reinterpret_cast<const sockaddr_in6*>(sa)); | ||
| 3068 | + case AF_UNSPEC: | ||
| 3069 | + return "unspec"; | ||
| 3070 | + default: | ||
| 3071 | + return "invalid"; | ||
| 3072 | + } | ||
| 3073 | +} | ||
| 3074 | + | ||
| 3075 | +std::string | ||
| 3076 | +sin_addr_str(const sockaddr_in* sa) { | ||
| 3077 | + char buffer[INET_ADDRSTRLEN]; | ||
| 3078 | + | ||
| 3079 | + if (inet_ntop(AF_INET, &sa->sin_addr, buffer, INET_ADDRSTRLEN) == NULL) | ||
| 3080 | + return "inet_error"; | ||
| 3081 | + | ||
| 3082 | + return buffer; | ||
| 3083 | +} | ||
| 3084 | + | ||
| 3085 | + | ||
| 3086 | +std::string | ||
| 3087 | +sin6_addr_str(const sockaddr_in6* sa) { | ||
| 3088 | + char buffer[INET6_ADDRSTRLEN]; | ||
| 3089 | + | ||
| 3090 | + if (inet_ntop(AF_INET6, &sa->sin6_addr, buffer, INET6_ADDRSTRLEN) == NULL) | ||
| 3091 | + return "inet6_error"; | ||
| 3092 | + | ||
| 3093 | + return buffer; | ||
| 3094 | +} | ||
| 3095 | + | ||
| 3096 | +std::string | ||
| 3097 | +sa_pretty_str(const sockaddr* sa) { | ||
| 3098 | + if (sa == nullptr) | ||
| 3099 | + return "nullptr"; | ||
| 3100 | + | ||
| 3101 | + switch (sa->sa_family) { | ||
| 3102 | + case AF_INET: | ||
| 3103 | + return sin_pretty_str(reinterpret_cast<const sockaddr_in*>(sa)); | ||
| 3104 | + case AF_INET6: | ||
| 3105 | + return sin6_pretty_str(reinterpret_cast<const sockaddr_in6*>(sa)); | ||
| 3106 | + case AF_UNSPEC: | ||
| 3107 | + return "unspec"; | ||
| 3108 | + default: | ||
| 3109 | + return "invalid"; | ||
| 3110 | + } | ||
| 3111 | +} | ||
| 3112 | + | ||
| 3113 | +std::string | ||
| 3114 | +sin_pretty_str(const sockaddr_in* sa) { | ||
| 3115 | + auto result = sin_addr_str(sa); | ||
| 3116 | + | ||
| 3117 | + if (sa->sin_port != 0) | ||
| 3118 | + result += ':' + std::to_string(ntohs(sa->sin_port)); | ||
| 3119 | + | ||
| 3120 | + return result; | ||
| 3121 | +} | ||
| 3122 | + | ||
| 3123 | +std::string | ||
| 3124 | +sin6_pretty_str(const sockaddr_in6* sa) { | ||
| 3125 | + auto result = "[" + sin6_addr_str(sa) + "]"; | ||
| 3126 | + | ||
| 3127 | + if (sa->sin6_port != 0) | ||
| 3128 | + result += ':' + std::to_string(ntohs(sa->sin6_port)); | ||
| 3129 | + | ||
| 3130 | + return result; | ||
| 3131 | +} | ||
| 3132 | + | ||
| 3133 | +// Deprecated: | ||
| 3134 | + | ||
| 3135 | +void | ||
| 3136 | +sa_inet_mapped_inet6(const sockaddr_in* sa, sockaddr_in6* mapped) { | ||
| 3137 | + uint32_t addr32[4]; | ||
| 3138 | + addr32[0] = 0; | ||
| 3139 | + addr32[1] = 0; | ||
| 3140 | + addr32[2] = htonl(0xffff); | ||
| 3141 | + addr32[3] = sa->sin_addr.s_addr; | ||
| 3142 | + | ||
| 3143 | + sa_clear_inet6(mapped); | ||
| 3144 | + | ||
| 3145 | + mapped->sin6_addr = *reinterpret_cast<in6_addr*>(addr32); | ||
| 3146 | + mapped->sin6_port = sa->sin_port; | ||
| 3147 | +} | ||
| 3148 | + | ||
| 3149 | +std::string | ||
| 3150 | +sa_pretty_address_str(const sockaddr* sa) { | ||
| 3151 | + return sa_pretty_str(sa); | ||
| 3152 | +} | ||
| 3153 | + | ||
| 3154 | +} | ||
| 3155 | diff --git a/src/torrent/net/socket_address.h b/src/torrent/net/socket_address.h | ||
| 3156 | new file mode 100644 | ||
| 3157 | index 00000000..f64aee68 | ||
| 3158 | --- /dev/null | ||
| 3159 | +++ b/src/torrent/net/socket_address.h | ||
| 3160 | @@ -0,0 +1,229 @@ | ||
| 3161 | +#ifndef LIBTORRENT_NET_SOCKET_ADDRESS_H | ||
| 3162 | +#define LIBTORRENT_NET_SOCKET_ADDRESS_H | ||
| 3163 | + | ||
| 3164 | +#include <memory> | ||
| 3165 | +#include <string> | ||
| 3166 | +#include <netinet/in.h> | ||
| 3167 | +#include <sys/socket.h> | ||
| 3168 | +#include <torrent/common.h> | ||
| 3169 | +#include <torrent/net/types.h> | ||
| 3170 | + | ||
| 3171 | +namespace torrent { | ||
| 3172 | + | ||
| 3173 | +bool sa_is_unspec(const sockaddr* sa) LIBTORRENT_EXPORT; | ||
| 3174 | +bool sa_is_inet(const sockaddr* sa) LIBTORRENT_EXPORT; | ||
| 3175 | +bool sa_is_inet6(const sockaddr* sa) LIBTORRENT_EXPORT; | ||
| 3176 | +bool sa_is_inet_inet6(const sockaddr* sa) LIBTORRENT_EXPORT; | ||
| 3177 | + | ||
| 3178 | +bool sa_is_any(const sockaddr* sa) LIBTORRENT_EXPORT; | ||
| 3179 | +bool sin_is_any(const sockaddr_in* sa) LIBTORRENT_EXPORT; | ||
| 3180 | +bool sin6_is_any(const sockaddr_in6* sa) LIBTORRENT_EXPORT; | ||
| 3181 | + | ||
| 3182 | +bool sa_is_broadcast(const sockaddr* sa) LIBTORRENT_EXPORT; | ||
| 3183 | +bool sin_is_broadcast(const sockaddr_in* sa) LIBTORRENT_EXPORT; | ||
| 3184 | + | ||
| 3185 | +bool sa_is_v4mapped(const sockaddr* sa) LIBTORRENT_EXPORT; | ||
| 3186 | +bool sin6_is_v4mapped(const sockaddr_in6* sa) LIBTORRENT_EXPORT; | ||
| 3187 | + | ||
| 3188 | +bool sa_is_port_any(const sockaddr* sa) LIBTORRENT_EXPORT; | ||
| 3189 | + | ||
| 3190 | +size_t sa_length(const sockaddr* sa) LIBTORRENT_EXPORT; | ||
| 3191 | + | ||
| 3192 | +sa_unique_ptr sa_make_unspec() LIBTORRENT_EXPORT; | ||
| 3193 | +sa_unique_ptr sa_make_inet() LIBTORRENT_EXPORT; | ||
| 3194 | +sa_unique_ptr sa_make_inet6() LIBTORRENT_EXPORT; | ||
| 3195 | +sa_unique_ptr sa_make_unix(const std::string& pathname) LIBTORRENT_EXPORT; | ||
| 3196 | + | ||
| 3197 | +sa_unique_ptr sa_convert(const sockaddr* sa) LIBTORRENT_EXPORT; | ||
| 3198 | + | ||
| 3199 | +sa_unique_ptr sa_copy(const sockaddr* sa) LIBTORRENT_EXPORT; | ||
| 3200 | +sa_unique_ptr sa_copy_in(const sockaddr_in* sa) LIBTORRENT_EXPORT; | ||
| 3201 | +sa_unique_ptr sa_copy_in6(const sockaddr_in6* sa) LIBTORRENT_EXPORT; | ||
| 3202 | +sa_unique_ptr sa_copy_addr(const sockaddr* sa, uint16_t port = 0) LIBTORRENT_EXPORT; | ||
| 3203 | +sa_unique_ptr sa_copy_addr_in(const sockaddr_in* sa, uint16_t port = 0) LIBTORRENT_EXPORT; | ||
| 3204 | +sa_unique_ptr sa_copy_addr_in6(const sockaddr_in6* sa, uint16_t port = 0) LIBTORRENT_EXPORT; | ||
| 3205 | +sin_unique_ptr sin_copy(const sockaddr_in* sa) LIBTORRENT_EXPORT; | ||
| 3206 | +sin6_unique_ptr sin6_copy(const sockaddr_in6* sa) LIBTORRENT_EXPORT; | ||
| 3207 | + | ||
| 3208 | +sin_unique_ptr sin_make() LIBTORRENT_EXPORT; | ||
| 3209 | +sin6_unique_ptr sin6_make() LIBTORRENT_EXPORT; | ||
| 3210 | + | ||
| 3211 | +sa_unique_ptr sa_from_v4mapped(const sockaddr* sa) LIBTORRENT_EXPORT; | ||
| 3212 | +sa_unique_ptr sa_to_v4mapped(const sockaddr* sa) LIBTORRENT_EXPORT; | ||
| 3213 | +sa_unique_ptr sa_from_v4mapped_in6(const sockaddr_in6* sin6) LIBTORRENT_EXPORT; | ||
| 3214 | +sa_unique_ptr sa_to_v4mapped_in(const sockaddr_in* sin) LIBTORRENT_EXPORT; | ||
| 3215 | +sin_unique_ptr sin_from_v4mapped_in6(const sockaddr_in6* sin6) LIBTORRENT_EXPORT; | ||
| 3216 | +sin6_unique_ptr sin6_to_v4mapped_in(const sockaddr_in* sin) LIBTORRENT_EXPORT; | ||
| 3217 | + | ||
| 3218 | +sa_unique_ptr sa_from_in(sin_unique_ptr&& sinp) LIBTORRENT_EXPORT; | ||
| 3219 | +c_sa_unique_ptr sa_from_in(c_sin_unique_ptr&& sinp) LIBTORRENT_EXPORT; | ||
| 3220 | +sa_unique_ptr sa_from_in6(sin6_unique_ptr&& sin6p) LIBTORRENT_EXPORT; | ||
| 3221 | +c_sa_unique_ptr sa_from_in6(c_sin6_unique_ptr&& sin6p) LIBTORRENT_EXPORT; | ||
| 3222 | +sin_unique_ptr sin_from_sa(sa_unique_ptr&& sap) LIBTORRENT_EXPORT; | ||
| 3223 | +sin6_unique_ptr sin6_from_sa(sa_unique_ptr&& sap) LIBTORRENT_EXPORT; | ||
| 3224 | +c_sin_unique_ptr sin_from_c_sa(c_sa_unique_ptr&& sap) LIBTORRENT_EXPORT; | ||
| 3225 | +c_sin6_unique_ptr sin6_from_c_sa(c_sa_unique_ptr&& sap) LIBTORRENT_EXPORT; | ||
| 3226 | + | ||
| 3227 | +void sa_clear_inet6(sockaddr_in6* sa) LIBTORRENT_EXPORT; | ||
| 3228 | + | ||
| 3229 | +uint16_t sa_port(const sockaddr* sa) LIBTORRENT_EXPORT; | ||
| 3230 | +void sa_set_port(sockaddr* sa, uint16_t port) LIBTORRENT_EXPORT; | ||
| 3231 | + | ||
| 3232 | +bool sa_equal(const sockaddr* lhs, const sockaddr* rhs) LIBTORRENT_EXPORT; | ||
| 3233 | +bool sin_equal(const sockaddr_in* lhs, const sockaddr_in* rhs) LIBTORRENT_EXPORT; | ||
| 3234 | +bool sin6_equal(const sockaddr_in6* lhs, const sockaddr_in6* rhs) LIBTORRENT_EXPORT; | ||
| 3235 | + | ||
| 3236 | +bool sa_equal_addr(const sockaddr* lhs, const sockaddr* rhs) LIBTORRENT_EXPORT; | ||
| 3237 | +bool sin_equal_addr(const sockaddr_in* lhs, const sockaddr_in* rhs) LIBTORRENT_EXPORT; | ||
| 3238 | +bool sin6_equal_addr(const sockaddr_in6* lhs, const sockaddr_in6* rhs) LIBTORRENT_EXPORT; | ||
| 3239 | + | ||
| 3240 | +std::string sa_addr_str(const sockaddr* sa) LIBTORRENT_EXPORT; | ||
| 3241 | +std::string sin_addr_str(const sockaddr_in* sa) LIBTORRENT_EXPORT; | ||
| 3242 | +std::string sin6_addr_str(const sockaddr_in6* sa) LIBTORRENT_EXPORT; | ||
| 3243 | + | ||
| 3244 | +std::string sa_pretty_str(const sockaddr* sa) LIBTORRENT_EXPORT; | ||
| 3245 | +std::string sin_pretty_str(const sockaddr_in* sa) LIBTORRENT_EXPORT; | ||
| 3246 | +std::string sin6_pretty_str(const sockaddr_in6* sa) LIBTORRENT_EXPORT; | ||
| 3247 | + | ||
| 3248 | +// Rename/replace: | ||
| 3249 | +void sa_inet_mapped_inet6(const sockaddr_in* sa, sockaddr_in6* mapped) LIBTORRENT_EXPORT; | ||
| 3250 | + | ||
| 3251 | +std::string sa_pretty_address_str(const sockaddr* sa) LIBTORRENT_EXPORT; | ||
| 3252 | + | ||
| 3253 | +// | ||
| 3254 | +// Tuples: | ||
| 3255 | +// | ||
| 3256 | + | ||
| 3257 | +bool fd_sap_equal(const fd_sap_tuple& lhs, const fd_sap_tuple& rhs) LIBTORRENT_EXPORT; | ||
| 3258 | + | ||
| 3259 | +// | ||
| 3260 | +// Safe conversion from unique_ptr arguments: | ||
| 3261 | +// | ||
| 3262 | + | ||
| 3263 | +inline bool sap_is_unspec(const sa_unique_ptr& sap) { return sa_is_unspec(sap.get()); } | ||
| 3264 | +inline bool sap_is_unspec(const c_sa_unique_ptr& sap) { return sa_is_unspec(sap.get()); } | ||
| 3265 | +inline bool sap_is_inet(const c_sa_unique_ptr& sap) { return sa_is_inet(sap.get()); } | ||
| 3266 | +inline bool sap_is_inet(const sa_unique_ptr& sap) { return sa_is_inet(sap.get()); } | ||
| 3267 | +inline bool sap_is_inet6(const sa_unique_ptr& sap) { return sa_is_inet6(sap.get()); } | ||
| 3268 | +inline bool sap_is_inet6(const c_sa_unique_ptr& sap) { return sa_is_inet6(sap.get()); } | ||
| 3269 | +inline bool sap_is_inet_inet6(const sa_unique_ptr& sap) { return sa_is_inet_inet6(sap.get()); } | ||
| 3270 | +inline bool sap_is_inet_inet6(const c_sa_unique_ptr& sap) { return sa_is_inet_inet6(sap.get()); } | ||
| 3271 | + | ||
| 3272 | +inline bool sap_is_any(const sa_unique_ptr& sap) { return sa_is_any(sap.get()); } | ||
| 3273 | +inline bool sap_is_any(const c_sa_unique_ptr& sap) { return sa_is_any(sap.get()); } | ||
| 3274 | +inline bool sinp_is_any(const sin_unique_ptr& sinp) { return sin_is_any(sinp.get()); } | ||
| 3275 | +inline bool sinp_is_any(const c_sin_unique_ptr& sinp) { return sin_is_any(sinp.get()); } | ||
| 3276 | +inline bool sinp6_is_any(const sin6_unique_ptr& sin6p) { return sin6_is_any(sin6p.get()); } | ||
| 3277 | +inline bool sinp6_is_any(const c_sin6_unique_ptr& sin6p) { return sin6_is_any(sin6p.get()); } | ||
| 3278 | + | ||
| 3279 | +inline bool sap_is_broadcast(const sa_unique_ptr& sap) { return sa_is_broadcast(sap.get()); } | ||
| 3280 | +inline bool sap_is_broadcast(const c_sa_unique_ptr& sap) { return sa_is_broadcast(sap.get()); } | ||
| 3281 | +inline bool sinp_is_broadcast(const sin_unique_ptr& sap) { return sin_is_broadcast(sap.get()); } | ||
| 3282 | +inline bool sinp_is_broadcast(const c_sin_unique_ptr& sap) { return sin_is_broadcast(sap.get()); } | ||
| 3283 | + | ||
| 3284 | +inline bool sap_is_v4mapped(const sa_unique_ptr& sap) { return sa_is_v4mapped(sap.get()); } | ||
| 3285 | +inline bool sap_is_v4mapped(const c_sa_unique_ptr& sap) { return sa_is_v4mapped(sap.get()); } | ||
| 3286 | +inline bool sinp6_is_v4mapped(const sin6_unique_ptr& sin6p) { return sin6_is_v4mapped(sin6p.get()); } | ||
| 3287 | +inline bool sinp6_is_v4mapped(const c_sin6_unique_ptr& sin6p) { return sin6_is_v4mapped(sin6p.get()); } | ||
| 3288 | + | ||
| 3289 | +inline bool sap_is_port_any(const sa_unique_ptr& sap) { return sa_is_port_any(sap.get()); } | ||
| 3290 | +inline bool sap_is_port_any(const c_sa_unique_ptr& sap) { return sa_is_port_any(sap.get()); } | ||
| 3291 | + | ||
| 3292 | +inline size_t sap_length(const sa_unique_ptr& sap) { return sa_length(sap.get()); } | ||
| 3293 | +inline size_t sap_length(const c_sa_unique_ptr& sap) { return sa_length(sap.get()); } | ||
| 3294 | + | ||
| 3295 | +inline sa_unique_ptr sap_copy(const sa_unique_ptr& sap) { return sa_copy(sap.get()); } | ||
| 3296 | +inline sa_unique_ptr sap_copy(const c_sa_unique_ptr& sap) { return sa_copy(sap.get()); } | ||
| 3297 | +inline sa_unique_ptr sap_copy_addr(const sa_unique_ptr& sap, uint16_t port = 0) { return sa_copy_addr(sap.get(), port); } | ||
| 3298 | +inline sa_unique_ptr sap_copy_addr(const c_sa_unique_ptr& sap, uint16_t port = 0) { return sa_copy_addr(sap.get(), port); } | ||
| 3299 | +inline sa_unique_ptr sap_copy_in(const sin_unique_ptr& sinp) { return sa_copy_in(sinp.get()); } | ||
| 3300 | +inline sa_unique_ptr sap_copy_in(const c_sin_unique_ptr& sinp) { return sa_copy_in(sinp.get()); } | ||
| 3301 | +inline sa_unique_ptr sap_copy_in6(const sin6_unique_ptr& sin6p) { return sa_copy_in6(sin6p.get()); } | ||
| 3302 | +inline sa_unique_ptr sap_copy_in6(const c_sin6_unique_ptr& sin6p) { return sa_copy_in6(sin6p.get()); } | ||
| 3303 | + | ||
| 3304 | +inline sa_unique_ptr sap_from_v4mapped(const sa_unique_ptr& sap) { return sa_from_v4mapped(sap.get()); } | ||
| 3305 | +inline sa_unique_ptr sap_from_v4mapped(const c_sa_unique_ptr& sap) { return sa_from_v4mapped(sap.get()); } | ||
| 3306 | +inline sa_unique_ptr sap_to_v4mapped(const sa_unique_ptr& sap) { return sa_to_v4mapped(sap.get()); } | ||
| 3307 | +inline sa_unique_ptr sap_to_v4mapped(const c_sa_unique_ptr& sap) { return sa_to_v4mapped(sap.get()); } | ||
| 3308 | +inline sin_unique_ptr sinp_from_v4mapped_in6(const sin6_unique_ptr& sin6p) { return sin_from_v4mapped_in6(sin6p.get()); } | ||
| 3309 | +inline sin_unique_ptr sinp_from_v4mapped_in6(const c_sin6_unique_ptr& sin6p) { return sin_from_v4mapped_in6(sin6p.get()); } | ||
| 3310 | +inline sin6_unique_ptr sin6p_to_v4mapped_in(const sin_unique_ptr& sinp) { return sin6_to_v4mapped_in(sinp.get()); } | ||
| 3311 | +inline sin6_unique_ptr sin6p_to_v4mapped_in(const c_sin_unique_ptr& sinp) { return sin6_to_v4mapped_in(sinp.get()); } | ||
| 3312 | + | ||
| 3313 | +inline uint16_t sap_port(const sa_unique_ptr& sap) { return sa_port(sap.get()); } | ||
| 3314 | +inline uint16_t sap_port(const c_sa_unique_ptr& sap) { return sa_port(sap.get()); } | ||
| 3315 | +inline void sap_set_port(const sa_unique_ptr& sap, uint16_t port) { sa_set_port(sap.get(), port); } | ||
| 3316 | + | ||
| 3317 | +inline bool sap_equal(const sa_unique_ptr& lhs, const sa_unique_ptr& rhs) { return sa_equal(lhs.get(), rhs.get()); } | ||
| 3318 | +inline bool sap_equal(const sa_unique_ptr& lhs, const c_sa_unique_ptr& rhs) { return sa_equal(lhs.get(), rhs.get()); } | ||
| 3319 | +inline bool sap_equal(const c_sa_unique_ptr& lhs, const sa_unique_ptr& rhs) { return sa_equal(lhs.get(), rhs.get()); } | ||
| 3320 | +inline bool sap_equal(const c_sa_unique_ptr& lhs, const c_sa_unique_ptr& rhs) { return sa_equal(lhs.get(), rhs.get()); } | ||
| 3321 | +inline bool sinp_equal(const sin_unique_ptr& lhs, const sin_unique_ptr& rhs) { return sin_equal(lhs.get(), rhs.get()); } | ||
| 3322 | +inline bool sinp_equal(const sin_unique_ptr& lhs, const c_sin_unique_ptr& rhs) { return sin_equal(lhs.get(), rhs.get()); } | ||
| 3323 | +inline bool sinp_equal(const c_sin_unique_ptr& lhs, const sin_unique_ptr& rhs) { return sin_equal(lhs.get(), rhs.get()); } | ||
| 3324 | +inline bool sinp_equal(const c_sin_unique_ptr& lhs, const c_sin_unique_ptr& rhs) { return sin_equal(lhs.get(), rhs.get()); } | ||
| 3325 | +inline bool sin6p_equal(const sin6_unique_ptr& lhs, const sin6_unique_ptr& rhs) { return sin6_equal(lhs.get(), rhs.get()); } | ||
| 3326 | +inline bool sin6p_equal(const sin6_unique_ptr& lhs, const c_sin6_unique_ptr& rhs) { return sin6_equal(lhs.get(), rhs.get()); } | ||
| 3327 | +inline bool sin6p_equal(const c_sin6_unique_ptr& lhs, const sin6_unique_ptr& rhs) { return sin6_equal(lhs.get(), rhs.get()); } | ||
| 3328 | +inline bool sin6p_equal(const c_sin6_unique_ptr& lhs, const c_sin6_unique_ptr& rhs) { return sin6_equal(lhs.get(), rhs.get()); } | ||
| 3329 | + | ||
| 3330 | +inline bool sap_equal_addr(const sa_unique_ptr& lhs, const sa_unique_ptr& rhs) { return sa_equal_addr(lhs.get(), rhs.get()); } | ||
| 3331 | +inline bool sap_equal_addr(const sa_unique_ptr& lhs, const c_sa_unique_ptr& rhs) { return sa_equal_addr(lhs.get(), rhs.get()); } | ||
| 3332 | +inline bool sap_equal_addr(const c_sa_unique_ptr& lhs, const sa_unique_ptr& rhs) { return sa_equal_addr(lhs.get(), rhs.get()); } | ||
| 3333 | +inline bool sap_equal_addr(const c_sa_unique_ptr& lhs, const c_sa_unique_ptr& rhs) { return sa_equal_addr(lhs.get(), rhs.get()); } | ||
| 3334 | +inline bool sinp_equal_addr(const sin_unique_ptr& lhs, const sin_unique_ptr& rhs) { return sin_equal_addr(lhs.get(), rhs.get()); } | ||
| 3335 | +inline bool sinp_equal_addr(const sin_unique_ptr& lhs, const c_sin_unique_ptr& rhs) { return sin_equal_addr(lhs.get(), rhs.get()); } | ||
| 3336 | +inline bool sinp_equal_addr(const c_sin_unique_ptr& lhs, const sin_unique_ptr& rhs) { return sin_equal_addr(lhs.get(), rhs.get()); } | ||
| 3337 | +inline bool sinp_equal_addr(const c_sin_unique_ptr& lhs, const c_sin_unique_ptr& rhs) { return sin_equal_addr(lhs.get(), rhs.get()); } | ||
| 3338 | +inline bool sin6p_equal_addr(const sin6_unique_ptr& lhs, const sin6_unique_ptr& rhs) { return sin6_equal_addr(lhs.get(), rhs.get()); } | ||
| 3339 | +inline bool sin6p_equal_addr(const sin6_unique_ptr& lhs, const c_sin6_unique_ptr& rhs) { return sin6_equal_addr(lhs.get(), rhs.get()); } | ||
| 3340 | +inline bool sin6p_equal_addr(const c_sin6_unique_ptr& lhs, const sin6_unique_ptr& rhs) { return sin6_equal_addr(lhs.get(), rhs.get()); } | ||
| 3341 | +inline bool sin6p_equal_addr(const c_sin6_unique_ptr& lhs, const c_sin6_unique_ptr& rhs) { return sin6_equal_addr(lhs.get(), rhs.get()); } | ||
| 3342 | + | ||
| 3343 | +inline std::string sap_addr_str(const sa_unique_ptr& sap) { return sa_addr_str(sap.get()); } | ||
| 3344 | +inline std::string sap_addr_str(const c_sa_unique_ptr& sap) { return sa_addr_str(sap.get()); } | ||
| 3345 | +inline std::string sap_pretty_str(const sa_unique_ptr& sap) { return sa_pretty_str(sap.get()); } | ||
| 3346 | +inline std::string sap_pretty_str(const c_sa_unique_ptr& sap) { return sa_pretty_str(sap.get()); } | ||
| 3347 | + | ||
| 3348 | +// | ||
| 3349 | +// Implementations: | ||
| 3350 | +// | ||
| 3351 | + | ||
| 3352 | +inline sa_unique_ptr | ||
| 3353 | +sa_from_v4mapped_in6(const sockaddr_in6* sin6) { | ||
| 3354 | + return sa_from_in(sin_from_v4mapped_in6(sin6)); | ||
| 3355 | +} | ||
| 3356 | + | ||
| 3357 | +inline sa_unique_ptr | ||
| 3358 | +sa_to_v4mapped_in(const sockaddr_in* sin) { | ||
| 3359 | + return sa_from_in6(sin6_to_v4mapped_in(sin)); | ||
| 3360 | +} | ||
| 3361 | + | ||
| 3362 | +inline sa_unique_ptr | ||
| 3363 | +sa_from_in(sin_unique_ptr&& sinp) { | ||
| 3364 | + return sa_unique_ptr(reinterpret_cast<sockaddr*>(sinp.release())); | ||
| 3365 | +} | ||
| 3366 | + | ||
| 3367 | +inline c_sa_unique_ptr | ||
| 3368 | +sa_from_in(c_sin_unique_ptr&& sinp) { | ||
| 3369 | + return c_sa_unique_ptr(reinterpret_cast<const sockaddr*>(sinp.release())); | ||
| 3370 | +} | ||
| 3371 | + | ||
| 3372 | +inline sa_unique_ptr | ||
| 3373 | +sa_from_in6(sin6_unique_ptr&& sin6p) { | ||
| 3374 | + return sa_unique_ptr(reinterpret_cast<sockaddr*>(sin6p.release())); | ||
| 3375 | +} | ||
| 3376 | + | ||
| 3377 | +inline c_sa_unique_ptr | ||
| 3378 | +sa_from_in6(c_sin6_unique_ptr&& sin6p) { | ||
| 3379 | + return c_sa_unique_ptr(reinterpret_cast<const sockaddr*>(sin6p.release())); | ||
| 3380 | +} | ||
| 3381 | + | ||
| 3382 | +inline bool | ||
| 3383 | +fd_sap_equal(const fd_sap_tuple& lhs, const fd_sap_tuple& rhs) { | ||
| 3384 | + return std::get<0>(lhs) == std::get<0>(rhs) && sap_equal(std::get<1>(lhs), std::get<1>(rhs)); | ||
| 3385 | +} | ||
| 3386 | + | ||
| 3387 | +} | ||
| 3388 | + | ||
| 3389 | +#endif | ||
| 3390 | diff --git a/src/torrent/net/socket_address_key.h b/src/torrent/net/socket_address_key.h | ||
| 3391 | index 9d6e0c49..0fd0feb3 100644 | ||
| 3392 | --- a/src/torrent/net/socket_address_key.h | ||
| 3393 | +++ b/src/torrent/net/socket_address_key.h | ||
| 3394 | @@ -5,7 +5,7 @@ | ||
| 3395 | #define LIBTORRENT_UTILS_SOCKET_ADDRESS_KEY_H | ||
| 3396 | |||
| 3397 | #include <cstring> | ||
| 3398 | -#include <inttypes.h> | ||
| 3399 | +#include <cinttypes> | ||
| 3400 | #include <netinet/in.h> | ||
| 3401 | |||
| 3402 | // Unique key for the socket address, excluding port numbers, etc. | ||
| 3403 | diff --git a/src/torrent/net/socket_event.cc b/src/torrent/net/socket_event.cc | ||
| 3404 | new file mode 100644 | ||
| 3405 | index 00000000..e6805290 | ||
| 3406 | --- /dev/null | ||
| 3407 | +++ b/src/torrent/net/socket_event.cc | ||
| 3408 | @@ -0,0 +1,29 @@ | ||
| 3409 | +#include "config.h" | ||
| 3410 | + | ||
| 3411 | +#include "socket_event.h" | ||
| 3412 | + | ||
| 3413 | +#include "torrent/exceptions.h" | ||
| 3414 | + | ||
| 3415 | +namespace torrent { | ||
| 3416 | + | ||
| 3417 | +socket_event::~socket_event() { | ||
| 3418 | + if (is_open()) | ||
| 3419 | + throw internal_error("Called socket_event::~socket_event while still open on type " + std::string(type_name())); | ||
| 3420 | +} | ||
| 3421 | + | ||
| 3422 | +void | ||
| 3423 | +socket_event::event_read() { | ||
| 3424 | + throw internal_error("Called unsupported socket_event::event_read on type " + std::string(type_name())); | ||
| 3425 | +} | ||
| 3426 | + | ||
| 3427 | +void | ||
| 3428 | +socket_event::event_write() { | ||
| 3429 | + throw internal_error("Called unsupported socket_event::event_write on type " + std::string(type_name())); | ||
| 3430 | +} | ||
| 3431 | + | ||
| 3432 | +void | ||
| 3433 | +socket_event::event_error() { | ||
| 3434 | + throw internal_error("Called unsupported socket_event::event_error on type " + std::string(type_name())); | ||
| 3435 | +} | ||
| 3436 | + | ||
| 3437 | +} | ||
| 3438 | diff --git a/src/torrent/net/socket_event.h b/src/torrent/net/socket_event.h | ||
| 3439 | new file mode 100644 | ||
| 3440 | index 00000000..d9904bd6 | ||
| 3441 | --- /dev/null | ||
| 3442 | +++ b/src/torrent/net/socket_event.h | ||
| 3443 | @@ -0,0 +1,31 @@ | ||
| 3444 | +#ifndef LIBTORRENT_SOCKET_EVENT_H | ||
| 3445 | +#define LIBTORRENT_SOCKET_EVENT_H | ||
| 3446 | + | ||
| 3447 | +#include <cinttypes> | ||
| 3448 | + | ||
| 3449 | +#include "torrent/event.h" | ||
| 3450 | +#include "torrent/net/socket_address.h" | ||
| 3451 | + | ||
| 3452 | +namespace torrent { | ||
| 3453 | + | ||
| 3454 | +class LIBTORRENT_EXPORT socket_event : public Event { | ||
| 3455 | +public: | ||
| 3456 | + ~socket_event() override; | ||
| 3457 | + | ||
| 3458 | + const sockaddr* socket_address() const; | ||
| 3459 | + uint16_t socket_address_port() const; | ||
| 3460 | + | ||
| 3461 | + void event_read() override; | ||
| 3462 | + void event_write() override; | ||
| 3463 | + void event_error() override; | ||
| 3464 | + | ||
| 3465 | +protected: | ||
| 3466 | + sa_unique_ptr m_socket_address; | ||
| 3467 | +}; | ||
| 3468 | + | ||
| 3469 | +inline const sockaddr* socket_event::socket_address() const { return m_socket_address.get(); } | ||
| 3470 | +inline uint16_t socket_event::socket_address_port() const { return sap_port(m_socket_address); } | ||
| 3471 | + | ||
| 3472 | +} | ||
| 3473 | + | ||
| 3474 | +#endif | ||
| 3475 | diff --git a/src/torrent/net/types.h b/src/torrent/net/types.h | ||
| 3476 | new file mode 100644 | ||
| 3477 | index 00000000..016e8b85 | ||
| 3478 | --- /dev/null | ||
| 3479 | +++ b/src/torrent/net/types.h | ||
| 3480 | @@ -0,0 +1,33 @@ | ||
| 3481 | +#ifndef LIBTORRENT_NET_TYPES_H | ||
| 3482 | +#define LIBTORRENT_NET_TYPES_H | ||
| 3483 | + | ||
| 3484 | +#include <memory> | ||
| 3485 | +#include <tuple> | ||
| 3486 | +#include <sys/socket.h> | ||
| 3487 | + | ||
| 3488 | +struct sockaddr_in; | ||
| 3489 | +struct sockaddr_in6; | ||
| 3490 | +struct sockaddr_un; | ||
| 3491 | + | ||
| 3492 | +namespace torrent { | ||
| 3493 | + | ||
| 3494 | +typedef std::unique_ptr<sockaddr> sa_unique_ptr; | ||
| 3495 | +typedef std::unique_ptr<sockaddr_in> sin_unique_ptr; | ||
| 3496 | +typedef std::unique_ptr<sockaddr_in6> sin6_unique_ptr; | ||
| 3497 | +typedef std::unique_ptr<sockaddr_un> sun_unique_ptr; | ||
| 3498 | + | ||
| 3499 | +typedef std::unique_ptr<const sockaddr> c_sa_unique_ptr; | ||
| 3500 | +typedef std::unique_ptr<const sockaddr_in> c_sin_unique_ptr; | ||
| 3501 | +typedef std::unique_ptr<const sockaddr_in6> c_sin6_unique_ptr; | ||
| 3502 | +typedef std::unique_ptr<const sockaddr_un> c_sun_unique_ptr; | ||
| 3503 | + | ||
| 3504 | +typedef std::tuple<int, std::unique_ptr<sockaddr>> fd_sap_tuple; | ||
| 3505 | + | ||
| 3506 | +struct listen_result_type { | ||
| 3507 | + int fd; | ||
| 3508 | + sa_unique_ptr address; | ||
| 3509 | +}; | ||
| 3510 | + | ||
| 3511 | +} | ||
| 3512 | + | ||
| 3513 | +#endif | ||
| 3514 | diff --git a/src/torrent/object.h b/src/torrent/object.h | ||
| 3515 | index 3325a434..3f9fe7e4 100644 | ||
| 3516 | --- a/src/torrent/object.h | ||
| 3517 | +++ b/src/torrent/object.h | ||
| 3518 | @@ -37,8 +37,9 @@ | ||
| 3519 | #ifndef LIBTORRENT_OBJECT_H | ||
| 3520 | #define LIBTORRENT_OBJECT_H | ||
| 3521 | |||
| 3522 | -#include <string> | ||
| 3523 | +#include <limits> | ||
| 3524 | #include <map> | ||
| 3525 | +#include <string> | ||
| 3526 | #include <vector> | ||
| 3527 | #include <torrent/common.h> | ||
| 3528 | #include <torrent/exceptions.h> | ||
| 3529 | @@ -162,6 +163,7 @@ public: | ||
| 3530 | string_type& as_string() { check_throw(TYPE_STRING); return _string(); } | ||
| 3531 | const string_type& as_string() const { check_throw(TYPE_STRING); return _string(); } | ||
| 3532 | const string_type& as_string_c() const { check_throw(TYPE_STRING); return _string(); } | ||
| 3533 | + const char* as_c_str() const { check_throw(TYPE_STRING); return _string().c_str(); } | ||
| 3534 | list_type& as_list() { check_throw(TYPE_LIST); return _list(); } | ||
| 3535 | const list_type& as_list() const { check_throw(TYPE_LIST); return _list(); } | ||
| 3536 | map_type& as_map() { check_throw(TYPE_MAP); return _map(); } | ||
| 3537 | @@ -179,6 +181,8 @@ public: | ||
| 3538 | raw_map& as_raw_map() { check_throw(TYPE_RAW_MAP); return _raw_map(); } | ||
| 3539 | const raw_map& as_raw_map() const { check_throw(TYPE_RAW_MAP); return _raw_map(); } | ||
| 3540 | |||
| 3541 | + template <typename T> T as_value_type(const char* err_msg) const { check_value_throw<T>(err_msg); return _value(); } | ||
| 3542 | + | ||
| 3543 | bool has_key(const key_type& k) const { check_throw(TYPE_MAP); return _map().find(k) != _map().end(); } | ||
| 3544 | bool has_key_value(const key_type& k) const { check_throw(TYPE_MAP); return check(_map().find(k), TYPE_VALUE); } | ||
| 3545 | bool has_key_string(const key_type& k) const { check_throw(TYPE_MAP); return check(_map().find(k), TYPE_STRING); } | ||
| 3546 | @@ -246,6 +250,8 @@ public: | ||
| 3547 | inline bool check(map_type::const_iterator itr, type_type t) const { return itr != _map().end() && itr->second.type() == t; } | ||
| 3548 | inline void check_throw(type_type t) const { if (t != type()) throw bencode_error("Wrong object type."); } | ||
| 3549 | |||
| 3550 | + template <typename T> void check_value_throw(const char* err_msg) const; | ||
| 3551 | + | ||
| 3552 | uint32_t m_flags; | ||
| 3553 | |||
| 3554 | #ifndef HAVE_STDCXX_0X | ||
| 3555 | @@ -484,6 +490,19 @@ object_equal(const Object& left, const Object& right) { | ||
| 3556 | } | ||
| 3557 | } | ||
| 3558 | |||
| 3559 | +template <typename T> | ||
| 3560 | +inline void | ||
| 3561 | +Object::check_value_throw(const char* err_msg) const { | ||
| 3562 | + if (!std::numeric_limits<T>::is_integer) | ||
| 3563 | + throw internal_error("Tried to check value with non-integer type."); | ||
| 3564 | + | ||
| 3565 | + if (!is_value()) | ||
| 3566 | + throw bencode_error(err_msg); | ||
| 3567 | + | ||
| 3568 | + if (!(_value() >= std::numeric_limits<T>::min() && _value() <= std::numeric_limits<T>::max())) | ||
| 3569 | + throw bencode_error(err_msg); | ||
| 3570 | +} | ||
| 3571 | + | ||
| 3572 | } | ||
| 3573 | |||
| 3574 | #endif | ||
| 3575 | diff --git a/src/torrent/peer/client_list.cc b/src/torrent/peer/client_list.cc | ||
| 3576 | index c857f62d..9c18aa50 100644 | ||
| 3577 | --- a/src/torrent/peer/client_list.cc | ||
| 3578 | +++ b/src/torrent/peer/client_list.cc | ||
| 3579 | @@ -37,8 +37,8 @@ | ||
| 3580 | #include "config.h" | ||
| 3581 | |||
| 3582 | #include <algorithm> | ||
| 3583 | +#include <functional> | ||
| 3584 | #include <rak/string_manip.h> | ||
| 3585 | -#include lt_tr1_functional | ||
| 3586 | |||
| 3587 | #include "client_list.h" | ||
| 3588 | #include "exceptions.h" | ||
| 3589 | diff --git a/src/torrent/peer/connection_list.h b/src/torrent/peer/connection_list.h | ||
| 3590 | index ec26835f..eb058784 100644 | ||
| 3591 | --- a/src/torrent/peer/connection_list.h | ||
| 3592 | +++ b/src/torrent/peer/connection_list.h | ||
| 3593 | @@ -37,9 +37,10 @@ | ||
| 3594 | #ifndef LIBTORRENT_PEER_CONNECTION_LIST_H | ||
| 3595 | #define LIBTORRENT_PEER_CONNECTION_LIST_H | ||
| 3596 | |||
| 3597 | +#include <functional> | ||
| 3598 | #include <list> | ||
| 3599 | #include <vector> | ||
| 3600 | -#include lt_tr1_functional | ||
| 3601 | + | ||
| 3602 | #include <torrent/common.h> | ||
| 3603 | #include <torrent/hash_string.h> | ||
| 3604 | |||
| 3605 | diff --git a/src/torrent/peer/peer_list.cc b/src/torrent/peer/peer_list.cc | ||
| 3606 | index aa60939a..080a7f13 100644 | ||
| 3607 | --- a/src/torrent/peer/peer_list.cc | ||
| 3608 | +++ b/src/torrent/peer/peer_list.cc | ||
| 3609 | @@ -36,8 +36,6 @@ | ||
| 3610 | |||
| 3611 | #include "config.h" | ||
| 3612 | |||
| 3613 | -#define __STDC_FORMAT_MACROS | ||
| 3614 | - | ||
| 3615 | #include <algorithm> | ||
| 3616 | #include <functional> | ||
| 3617 | #include <rak/functional.h> | ||
| 3618 | @@ -56,6 +54,8 @@ | ||
| 3619 | |||
| 3620 | #define LT_LOG_EVENTS(log_fmt, ...) \ | ||
| 3621 | lt_log_print_info(LOG_PEER_LIST_EVENTS, m_info, "peer_list", log_fmt, __VA_ARGS__); | ||
| 3622 | +#define LT_LOG_ADDRESS(log_fmt, ...) \ | ||
| 3623 | + lt_log_print_info(LOG_PEER_LIST_ADDRESS, m_info, "peer_list", log_fmt, __VA_ARGS__); | ||
| 3624 | #define LT_LOG_SA_FMT "'%s:%" PRIu16 "'" | ||
| 3625 | |||
| 3626 | namespace torrent { | ||
| 3627 | @@ -196,6 +196,7 @@ PeerList::insert_available(const void* al) { | ||
| 3628 | for (; itr != last; itr++) { | ||
| 3629 | if (!socket_address_key::is_comparable_sockaddr(itr->c_sockaddr()) || itr->port() == 0) { | ||
| 3630 | invalid++; | ||
| 3631 | + LT_LOG_ADDRESS("skipped invalid address " LT_LOG_SA_FMT, itr->address_str().c_str(), itr->port()); | ||
| 3632 | continue; | ||
| 3633 | } | ||
| 3634 | |||
| 3635 | @@ -242,6 +243,8 @@ PeerList::insert_available(const void* al) { | ||
| 3636 | |||
| 3637 | inserted++; | ||
| 3638 | m_available_list->push_back(&*itr); | ||
| 3639 | + | ||
| 3640 | + LT_LOG_ADDRESS("added available address " LT_LOG_SA_FMT, itr->address_str().c_str(), itr->port()); | ||
| 3641 | } | ||
| 3642 | |||
| 3643 | LT_LOG_EVENTS("inserted peers" | ||
| 3644 | diff --git a/src/torrent/poll.h b/src/torrent/poll.h | ||
| 3645 | index b12c8ec2..15a73897 100644 | ||
| 3646 | --- a/src/torrent/poll.h | ||
| 3647 | +++ b/src/torrent/poll.h | ||
| 3648 | @@ -37,8 +37,7 @@ | ||
| 3649 | #ifndef LIBTORRENT_TORRENT_POLL_H | ||
| 3650 | #define LIBTORRENT_TORRENT_POLL_H | ||
| 3651 | |||
| 3652 | -#include lt_tr1_functional | ||
| 3653 | - | ||
| 3654 | +#include <functional> | ||
| 3655 | #include <torrent/common.h> | ||
| 3656 | |||
| 3657 | namespace torrent { | ||
| 3658 | diff --git a/src/torrent/torrent.cc b/src/torrent/torrent.cc | ||
| 3659 | index 339c2c4f..fb70d247 100644 | ||
| 3660 | --- a/src/torrent/torrent.cc | ||
| 3661 | +++ b/src/torrent/torrent.cc | ||
| 3662 | @@ -1,39 +1,3 @@ | ||
| 3663 | -// libTorrent - BitTorrent library | ||
| 3664 | -// Copyright (C) 2005-2011, Jari Sundell | ||
| 3665 | -// | ||
| 3666 | -// This program is free software; you can redistribute it and/or modify | ||
| 3667 | -// it under the terms of the GNU General Public License as published by | ||
| 3668 | -// the Free Software Foundation; either version 2 of the License, or | ||
| 3669 | -// (at your option) any later version. | ||
| 3670 | -// | ||
| 3671 | -// This program is distributed in the hope that it will be useful, | ||
| 3672 | -// but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
| 3673 | -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
| 3674 | -// GNU General Public License for more details. | ||
| 3675 | -// | ||
| 3676 | -// You should have received a copy of the GNU General Public License | ||
| 3677 | -// along with this program; if not, write to the Free Software | ||
| 3678 | -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | ||
| 3679 | -// | ||
| 3680 | -// In addition, as a special exception, the copyright holders give | ||
| 3681 | -// permission to link the code of portions of this program with the | ||
| 3682 | -// OpenSSL library under certain conditions as described in each | ||
| 3683 | -// individual source file, and distribute linked combinations | ||
| 3684 | -// including the two. | ||
| 3685 | -// | ||
| 3686 | -// You must obey the GNU General Public License in all respects for | ||
| 3687 | -// all of the code used other than OpenSSL. If you modify file(s) | ||
| 3688 | -// with this exception, you may extend this exception to your version | ||
| 3689 | -// of the file(s), but you are not obligated to do so. If you do not | ||
| 3690 | -// wish to do so, delete this exception statement from your version. | ||
| 3691 | -// If you delete this exception statement from all source files in the | ||
| 3692 | -// program, then also delete it here. | ||
| 3693 | -// | ||
| 3694 | -// Contact: Jari Sundell <jaris@ifi.uio.no> | ||
| 3695 | -// | ||
| 3696 | -// Skomakerveien 33 | ||
| 3697 | -// 3185 Skoppum, NORWAY | ||
| 3698 | - | ||
| 3699 | #include "config.h" | ||
| 3700 | |||
| 3701 | #include <rak/address_info.h> | ||
| 3702 | @@ -139,8 +103,8 @@ main_thread() { | ||
| 3703 | |||
| 3704 | ChunkManager* chunk_manager() { return manager->chunk_manager(); } | ||
| 3705 | ClientList* client_list() { return manager->client_list(); } | ||
| 3706 | -FileManager* file_manager() { return manager->file_manager(); } | ||
| 3707 | ConnectionManager* connection_manager() { return manager->connection_manager(); } | ||
| 3708 | +FileManager* file_manager() { return manager->file_manager(); } | ||
| 3709 | DhtManager* dht_manager() { return manager->dht_manager(); } | ||
| 3710 | ResourceManager* resource_manager() { return manager->resource_manager(); } | ||
| 3711 | |||
| 3712 | @@ -189,8 +153,10 @@ download_add(Object* object) { | ||
| 3713 | download->main()->set_metadata_size(metadata_size); | ||
| 3714 | } | ||
| 3715 | |||
| 3716 | + std::string local_id = PEER_NAME + rak::generate_random<std::string>(20 - std::string(PEER_NAME).size()); | ||
| 3717 | + | ||
| 3718 | download->set_hash_queue(manager->hash_queue()); | ||
| 3719 | - download->initialize(infoHash, PEER_NAME + rak::generate_random<std::string>(20 - std::string(PEER_NAME).size())); | ||
| 3720 | + download->initialize(infoHash, local_id); | ||
| 3721 | |||
| 3722 | // Add trackers, etc, after setting the info hash so that log | ||
| 3723 | // entries look sane. | ||
| 3724 | diff --git a/src/torrent/torrent.h b/src/torrent/torrent.h | ||
| 3725 | index 7bcf88fe..0cdfdaa7 100644 | ||
| 3726 | --- a/src/torrent/torrent.h | ||
| 3727 | +++ b/src/torrent/torrent.h | ||
| 3728 | @@ -44,6 +44,11 @@ | ||
| 3729 | |||
| 3730 | namespace torrent { | ||
| 3731 | |||
| 3732 | +class FileManager; | ||
| 3733 | +class ResourceManager; | ||
| 3734 | + | ||
| 3735 | +class thread_base; | ||
| 3736 | + | ||
| 3737 | // Make sure you seed srandom and srand48 if available. | ||
| 3738 | void initialize() LIBTORRENT_EXPORT; | ||
| 3739 | |||
| 3740 | @@ -53,16 +58,12 @@ void cleanup() LIBTORRENT_EXPORT; | ||
| 3741 | |||
| 3742 | bool is_inactive() LIBTORRENT_EXPORT; | ||
| 3743 | |||
| 3744 | -class FileManager; | ||
| 3745 | -class ResourceManager; | ||
| 3746 | -class thread_base; | ||
| 3747 | - | ||
| 3748 | thread_base* main_thread() LIBTORRENT_EXPORT; | ||
| 3749 | |||
| 3750 | ChunkManager* chunk_manager() LIBTORRENT_EXPORT; | ||
| 3751 | ClientList* client_list() LIBTORRENT_EXPORT; | ||
| 3752 | -FileManager* file_manager() LIBTORRENT_EXPORT; | ||
| 3753 | ConnectionManager* connection_manager() LIBTORRENT_EXPORT; | ||
| 3754 | +FileManager* file_manager() LIBTORRENT_EXPORT; | ||
| 3755 | DhtManager* dht_manager() LIBTORRENT_EXPORT; | ||
| 3756 | ResourceManager* resource_manager() LIBTORRENT_EXPORT; | ||
| 3757 | |||
| 3758 | diff --git a/src/torrent/tracker.h b/src/torrent/tracker.h | ||
| 3759 | index a528ef6a..bd7546a9 100644 | ||
| 3760 | --- a/src/torrent/tracker.h | ||
| 3761 | +++ b/src/torrent/tracker.h | ||
| 3762 | @@ -2,7 +2,7 @@ | ||
| 3763 | #define LIBTORRENT_TRACKER_H | ||
| 3764 | |||
| 3765 | #include <string> | ||
| 3766 | -#include <inttypes.h> | ||
| 3767 | +#include <cinttypes> | ||
| 3768 | #include <torrent/common.h> | ||
| 3769 | |||
| 3770 | namespace torrent { | ||
| 3771 | diff --git a/src/torrent/tracker_controller.h b/src/torrent/tracker_controller.h | ||
| 3772 | index 70d1b43f..9452be0f 100644 | ||
| 3773 | --- a/src/torrent/tracker_controller.h | ||
| 3774 | +++ b/src/torrent/tracker_controller.h | ||
| 3775 | @@ -37,8 +37,9 @@ | ||
| 3776 | #ifndef LIBTORRENT_TRACKER_CONTROLLER_H | ||
| 3777 | #define LIBTORRENT_TRACKER_CONTROLLER_H | ||
| 3778 | |||
| 3779 | +#include <functional> | ||
| 3780 | #include <string> | ||
| 3781 | -#include lt_tr1_functional | ||
| 3782 | + | ||
| 3783 | #include <torrent/common.h> | ||
| 3784 | #include <torrent/tracker.h> | ||
| 3785 | |||
| 3786 | diff --git a/src/torrent/tracker_list.h b/src/torrent/tracker_list.h | ||
| 3787 | index c6817b3a..bb06f8af 100644 | ||
| 3788 | --- a/src/torrent/tracker_list.h | ||
| 3789 | +++ b/src/torrent/tracker_list.h | ||
| 3790 | @@ -38,10 +38,10 @@ | ||
| 3791 | #define LIBTORRENT_TRACKER_LIST_H | ||
| 3792 | |||
| 3793 | #include <algorithm> | ||
| 3794 | +#include <functional> | ||
| 3795 | #include <string> | ||
| 3796 | #include <vector> | ||
| 3797 | #include <torrent/common.h> | ||
| 3798 | -#include lt_tr1_functional | ||
| 3799 | |||
| 3800 | namespace torrent { | ||
| 3801 | |||
| 3802 | diff --git a/src/torrent/utils/Makefile.am b/src/torrent/utils/Makefile.am | ||
| 3803 | index 51c9a026..a48786c6 100644 | ||
| 3804 | --- a/src/torrent/utils/Makefile.am | ||
| 3805 | +++ b/src/torrent/utils/Makefile.am | ||
| 3806 | @@ -8,10 +8,10 @@ libsub_torrentutils_la_SOURCES = \ | ||
| 3807 | log.h \ | ||
| 3808 | log_buffer.cc \ | ||
| 3809 | log_buffer.h \ | ||
| 3810 | - net.cc \ | ||
| 3811 | - net.h \ | ||
| 3812 | option_strings.cc \ | ||
| 3813 | option_strings.h \ | ||
| 3814 | + random.cc \ | ||
| 3815 | + random.h \ | ||
| 3816 | ranges.h \ | ||
| 3817 | resume.cc \ | ||
| 3818 | resume.h \ | ||
| 3819 | @@ -32,7 +32,6 @@ libtorrentinclude_HEADERS = \ | ||
| 3820 | extents.h \ | ||
| 3821 | log.h \ | ||
| 3822 | log_buffer.h \ | ||
| 3823 | - net.h \ | ||
| 3824 | option_strings.h \ | ||
| 3825 | ranges.h \ | ||
| 3826 | resume.h \ | ||
| 3827 | diff --git a/src/torrent/utils/directory_events.h b/src/torrent/utils/directory_events.h | ||
| 3828 | index 30fa0508..fd9246c5 100644 | ||
| 3829 | --- a/src/torrent/utils/directory_events.h | ||
| 3830 | +++ b/src/torrent/utils/directory_events.h | ||
| 3831 | @@ -37,9 +37,10 @@ | ||
| 3832 | #ifndef LIBTORRENT_DIRECTORY_EVENTS_H | ||
| 3833 | #define LIBTORRENT_DIRECTORY_EVENTS_H | ||
| 3834 | |||
| 3835 | +#include <functional> | ||
| 3836 | #include <string> | ||
| 3837 | #include <vector> | ||
| 3838 | -#include lt_tr1_functional | ||
| 3839 | + | ||
| 3840 | #include <torrent/event.h> | ||
| 3841 | |||
| 3842 | namespace torrent { | ||
| 3843 | diff --git a/src/torrent/utils/log.cc b/src/torrent/utils/log.cc | ||
| 3844 | index 6c605474..b855a2c6 100644 | ||
| 3845 | --- a/src/torrent/utils/log.cc | ||
| 3846 | +++ b/src/torrent/utils/log.cc | ||
| 3847 | @@ -1,45 +1,6 @@ | ||
| 3848 | -// libTorrent - BitTorrent library | ||
| 3849 | -// Copyright (C) 2005-2011, Jari Sundell | ||
| 3850 | -// | ||
| 3851 | -// This program is free software; you can redistribute it and/or modify | ||
| 3852 | -// it under the terms of the GNU General Public License as published by | ||
| 3853 | -// the Free Software Foundation; either version 2 of the License, or | ||
| 3854 | -// (at your option) any later version. | ||
| 3855 | -// | ||
| 3856 | -// This program is distributed in the hope that it will be useful, | ||
| 3857 | -// but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
| 3858 | -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
| 3859 | -// GNU General Public License for more details. | ||
| 3860 | -// | ||
| 3861 | -// You should have received a copy of the GNU General Public License | ||
| 3862 | -// along with this program; if not, write to the Free Software | ||
| 3863 | -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | ||
| 3864 | -// | ||
| 3865 | -// In addition, as a special exception, the copyright holders give | ||
| 3866 | -// permission to link the code of portions of this program with the | ||
| 3867 | -// OpenSSL library under certain conditions as described in each | ||
| 3868 | -// individual source file, and distribute linked combinations | ||
| 3869 | -// including the two. | ||
| 3870 | -// | ||
| 3871 | -// You must obey the GNU General Public License in all respects for | ||
| 3872 | -// all of the code used other than OpenSSL. If you modify file(s) | ||
| 3873 | -// with this exception, you may extend this exception to your version | ||
| 3874 | -// of the file(s), but you are not obligated to do so. If you do not | ||
| 3875 | -// wish to do so, delete this exception statement from your version. | ||
| 3876 | -// If you delete this exception statement from all source files in the | ||
| 3877 | -// program, then also delete it here. | ||
| 3878 | -// | ||
| 3879 | -// Contact: Jari Sundell <jaris@ifi.uio.no> | ||
| 3880 | -// | ||
| 3881 | -// Skomakerveien 33 | ||
| 3882 | -// 3185 Skoppum, NORWAY | ||
| 3883 | - | ||
| 3884 | #include "config.h" | ||
| 3885 | |||
| 3886 | -#define __STDC_FORMAT_MACROS | ||
| 3887 | - | ||
| 3888 | #include "log.h" | ||
| 3889 | -#include "log_buffer.h" | ||
| 3890 | |||
| 3891 | #include "globals.h" | ||
| 3892 | #include "torrent/exceptions.h" | ||
| 3893 | @@ -54,8 +15,6 @@ | ||
| 3894 | #include <fstream> | ||
| 3895 | #include <functional> | ||
| 3896 | #include <memory> | ||
| 3897 | -#include lt_tr1_functional | ||
| 3898 | -#include lt_tr1_memory | ||
| 3899 | |||
| 3900 | namespace torrent { | ||
| 3901 | |||
| 3902 | @@ -232,7 +191,6 @@ log_initialize() { | ||
| 3903 | |||
| 3904 | LOG_CASCADE(LOG_CRITICAL); | ||
| 3905 | |||
| 3906 | - LOG_CASCADE(LOG_CONNECTION_CRITICAL); | ||
| 3907 | LOG_CASCADE(LOG_PEER_CRITICAL); | ||
| 3908 | LOG_CASCADE(LOG_SOCKET_CRITICAL); | ||
| 3909 | LOG_CASCADE(LOG_STORAGE_CRITICAL); | ||
| 3910 | @@ -240,7 +198,6 @@ log_initialize() { | ||
| 3911 | LOG_CASCADE(LOG_TRACKER_CRITICAL); | ||
| 3912 | LOG_CASCADE(LOG_TORRENT_CRITICAL); | ||
| 3913 | |||
| 3914 | - LOG_CHILDREN_CASCADE(LOG_CRITICAL, LOG_CONNECTION_CRITICAL); | ||
| 3915 | LOG_CHILDREN_CASCADE(LOG_CRITICAL, LOG_PEER_CRITICAL); | ||
| 3916 | LOG_CHILDREN_CASCADE(LOG_CRITICAL, LOG_SOCKET_CRITICAL); | ||
| 3917 | LOG_CHILDREN_CASCADE(LOG_CRITICAL, LOG_STORAGE_CRITICAL); | ||
| 3918 | @@ -248,6 +205,12 @@ log_initialize() { | ||
| 3919 | LOG_CHILDREN_CASCADE(LOG_CRITICAL, LOG_TRACKER_CRITICAL); | ||
| 3920 | LOG_CHILDREN_CASCADE(LOG_CRITICAL, LOG_TORRENT_CRITICAL); | ||
| 3921 | |||
| 3922 | + LOG_LINK(LOG_CONNECTION, LOG_CONNECTION_BIND); | ||
| 3923 | + LOG_LINK(LOG_CONNECTION, LOG_CONNECTION_FD); | ||
| 3924 | + LOG_LINK(LOG_CONNECTION, LOG_CONNECTION_FILTER); | ||
| 3925 | + LOG_LINK(LOG_CONNECTION, LOG_CONNECTION_HANDSHAKE); | ||
| 3926 | + LOG_LINK(LOG_CONNECTION, LOG_CONNECTION_LISTEN); | ||
| 3927 | + | ||
| 3928 | LOG_LINK(LOG_DHT_ALL, LOG_DHT_MANAGER); | ||
| 3929 | LOG_LINK(LOG_DHT_ALL, LOG_DHT_NODE); | ||
| 3930 | LOG_LINK(LOG_DHT_ALL, LOG_DHT_ROUTER); | ||
| 3931 | @@ -447,21 +410,4 @@ log_open_gz_file_output(const char* name, const char* filename, bool append) { | ||
| 3932 | std::placeholders::_3)); | ||
| 3933 | } | ||
| 3934 | |||
| 3935 | -log_buffer* | ||
| 3936 | -log_open_log_buffer(const char* name) { | ||
| 3937 | - log_buffer* buffer = new log_buffer; | ||
| 3938 | - | ||
| 3939 | - try { | ||
| 3940 | - log_open_output(name, std::bind(&log_buffer::lock_and_push_log, buffer, | ||
| 3941 | - std::placeholders::_1, | ||
| 3942 | - std::placeholders::_2, | ||
| 3943 | - std::placeholders::_3)); | ||
| 3944 | - return buffer; | ||
| 3945 | - | ||
| 3946 | - } catch (torrent::input_error& e) { | ||
| 3947 | - delete buffer; | ||
| 3948 | - throw; | ||
| 3949 | - } | ||
| 3950 | -} | ||
| 3951 | - | ||
| 3952 | } | ||
| 3953 | diff --git a/src/torrent/utils/log.h b/src/torrent/utils/log.h | ||
| 3954 | index 0dfdc86b..fe6127d6 100644 | ||
| 3955 | --- a/src/torrent/utils/log.h | ||
| 3956 | +++ b/src/torrent/utils/log.h | ||
| 3957 | @@ -1,47 +1,12 @@ | ||
| 3958 | -// libTorrent - BitTorrent library | ||
| 3959 | -// Copyright (C) 2005-2011, Jari Sundell | ||
| 3960 | -// | ||
| 3961 | -// This program is free software; you can redistribute it and/or modify | ||
| 3962 | -// it under the terms of the GNU General Public License as published by | ||
| 3963 | -// the Free Software Foundation; either version 2 of the License, or | ||
| 3964 | -// (at your option) any later version. | ||
| 3965 | -// | ||
| 3966 | -// This program is distributed in the hope that it will be useful, | ||
| 3967 | -// but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
| 3968 | -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
| 3969 | -// GNU General Public License for more details. | ||
| 3970 | -// | ||
| 3971 | -// You should have received a copy of the GNU General Public License | ||
| 3972 | -// along with this program; if not, write to the Free Software | ||
| 3973 | -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | ||
| 3974 | -// | ||
| 3975 | -// In addition, as a special exception, the copyright holders give | ||
| 3976 | -// permission to link the code of portions of this program with the | ||
| 3977 | -// OpenSSL library under certain conditions as described in each | ||
| 3978 | -// individual source file, and distribute linked combinations | ||
| 3979 | -// including the two. | ||
| 3980 | -// | ||
| 3981 | -// You must obey the GNU General Public License in all respects for | ||
| 3982 | -// all of the code used other than OpenSSL. If you modify file(s) | ||
| 3983 | -// with this exception, you may extend this exception to your version | ||
| 3984 | -// of the file(s), but you are not obligated to do so. If you do not | ||
| 3985 | -// wish to do so, delete this exception statement from your version. | ||
| 3986 | -// If you delete this exception statement from all source files in the | ||
| 3987 | -// program, then also delete it here. | ||
| 3988 | -// | ||
| 3989 | -// Contact: Jari Sundell <jaris@ifi.uio.no> | ||
| 3990 | -// | ||
| 3991 | -// Skomakerveien 33 | ||
| 3992 | -// 3185 Skoppum, NORWAY | ||
| 3993 | - | ||
| 3994 | #ifndef LIBTORRENT_UTILS_LOG_H | ||
| 3995 | #define LIBTORRENT_UTILS_LOG_H | ||
| 3996 | |||
| 3997 | +#include <array> | ||
| 3998 | #include <bitset> | ||
| 3999 | +#include <functional> | ||
| 4000 | #include <string> | ||
| 4001 | #include <vector> | ||
| 4002 | -#include lt_tr1_array | ||
| 4003 | -#include lt_tr1_functional | ||
| 4004 | + | ||
| 4005 | #include <torrent/common.h> | ||
| 4006 | |||
| 4007 | namespace torrent { | ||
| 4008 | @@ -55,13 +20,6 @@ enum { | ||
| 4009 | LOG_INFO, | ||
| 4010 | LOG_DEBUG, | ||
| 4011 | |||
| 4012 | - LOG_CONNECTION_CRITICAL, | ||
| 4013 | - LOG_CONNECTION_ERROR, | ||
| 4014 | - LOG_CONNECTION_WARN, | ||
| 4015 | - LOG_CONNECTION_NOTICE, | ||
| 4016 | - LOG_CONNECTION_INFO, | ||
| 4017 | - LOG_CONNECTION_DEBUG, | ||
| 4018 | - | ||
| 4019 | LOG_DHT_CRITICAL, | ||
| 4020 | LOG_DHT_ERROR, | ||
| 4021 | LOG_DHT_WARN, | ||
| 4022 | @@ -113,6 +71,14 @@ enum { | ||
| 4023 | |||
| 4024 | LOG_NON_CASCADING, | ||
| 4025 | |||
| 4026 | + LOG_CONNECTION, | ||
| 4027 | + LOG_CONNECTION_BIND, | ||
| 4028 | + LOG_CONNECTION_FD, | ||
| 4029 | + LOG_CONNECTION_FILTER, | ||
| 4030 | + LOG_CONNECTION_HANDSHAKE, | ||
| 4031 | + LOG_CONNECTION_LISTEN, | ||
| 4032 | + | ||
| 4033 | + // TODO: Rename dht_all to just dht. | ||
| 4034 | LOG_DHT_ALL, | ||
| 4035 | LOG_DHT_MANAGER, | ||
| 4036 | LOG_DHT_NODE, | ||
| 4037 | @@ -125,7 +91,10 @@ enum { | ||
| 4038 | LOG_INSTRUMENTATION_POLLING, | ||
| 4039 | LOG_INSTRUMENTATION_TRANSFERS, | ||
| 4040 | |||
| 4041 | + LOG_MOCK_CALLS, | ||
| 4042 | + | ||
| 4043 | LOG_PEER_LIST_EVENTS, | ||
| 4044 | + LOG_PEER_LIST_ADDRESS, | ||
| 4045 | |||
| 4046 | LOG_PROTOCOL_PIECE_EVENTS, | ||
| 4047 | LOG_PROTOCOL_METADATA_EVENTS, | ||
| 4048 | @@ -137,6 +106,8 @@ enum { | ||
| 4049 | LOG_RPC_EVENTS, | ||
| 4050 | LOG_RPC_DUMP, | ||
| 4051 | |||
| 4052 | + LOG_SYSTEM, | ||
| 4053 | + | ||
| 4054 | LOG_UI_EVENTS, | ||
| 4055 | |||
| 4056 | LOG_GROUP_MAX_SIZE | ||
| 4057 | @@ -145,34 +116,32 @@ enum { | ||
| 4058 | #define lt_log_is_valid(log_group) (torrent::log_groups[log_group].valid()) | ||
| 4059 | |||
| 4060 | #define lt_log_print(log_group, ...) \ | ||
| 4061 | - if (torrent::log_groups[log_group].valid()) \ | ||
| 4062 | - torrent::log_groups[log_group].internal_print(NULL, NULL, NULL, 0, __VA_ARGS__); | ||
| 4063 | + { if (torrent::log_groups[log_group].valid()) \ | ||
| 4064 | + torrent::log_groups[log_group].internal_print(NULL, NULL, NULL, 0, __VA_ARGS__); } | ||
| 4065 | |||
| 4066 | #define lt_log_print_info(log_group, log_info, log_subsystem, ...) \ | ||
| 4067 | - if (torrent::log_groups[log_group].valid()) \ | ||
| 4068 | - torrent::log_groups[log_group].internal_print(&log_info->hash(), log_subsystem, NULL, 0, __VA_ARGS__); | ||
| 4069 | + { if (torrent::log_groups[log_group].valid()) \ | ||
| 4070 | + torrent::log_groups[log_group].internal_print(&log_info->hash(), log_subsystem, NULL, 0, __VA_ARGS__); } | ||
| 4071 | |||
| 4072 | #define lt_log_print_data(log_group, log_data, log_subsystem, ...) \ | ||
| 4073 | - if (torrent::log_groups[log_group].valid()) \ | ||
| 4074 | - torrent::log_groups[log_group].internal_print(&log_data->hash(), log_subsystem, NULL, 0, __VA_ARGS__); | ||
| 4075 | + { if (torrent::log_groups[log_group].valid()) \ | ||
| 4076 | + torrent::log_groups[log_group].internal_print(&log_data->hash(), log_subsystem, NULL, 0, __VA_ARGS__); } | ||
| 4077 | |||
| 4078 | #define lt_log_print_dump(log_group, log_dump_data, log_dump_size, ...) \ | ||
| 4079 | - if (torrent::log_groups[log_group].valid()) \ | ||
| 4080 | - torrent::log_groups[log_group].internal_print(NULL, NULL, log_dump_data, log_dump_size, __VA_ARGS__); \ | ||
| 4081 | + { if (torrent::log_groups[log_group].valid()) \ | ||
| 4082 | + torrent::log_groups[log_group].internal_print(NULL, NULL, log_dump_data, log_dump_size, __VA_ARGS__); } | ||
| 4083 | |||
| 4084 | #define lt_log_print_hash(log_group, log_hash, log_subsystem, ...) \ | ||
| 4085 | - if (torrent::log_groups[log_group].valid()) \ | ||
| 4086 | - torrent::log_groups[log_group].internal_print(&log_hash, log_subsystem, NULL, 0, __VA_ARGS__); | ||
| 4087 | + { if (torrent::log_groups[log_group].valid()) \ | ||
| 4088 | + torrent::log_groups[log_group].internal_print(&log_hash, log_subsystem, NULL, 0, __VA_ARGS__); } | ||
| 4089 | |||
| 4090 | #define lt_log_print_info_dump(log_group, log_dump_data, log_dump_size, log_info, log_subsystem, ...) \ | ||
| 4091 | - if (torrent::log_groups[log_group].valid()) \ | ||
| 4092 | - torrent::log_groups[log_group].internal_print(&log_info->hash(), log_subsystem, log_dump_data, log_dump_size, __VA_ARGS__); \ | ||
| 4093 | + { if (torrent::log_groups[log_group].valid()) \ | ||
| 4094 | + torrent::log_groups[log_group].internal_print(&log_info->hash(), log_subsystem, log_dump_data, log_dump_size, __VA_ARGS__); } | ||
| 4095 | |||
| 4096 | #define lt_log_print_subsystem(log_group, log_subsystem, ...) \ | ||
| 4097 | - if (torrent::log_groups[log_group].valid()) \ | ||
| 4098 | - torrent::log_groups[log_group].internal_print(NULL, log_subsystem, NULL, 0, __VA_ARGS__); | ||
| 4099 | - | ||
| 4100 | -class log_buffer; | ||
| 4101 | + { if (torrent::log_groups[log_group].valid()) \ | ||
| 4102 | + torrent::log_groups[log_group].internal_print(NULL, log_subsystem, NULL, 0, __VA_ARGS__); } | ||
| 4103 | |||
| 4104 | typedef std::function<void (const char*, unsigned int, int)> log_slot; | ||
| 4105 | |||
| 4106 | @@ -222,7 +191,7 @@ private: | ||
| 4107 | |||
| 4108 | typedef std::array<log_group, LOG_GROUP_MAX_SIZE> log_group_list; | ||
| 4109 | |||
| 4110 | -extern log_group_list log_groups LIBTORRENT_EXPORT; | ||
| 4111 | +extern log_group_list log_groups LIBTORRENT_EXPORT; | ||
| 4112 | |||
| 4113 | void log_initialize() LIBTORRENT_EXPORT; | ||
| 4114 | void log_cleanup() LIBTORRENT_EXPORT; | ||
| 4115 | @@ -237,9 +206,8 @@ void log_remove_group_output(int group, const char* name) LIBTORRENT_EXPORT; | ||
| 4116 | void log_add_child(int group, int child) LIBTORRENT_EXPORT; | ||
| 4117 | void log_remove_child(int group, int child) LIBTORRENT_EXPORT; | ||
| 4118 | |||
| 4119 | -void log_open_file_output(const char* name, const char* filename, bool append = false) LIBTORRENT_EXPORT; | ||
| 4120 | -void log_open_gz_file_output(const char* name, const char* filename, bool append = false) LIBTORRENT_EXPORT; | ||
| 4121 | -log_buffer* log_open_log_buffer(const char* name) LIBTORRENT_EXPORT; | ||
| 4122 | +void log_open_file_output(const char* name, const char* filename, bool append = false) LIBTORRENT_EXPORT; | ||
| 4123 | +void log_open_gz_file_output(const char* name, const char* filename, bool append = false) LIBTORRENT_EXPORT; | ||
| 4124 | |||
| 4125 | // | ||
| 4126 | // Implementation: | ||
| 4127 | diff --git a/src/torrent/utils/log_buffer.cc b/src/torrent/utils/log_buffer.cc | ||
| 4128 | index f82d57e0..5bf159a4 100644 | ||
| 4129 | --- a/src/torrent/utils/log_buffer.cc | ||
| 4130 | +++ b/src/torrent/utils/log_buffer.cc | ||
| 4131 | @@ -1,46 +1,8 @@ | ||
| 4132 | -// libTorrent - BitTorrent library | ||
| 4133 | -// Copyright (C) 2005-2011, Jari Sundell | ||
| 4134 | -// | ||
| 4135 | -// This program is free software; you can redistribute it and/or modify | ||
| 4136 | -// it under the terms of the GNU General Public License as published by | ||
| 4137 | -// the Free Software Foundation; either version 2 of the License, or | ||
| 4138 | -// (at your option) any later version. | ||
| 4139 | -// | ||
| 4140 | -// This program is distributed in the hope that it will be useful, | ||
| 4141 | -// but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
| 4142 | -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
| 4143 | -// GNU General Public License for more details. | ||
| 4144 | -// | ||
| 4145 | -// You should have received a copy of the GNU General Public License | ||
| 4146 | -// along with this program; if not, write to the Free Software | ||
| 4147 | -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | ||
| 4148 | -// | ||
| 4149 | -// In addition, as a special exception, the copyright holders give | ||
| 4150 | -// permission to link the code of portions of this program with the | ||
| 4151 | -// OpenSSL library under certain conditions as described in each | ||
| 4152 | -// individual source file, and distribute linked combinations | ||
| 4153 | -// including the two. | ||
| 4154 | -// | ||
| 4155 | -// You must obey the GNU General Public License in all respects for | ||
| 4156 | -// all of the code used other than OpenSSL. If you modify file(s) | ||
| 4157 | -// with this exception, you may extend this exception to your version | ||
| 4158 | -// of the file(s), but you are not obligated to do so. If you do not | ||
| 4159 | -// wish to do so, delete this exception statement from your version. | ||
| 4160 | -// If you delete this exception statement from all source files in the | ||
| 4161 | -// program, then also delete it here. | ||
| 4162 | -// | ||
| 4163 | -// Contact: Jari Sundell <jaris@ifi.uio.no> | ||
| 4164 | -// | ||
| 4165 | -// Skomakerveien 33 | ||
| 4166 | -// 3185 Skoppum, NORWAY | ||
| 4167 | - | ||
| 4168 | #include "config.h" | ||
| 4169 | |||
| 4170 | #include "log_buffer.h" | ||
| 4171 | |||
| 4172 | -#include <functional> | ||
| 4173 | -#include lt_tr1_functional | ||
| 4174 | - | ||
| 4175 | +#include "log.h" | ||
| 4176 | #include "globals.h" | ||
| 4177 | |||
| 4178 | namespace torrent { | ||
| 4179 | @@ -72,4 +34,19 @@ log_buffer::lock_and_push_log(const char* data, size_t length, int group) { | ||
| 4180 | unlock(); | ||
| 4181 | } | ||
| 4182 | |||
| 4183 | +static void | ||
| 4184 | +log_buffer_deleter(log_buffer* lb) { | ||
| 4185 | + delete lb; | ||
| 4186 | +} | ||
| 4187 | + | ||
| 4188 | +log_buffer_ptr | ||
| 4189 | +log_open_log_buffer(const char* name) { | ||
| 4190 | + // TODO: Deregister when deleting. | ||
| 4191 | + auto buffer = log_buffer_ptr(new log_buffer, std::bind(&log_buffer_deleter, std::placeholders::_1)); | ||
| 4192 | + | ||
| 4193 | + log_open_output(name, std::bind(&log_buffer::lock_and_push_log, buffer.get(), | ||
| 4194 | + std::placeholders::_1, std::placeholders::_2, std::placeholders::_3)); | ||
| 4195 | + return buffer; | ||
| 4196 | +} | ||
| 4197 | + | ||
| 4198 | } | ||
| 4199 | diff --git a/src/torrent/utils/log_buffer.h b/src/torrent/utils/log_buffer.h | ||
| 4200 | index befd780b..259e5910 100644 | ||
| 4201 | --- a/src/torrent/utils/log_buffer.h | ||
| 4202 | +++ b/src/torrent/utils/log_buffer.h | ||
| 4203 | @@ -1,47 +1,11 @@ | ||
| 4204 | -// libTorrent - BitTorrent library | ||
| 4205 | -// Copyright (C) 2005-2011, Jari Sundell | ||
| 4206 | -// | ||
| 4207 | -// This program is free software; you can redistribute it and/or modify | ||
| 4208 | -// it under the terms of the GNU General Public License as published by | ||
| 4209 | -// the Free Software Foundation; either version 2 of the License, or | ||
| 4210 | -// (at your option) any later version. | ||
| 4211 | -// | ||
| 4212 | -// This program is distributed in the hope that it will be useful, | ||
| 4213 | -// but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
| 4214 | -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
| 4215 | -// GNU General Public License for more details. | ||
| 4216 | -// | ||
| 4217 | -// You should have received a copy of the GNU General Public License | ||
| 4218 | -// along with this program; if not, write to the Free Software | ||
| 4219 | -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | ||
| 4220 | -// | ||
| 4221 | -// In addition, as a special exception, the copyright holders give | ||
| 4222 | -// permission to link the code of portions of this program with the | ||
| 4223 | -// OpenSSL library under certain conditions as described in each | ||
| 4224 | -// individual source file, and distribute linked combinations | ||
| 4225 | -// including the two. | ||
| 4226 | -// | ||
| 4227 | -// You must obey the GNU General Public License in all respects for | ||
| 4228 | -// all of the code used other than OpenSSL. If you modify file(s) | ||
| 4229 | -// with this exception, you may extend this exception to your version | ||
| 4230 | -// of the file(s), but you are not obligated to do so. If you do not | ||
| 4231 | -// wish to do so, delete this exception statement from your version. | ||
| 4232 | -// If you delete this exception statement from all source files in the | ||
| 4233 | -// program, then also delete it here. | ||
| 4234 | -// | ||
| 4235 | -// Contact: Jari Sundell <jaris@ifi.uio.no> | ||
| 4236 | -// | ||
| 4237 | -// Skomakerveien 33 | ||
| 4238 | -// 3185 Skoppum, NORWAY | ||
| 4239 | - | ||
| 4240 | -#ifndef LIBTORRENT_UTILS_LOG_BUFFER_H | ||
| 4241 | -#define LIBTORRENT_UTILS_LOG_BUFFER_H | ||
| 4242 | +#ifndef LIBTORRENT_TORRENT_UTILS_LOG_BUFFER_H | ||
| 4243 | +#define LIBTORRENT_TORRENT_UTILS_LOG_BUFFER_H | ||
| 4244 | |||
| 4245 | #include <string> | ||
| 4246 | #include <deque> | ||
| 4247 | +#include <functional> | ||
| 4248 | +#include <memory> | ||
| 4249 | #include <pthread.h> | ||
| 4250 | -#include lt_tr1_functional | ||
| 4251 | -#include <torrent/common.h> | ||
| 4252 | |||
| 4253 | namespace torrent { | ||
| 4254 | |||
| 4255 | @@ -57,9 +21,9 @@ struct log_entry { | ||
| 4256 | std::string message; | ||
| 4257 | }; | ||
| 4258 | |||
| 4259 | -class LIBTORRENT_EXPORT log_buffer : private std::deque<log_entry> { | ||
| 4260 | +class [[gnu::visibility("default")]] log_buffer : private std::deque<log_entry> { | ||
| 4261 | public: | ||
| 4262 | - typedef std::deque<log_entry> base_type; | ||
| 4263 | + typedef std::deque<log_entry> base_type; | ||
| 4264 | typedef std::function<void ()> slot_void; | ||
| 4265 | |||
| 4266 | using base_type::iterator; | ||
| 4267 | @@ -97,6 +61,10 @@ private: | ||
| 4268 | slot_void m_slot_update; | ||
| 4269 | }; | ||
| 4270 | |||
| 4271 | +typedef std::unique_ptr<log_buffer, std::function<void (log_buffer*)>> log_buffer_ptr; | ||
| 4272 | + | ||
| 4273 | +[[gnu::visibility("default")]] log_buffer_ptr log_open_log_buffer(const char* name); | ||
| 4274 | + | ||
| 4275 | } | ||
| 4276 | |||
| 4277 | #endif | ||
| 4278 | diff --git a/src/torrent/utils/net.cc b/src/torrent/utils/net.cc | ||
| 4279 | deleted file mode 100644 | ||
| 4280 | index 83c9b506..00000000 | ||
| 4281 | --- a/src/torrent/utils/net.cc | ||
| 4282 | +++ /dev/null | ||
| 4283 | @@ -1,72 +0,0 @@ | ||
| 4284 | -// libTorrent - BitTorrent library | ||
| 4285 | -// Copyright (C) 2005-2011, Jari Sundell | ||
| 4286 | -// | ||
| 4287 | -// This program is free software; you can redistribute it and/or modify | ||
| 4288 | -// it under the terms of the GNU General Public License as published by | ||
| 4289 | -// the Free Software Foundation; either version 2 of the License, or | ||
| 4290 | -// (at your option) any later version. | ||
| 4291 | -// | ||
| 4292 | -// This program is distributed in the hope that it will be useful, | ||
| 4293 | -// but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
| 4294 | -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
| 4295 | -// GNU General Public License for more details. | ||
| 4296 | -// | ||
| 4297 | -// You should have received a copy of the GNU General Public License | ||
| 4298 | -// along with this program; if not, write to the Free Software | ||
| 4299 | -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | ||
| 4300 | -// | ||
| 4301 | -// In addition, as a special exception, the copyright holders give | ||
| 4302 | -// permission to link the code of portions of this program with the | ||
| 4303 | -// OpenSSL library under certain conditions as described in each | ||
| 4304 | -// individual source file, and distribute linked combinations | ||
| 4305 | -// including the two. | ||
| 4306 | -// | ||
| 4307 | -// You must obey the GNU General Public License in all respects for | ||
| 4308 | -// all of the code used other than OpenSSL. If you modify file(s) | ||
| 4309 | -// with this exception, you may extend this exception to your version | ||
| 4310 | -// of the file(s), but you are not obligated to do so. If you do not | ||
| 4311 | -// wish to do so, delete this exception statement from your version. | ||
| 4312 | -// If you delete this exception statement from all source files in the | ||
| 4313 | -// program, then also delete it here. | ||
| 4314 | -// | ||
| 4315 | -// Contact: Jari Sundell <jaris@ifi.uio.no> | ||
| 4316 | -// | ||
| 4317 | -// Skomakerveien 33 | ||
| 4318 | -// 3185 Skoppum, NORWAY | ||
| 4319 | - | ||
| 4320 | -#include "config.h" | ||
| 4321 | - | ||
| 4322 | -#include "net.h" | ||
| 4323 | -#include "exceptions.h" | ||
| 4324 | - | ||
| 4325 | -#include <cstring> | ||
| 4326 | - | ||
| 4327 | -namespace torrent { | ||
| 4328 | - | ||
| 4329 | -addrinfo* | ||
| 4330 | -address_info_lookup(const char* hostname, int family, int socktype) { | ||
| 4331 | - addrinfo hints; | ||
| 4332 | - std::memset(&hints, 0, sizeof(addrinfo)); | ||
| 4333 | - hints.ai_family = family; | ||
| 4334 | - hints.ai_socktype = socktype; | ||
| 4335 | - | ||
| 4336 | - addrinfo* res = NULL; | ||
| 4337 | - int err = ::getaddrinfo(hostname, NULL, &hints, &res); | ||
| 4338 | - | ||
| 4339 | - if (err) | ||
| 4340 | - throw address_info_error(err); | ||
| 4341 | - | ||
| 4342 | - return res; | ||
| 4343 | -} | ||
| 4344 | - | ||
| 4345 | -bool | ||
| 4346 | -address_info_call(addrinfo* ai, int flags, slot_ai_success slot_success) { | ||
| 4347 | - while (ai != NULL) { | ||
| 4348 | - slot_success(ai->ai_addr, ai->ai_addrlen); | ||
| 4349 | - return true; | ||
| 4350 | - } | ||
| 4351 | - | ||
| 4352 | - return false; | ||
| 4353 | -} | ||
| 4354 | - | ||
| 4355 | -} | ||
| 4356 | diff --git a/src/torrent/utils/net.h b/src/torrent/utils/net.h | ||
| 4357 | deleted file mode 100644 | ||
| 4358 | index f5af7cc0..00000000 | ||
| 4359 | --- a/src/torrent/utils/net.h | ||
| 4360 | +++ /dev/null | ||
| 4361 | @@ -1,56 +0,0 @@ | ||
| 4362 | -// libTorrent - BitTorrent library | ||
| 4363 | -// Copyright (C) 2005-2011, Jari Sundell | ||
| 4364 | -// | ||
| 4365 | -// This program is free software; you can redistribute it and/or modify | ||
| 4366 | -// it under the terms of the GNU General Public License as published by | ||
| 4367 | -// the Free Software Foundation; either version 2 of the License, or | ||
| 4368 | -// (at your option) any later version. | ||
| 4369 | -// | ||
| 4370 | -// This program is distributed in the hope that it will be useful, | ||
| 4371 | -// but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
| 4372 | -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
| 4373 | -// GNU General Public License for more details. | ||
| 4374 | -// | ||
| 4375 | -// You should have received a copy of the GNU General Public License | ||
| 4376 | -// along with this program; if not, write to the Free Software | ||
| 4377 | -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | ||
| 4378 | -// | ||
| 4379 | -// In addition, as a special exception, the copyright holders give | ||
| 4380 | -// permission to link the code of portions of this program with the | ||
| 4381 | -// OpenSSL library under certain conditions as described in each | ||
| 4382 | -// individual source file, and distribute linked combinations | ||
| 4383 | -// including the two. | ||
| 4384 | -// | ||
| 4385 | -// You must obey the GNU General Public License in all respects for | ||
| 4386 | -// all of the code used other than OpenSSL. If you modify file(s) | ||
| 4387 | -// with this exception, you may extend this exception to your version | ||
| 4388 | -// of the file(s), but you are not obligated to do so. If you do not | ||
| 4389 | -// wish to do so, delete this exception statement from your version. | ||
| 4390 | -// If you delete this exception statement from all source files in the | ||
| 4391 | -// program, then also delete it here. | ||
| 4392 | -// | ||
| 4393 | -// Contact: Jari Sundell <jaris@ifi.uio.no> | ||
| 4394 | -// | ||
| 4395 | -// Skomakerveien 33 | ||
| 4396 | -// 3185 Skoppum, NORWAY | ||
| 4397 | - | ||
| 4398 | -#ifndef LIBTORRENT_UTILS_NET_H | ||
| 4399 | -#define LIBTORRENT_UTILS_NET_H | ||
| 4400 | - | ||
| 4401 | -#include <netdb.h> | ||
| 4402 | -#include lt_tr1_functional | ||
| 4403 | - | ||
| 4404 | -namespace torrent { | ||
| 4405 | - | ||
| 4406 | -typedef std::function<void (sockaddr*, socklen_t)> slot_ai_success; | ||
| 4407 | -//typedef std::function<void (const char*, int)> slot_ai_failure; | ||
| 4408 | - | ||
| 4409 | -// Throws address_info_error on lookup failure. | ||
| 4410 | -addrinfo* address_info_lookup(const char* hostname, int family, int socktype); | ||
| 4411 | -inline void address_info_free(addrinfo* ai) { ::freeaddrinfo(ai); } | ||
| 4412 | - | ||
| 4413 | -bool address_info_call(addrinfo* ai, int flags, slot_ai_success slot_success); | ||
| 4414 | - | ||
| 4415 | -} | ||
| 4416 | - | ||
| 4417 | -#endif | ||
| 4418 | diff --git a/src/torrent/utils/option_strings.cc b/src/torrent/utils/option_strings.cc | ||
| 4419 | index 5992cf37..101e2688 100644 | ||
| 4420 | --- a/src/torrent/utils/option_strings.cc | ||
| 4421 | +++ b/src/torrent/utils/option_strings.cc | ||
| 4422 | @@ -62,7 +62,7 @@ struct option_pair { | ||
| 4423 | unsigned int value; | ||
| 4424 | }; | ||
| 4425 | |||
| 4426 | -option_pair option_list_connection[] = { | ||
| 4427 | +option_pair option_list_connection_type[] = { | ||
| 4428 | { "leech", Download::CONNECTION_LEECH }, | ||
| 4429 | { "seed", Download::CONNECTION_SEED }, | ||
| 4430 | { "initial_seed", Download::CONNECTION_INITIAL_SEED }, | ||
| 4431 | @@ -124,6 +124,19 @@ option_pair option_list_tracker_mode[] = { | ||
| 4432 | { NULL, 0 } | ||
| 4433 | }; | ||
| 4434 | |||
| 4435 | +const char* option_list_handshake_connection[] = { | ||
| 4436 | + "none", | ||
| 4437 | + "incoming", | ||
| 4438 | + "outgoing_normal", | ||
| 4439 | + "outgoing_encrypted", | ||
| 4440 | + "outgoing_proxy", | ||
| 4441 | + "success", | ||
| 4442 | + "dropped", | ||
| 4443 | + "failed", | ||
| 4444 | + "retry_plaintext", | ||
| 4445 | + "retry_encrypted" | ||
| 4446 | +}; | ||
| 4447 | + | ||
| 4448 | const char* option_list_log_group[] = { | ||
| 4449 | "critical", | ||
| 4450 | "error", | ||
| 4451 | @@ -132,13 +145,6 @@ const char* option_list_log_group[] = { | ||
| 4452 | "info", | ||
| 4453 | "debug", | ||
| 4454 | |||
| 4455 | - "connection_critical", | ||
| 4456 | - "connection_error", | ||
| 4457 | - "connection_warn", | ||
| 4458 | - "connection_notice", | ||
| 4459 | - "connection_info", | ||
| 4460 | - "connection_debug", | ||
| 4461 | - | ||
| 4462 | "dht_critical", | ||
| 4463 | "dht_error", | ||
| 4464 | "dht_warn", | ||
| 4465 | @@ -190,6 +196,13 @@ const char* option_list_log_group[] = { | ||
| 4466 | |||
| 4467 | "__non_cascading__", | ||
| 4468 | |||
| 4469 | + "connection", | ||
| 4470 | + "connection_bind", | ||
| 4471 | + "connection_fd", | ||
| 4472 | + "connection_filter", | ||
| 4473 | + "connection_hanshake", | ||
| 4474 | + "connection_listen", | ||
| 4475 | + | ||
| 4476 | "dht_all", | ||
| 4477 | "dht_manager", | ||
| 4478 | "dht_node", | ||
| 4479 | @@ -202,7 +215,10 @@ const char* option_list_log_group[] = { | ||
| 4480 | "instrumentation_polling", | ||
| 4481 | "instrumentation_transfers", | ||
| 4482 | |||
| 4483 | + "mock_calls", | ||
| 4484 | + | ||
| 4485 | "peer_list_events", | ||
| 4486 | + "peer_list_address", | ||
| 4487 | |||
| 4488 | "protocol_piece_events", | ||
| 4489 | "protocol_metadata_events", | ||
| 4490 | @@ -214,6 +230,8 @@ const char* option_list_log_group[] = { | ||
| 4491 | "rpc_events", | ||
| 4492 | "rpc_dump", | ||
| 4493 | |||
| 4494 | + "system", | ||
| 4495 | + | ||
| 4496 | "ui_events", | ||
| 4497 | |||
| 4498 | NULL | ||
| 4499 | @@ -230,7 +248,7 @@ const char* option_list_tracker_event[] = { | ||
| 4500 | }; | ||
| 4501 | |||
| 4502 | option_pair* option_pair_lists[OPTION_START_COMPACT] = { | ||
| 4503 | - option_list_connection, | ||
| 4504 | + option_list_connection_type, | ||
| 4505 | option_list_heuristics, | ||
| 4506 | option_list_heuristics_download, | ||
| 4507 | option_list_heuristics_upload, | ||
| 4508 | @@ -244,6 +262,7 @@ option_pair* option_pair_lists[OPTION_START_COMPACT] = { | ||
| 4509 | { sizeof(single_name) / sizeof(const char*) - 1, single_name } | ||
| 4510 | |||
| 4511 | option_single option_single_lists[OPTION_SINGLE_SIZE] = { | ||
| 4512 | + OPTION_SINGLE_ENTRY(option_list_handshake_connection), | ||
| 4513 | OPTION_SINGLE_ENTRY(option_list_log_group), | ||
| 4514 | OPTION_SINGLE_ENTRY(option_list_tracker_event), | ||
| 4515 | }; | ||
| 4516 | @@ -267,11 +286,11 @@ option_find_string(option_enum opt_enum, const char* name) { | ||
| 4517 | } while (*++itr != NULL); | ||
| 4518 | } | ||
| 4519 | |||
| 4520 | - throw input_error("Invalid option name."); | ||
| 4521 | + throw input_error("Invalid option name."); | ||
| 4522 | } | ||
| 4523 | |||
| 4524 | const char* | ||
| 4525 | -option_as_string(option_enum opt_enum, unsigned int value) { | ||
| 4526 | +option_to_string(option_enum opt_enum, unsigned int value, const char* not_found) { | ||
| 4527 | if (opt_enum < OPTION_START_COMPACT) { | ||
| 4528 | option_pair* itr = option_pair_lists[opt_enum]; | ||
| 4529 | |||
| 4530 | @@ -285,7 +304,27 @@ option_as_string(option_enum opt_enum, unsigned int value) { | ||
| 4531 | return option_single_lists[opt_enum - OPTION_START_COMPACT].name[value]; | ||
| 4532 | } | ||
| 4533 | |||
| 4534 | - throw input_error("Invalid option value."); | ||
| 4535 | + return not_found; | ||
| 4536 | +} | ||
| 4537 | + | ||
| 4538 | +const char* | ||
| 4539 | +option_to_string_or_throw(option_enum opt_enum, unsigned int value, const char* not_found) { | ||
| 4540 | + const char* result = option_to_string(opt_enum, value, NULL); | ||
| 4541 | + | ||
| 4542 | + if (result == NULL) | ||
| 4543 | + throw input_error(not_found); | ||
| 4544 | + else | ||
| 4545 | + return result; | ||
| 4546 | +} | ||
| 4547 | + | ||
| 4548 | +const char* | ||
| 4549 | +option_as_string(option_enum opt_enum, unsigned int value) { | ||
| 4550 | + const char* result = option_to_string(opt_enum, value, NULL); | ||
| 4551 | + | ||
| 4552 | + if (result == NULL) | ||
| 4553 | + throw input_error("Invalid option value."); | ||
| 4554 | + else | ||
| 4555 | + return result; | ||
| 4556 | } | ||
| 4557 | |||
| 4558 | torrent::Object | ||
| 4559 | diff --git a/src/torrent/utils/option_strings.h b/src/torrent/utils/option_strings.h | ||
| 4560 | index 1b57efa8..f9e5ef77 100644 | ||
| 4561 | --- a/src/torrent/utils/option_strings.h | ||
| 4562 | +++ b/src/torrent/utils/option_strings.h | ||
| 4563 | @@ -54,17 +54,22 @@ enum option_enum { | ||
| 4564 | OPTION_IP_TOS, | ||
| 4565 | OPTION_TRACKER_MODE, | ||
| 4566 | |||
| 4567 | + OPTION_HANDSHAKE_CONNECTION, | ||
| 4568 | OPTION_LOG_GROUP, | ||
| 4569 | OPTION_TRACKER_EVENT, | ||
| 4570 | |||
| 4571 | OPTION_MAX_SIZE, | ||
| 4572 | - OPTION_START_COMPACT = OPTION_LOG_GROUP, | ||
| 4573 | + OPTION_START_COMPACT = OPTION_HANDSHAKE_CONNECTION, | ||
| 4574 | OPTION_SINGLE_SIZE = OPTION_MAX_SIZE - OPTION_START_COMPACT | ||
| 4575 | }; | ||
| 4576 | |||
| 4577 | int option_find_string(option_enum opt_enum, const char* name) LIBTORRENT_EXPORT; | ||
| 4578 | inline int option_find_string_str(option_enum opt_enum, const std::string& name) { return option_find_string(opt_enum, name.c_str()); } | ||
| 4579 | |||
| 4580 | +const char* option_to_string(option_enum opt_enum, unsigned int value, const char* not_found = "invalid") LIBTORRENT_EXPORT; | ||
| 4581 | +const char* option_to_string_or_throw(option_enum opt_enum, unsigned int value, const char* not_found = "Invalid option value") LIBTORRENT_EXPORT; | ||
| 4582 | + | ||
| 4583 | +// TODO: Deprecated. | ||
| 4584 | const char* option_as_string(option_enum opt_enum, unsigned int value) LIBTORRENT_EXPORT; | ||
| 4585 | |||
| 4586 | torrent::Object option_list_strings(option_enum opt_enum) LIBTORRENT_EXPORT; | ||
| 4587 | diff --git a/src/torrent/utils/random.cc b/src/torrent/utils/random.cc | ||
| 4588 | new file mode 100644 | ||
| 4589 | index 00000000..6a045429 | ||
| 4590 | --- /dev/null | ||
| 4591 | +++ b/src/torrent/utils/random.cc | ||
| 4592 | @@ -0,0 +1,29 @@ | ||
| 4593 | +#include "config.h" | ||
| 4594 | + | ||
| 4595 | +#include "random.h" | ||
| 4596 | + | ||
| 4597 | +#include "torrent/exceptions.h" | ||
| 4598 | + | ||
| 4599 | +namespace torrent { | ||
| 4600 | + | ||
| 4601 | +// TODO: Replace with std and thread_local generator. | ||
| 4602 | + | ||
| 4603 | +template <typename T> | ||
| 4604 | +T | ||
| 4605 | +random_uniform_template(T min, T max) { | ||
| 4606 | + if (min > max) | ||
| 4607 | + throw internal_error("random_uniform: min > max"); | ||
| 4608 | + | ||
| 4609 | + if (min == max) | ||
| 4610 | + return min; | ||
| 4611 | + | ||
| 4612 | + std::random_device rd; | ||
| 4613 | + std::mt19937 mt(rd()); | ||
| 4614 | + | ||
| 4615 | + return min + std::uniform_int_distribution<T>(min, max)(mt) % (max - min + 1); | ||
| 4616 | +} | ||
| 4617 | + | ||
| 4618 | +uint16_t random_uniform_uint16(uint16_t min, uint16_t max) { return random_uniform_template<uint16_t>(min, max); } | ||
| 4619 | +uint32_t random_uniform_uint32(uint32_t min, uint32_t max) { return random_uniform_template<uint32_t>(min, max); } | ||
| 4620 | + | ||
| 4621 | +} | ||
| 4622 | diff --git a/src/torrent/utils/random.h b/src/torrent/utils/random.h | ||
| 4623 | new file mode 100644 | ||
| 4624 | index 00000000..d5992ab6 | ||
| 4625 | --- /dev/null | ||
| 4626 | +++ b/src/torrent/utils/random.h | ||
| 4627 | @@ -0,0 +1,15 @@ | ||
| 4628 | +#ifndef LIBTORRENT_TORRENT_UTILS_RANDOM_H | ||
| 4629 | +#define LIBTORRENT_TORRENT_UTILS_RANDOM_H | ||
| 4630 | + | ||
| 4631 | +#include <cinttypes> | ||
| 4632 | +#include <limits> | ||
| 4633 | +#include <random> | ||
| 4634 | + | ||
| 4635 | +namespace torrent { | ||
| 4636 | + | ||
| 4637 | +[[gnu::weak]] [[gnu::visibility("default")]] uint16_t random_uniform_uint16(uint16_t min = std::numeric_limits<uint16_t>::min(), uint16_t max = std::numeric_limits<uint16_t>::max()); | ||
| 4638 | +[[gnu::weak]] [[gnu::visibility("default")]] uint32_t random_uniform_uint32(uint32_t min = std::numeric_limits<uint32_t>::min(), uint32_t max = std::numeric_limits<uint32_t>::max()); | ||
| 4639 | + | ||
| 4640 | +} | ||
| 4641 | + | ||
| 4642 | +#endif | ||
| 4643 | diff --git a/src/torrent/utils/ranges.h b/src/torrent/utils/ranges.h | ||
| 4644 | index e784b084..7b1f8cb0 100644 | ||
| 4645 | --- a/src/torrent/utils/ranges.h | ||
| 4646 | +++ b/src/torrent/utils/ranges.h | ||
| 4647 | @@ -40,7 +40,6 @@ | ||
| 4648 | #include <algorithm> | ||
| 4649 | #include <vector> | ||
| 4650 | |||
| 4651 | -// TODO: Use tr1 functional instead. | ||
| 4652 | #include <rak/functional.h> | ||
| 4653 | |||
| 4654 | namespace torrent { | ||
| 4655 | diff --git a/src/torrent/utils/resume.cc b/src/torrent/utils/resume.cc | ||
| 4656 | index 3f528c14..f8467d54 100644 | ||
| 4657 | --- a/src/torrent/utils/resume.cc | ||
| 4658 | +++ b/src/torrent/utils/resume.cc | ||
| 4659 | @@ -34,8 +34,6 @@ | ||
| 4660 | // Skomakerveien 33 | ||
| 4661 | // 3185 Skoppum, NORWAY | ||
| 4662 | |||
| 4663 | -#define __STDC_FORMAT_MACROS | ||
| 4664 | - | ||
| 4665 | #include "config.h" | ||
| 4666 | |||
| 4667 | #include <rak/file_stat.h> | ||
| 4668 | diff --git a/src/torrent/utils/signal_bitfield.h b/src/torrent/utils/signal_bitfield.h | ||
| 4669 | index b9f57a60..ffa336d2 100644 | ||
| 4670 | --- a/src/torrent/utils/signal_bitfield.h | ||
| 4671 | +++ b/src/torrent/utils/signal_bitfield.h | ||
| 4672 | @@ -37,7 +37,8 @@ | ||
| 4673 | #ifndef LIBTORRENT_UTILS_SIGNAL_BITFIELD_H | ||
| 4674 | #define LIBTORRENT_UTILS_SIGNAL_BITFIELD_H | ||
| 4675 | |||
| 4676 | -#include lt_tr1_functional | ||
| 4677 | +#include <functional> | ||
| 4678 | + | ||
| 4679 | #include <torrent/common.h> | ||
| 4680 | |||
| 4681 | namespace torrent { | ||
| 4682 | diff --git a/src/torrent/utils/thread_base.h b/src/torrent/utils/thread_base.h | ||
| 4683 | index bfd443ae..b92a98ba 100644 | ||
| 4684 | --- a/src/torrent/utils/thread_base.h | ||
| 4685 | +++ b/src/torrent/utils/thread_base.h | ||
| 4686 | @@ -37,11 +37,12 @@ | ||
| 4687 | #ifndef LIBTORRENT_UTILS_THREAD_BASE_H | ||
| 4688 | #define LIBTORRENT_UTILS_THREAD_BASE_H | ||
| 4689 | |||
| 4690 | +#include <functional> | ||
| 4691 | #include <pthread.h> | ||
| 4692 | #include <sys/types.h> | ||
| 4693 | + | ||
| 4694 | #include <torrent/common.h> | ||
| 4695 | #include <torrent/utils/signal_bitfield.h> | ||
| 4696 | -#include lt_tr1_functional | ||
| 4697 | |||
| 4698 | namespace torrent { | ||
| 4699 | |||
| 4700 | diff --git a/src/utils/instrumentation.cc b/src/utils/instrumentation.cc | ||
| 4701 | index 729b20e2..178d6a19 100644 | ||
| 4702 | --- a/src/utils/instrumentation.cc | ||
| 4703 | +++ b/src/utils/instrumentation.cc | ||
| 4704 | @@ -36,8 +36,6 @@ | ||
| 4705 | |||
| 4706 | #include "config.h" | ||
| 4707 | |||
| 4708 | -#define __STDC_FORMAT_MACROS | ||
| 4709 | - | ||
| 4710 | #include "instrumentation.h" | ||
| 4711 | |||
| 4712 | namespace torrent { | ||
| 4713 | diff --git a/src/utils/instrumentation.h b/src/utils/instrumentation.h | ||
| 4714 | index 956429bf..11e77f6d 100644 | ||
| 4715 | --- a/src/utils/instrumentation.h | ||
| 4716 | +++ b/src/utils/instrumentation.h | ||
| 4717 | @@ -37,9 +37,8 @@ | ||
| 4718 | #ifndef LIBTORRENT_UTILS_INSTRUMENTATION_H | ||
| 4719 | #define LIBTORRENT_UTILS_INSTRUMENTATION_H | ||
| 4720 | |||
| 4721 | -#include lt_tr1_array | ||
| 4722 | - | ||
| 4723 | #include <algorithm> | ||
| 4724 | +#include <array> | ||
| 4725 | |||
| 4726 | #include "torrent/common.h" | ||
| 4727 | #include "torrent/utils/log.h" | ||
| 4728 | diff --git a/src/utils/queue_buckets.h b/src/utils/queue_buckets.h | ||
| 4729 | index de8584ff..b9174f27 100644 | ||
| 4730 | --- a/src/utils/queue_buckets.h | ||
| 4731 | +++ b/src/utils/queue_buckets.h | ||
| 4732 | @@ -38,9 +38,9 @@ | ||
| 4733 | #define LIBTORRENT_QUEUE_BUCKETS_H | ||
| 4734 | |||
| 4735 | #include <algorithm> | ||
| 4736 | +#include <array> | ||
| 4737 | #include <deque> | ||
| 4738 | -#include lt_tr1_functional | ||
| 4739 | -#include lt_tr1_array | ||
| 4740 | +#include <functional> | ||
| 4741 | |||
| 4742 | namespace torrent { | ||
| 4743 | |||
| 4744 | diff --git a/src/utils/sha_fast.h b/src/utils/sha_fast.h | ||
| 4745 | index f7ce3b87..eb357864 100644 | ||
| 4746 | --- a/src/utils/sha_fast.h | ||
| 4747 | +++ b/src/utils/sha_fast.h | ||
| 4748 | @@ -41,7 +41,7 @@ | ||
| 4749 | #ifndef _SHA_FAST_H_ | ||
| 4750 | #define _SHA_FAST_H_ | ||
| 4751 | |||
| 4752 | -#include <inttypes.h> | ||
| 4753 | +#include <cinttypes> | ||
| 4754 | |||
| 4755 | namespace torrent { | ||
| 4756 | |||
| 4757 | diff --git a/test/Makefile.am b/test/Makefile.am | ||
| 4758 | index d7a9d5b3..b60a86a6 100644 | ||
| 4759 | --- a/test/Makefile.am | ||
| 4760 | +++ b/test/Makefile.am | ||
| 4761 | @@ -18,6 +18,17 @@ LibTorrentTest_LDADD = \ | ||
| 4762 | ../src/torrent/utils/libsub_torrentutils.la | ||
| 4763 | |||
| 4764 | LibTorrentTest_SOURCES = \ | ||
| 4765 | + helpers/expect_fd.h \ | ||
| 4766 | + helpers/expect_utils.h \ | ||
| 4767 | + helpers/mock_compare.h \ | ||
| 4768 | + helpers/mock_function.cc \ | ||
| 4769 | + helpers/mock_function.h \ | ||
| 4770 | + helpers/network.h \ | ||
| 4771 | + helpers/progress_listener.cc \ | ||
| 4772 | + helpers/progress_listener.h \ | ||
| 4773 | + helpers/test_fixture.cc \ | ||
| 4774 | + helpers/test_fixture.h \ | ||
| 4775 | + \ | ||
| 4776 | ../src/thread_disk.cc \ | ||
| 4777 | ../src/thread_disk.h \ | ||
| 4778 | \ | ||
| 4779 | @@ -31,22 +42,28 @@ LibTorrentTest_SOURCES = \ | ||
| 4780 | data/hash_check_queue_test.h \ | ||
| 4781 | data/hash_queue_test.cc \ | ||
| 4782 | data/hash_queue_test.h \ | ||
| 4783 | + \ | ||
| 4784 | + net/test_socket_listen.cc \ | ||
| 4785 | + net/test_socket_listen.h \ | ||
| 4786 | + \ | ||
| 4787 | protocol/test_request_list.cc \ | ||
| 4788 | protocol/test_request_list.h \ | ||
| 4789 | \ | ||
| 4790 | - torrent/net/test_socket_address_key.cc \ | ||
| 4791 | - torrent/net/test_socket_address_key.h \ | ||
| 4792 | + torrent/net/test_address_info.cc \ | ||
| 4793 | + torrent/net/test_address_info.h \ | ||
| 4794 | + torrent/net/test_fd.cc \ | ||
| 4795 | + torrent/net/test_fd.h \ | ||
| 4796 | + torrent/net/test_socket_address.cc \ | ||
| 4797 | + torrent/net/test_socket_address.h \ | ||
| 4798 | \ | ||
| 4799 | torrent/utils/log_test.cc \ | ||
| 4800 | torrent/utils/log_test.h \ | ||
| 4801 | - torrent/utils/log_buffer_test.cc \ | ||
| 4802 | - torrent/utils/log_buffer_test.h \ | ||
| 4803 | - torrent/utils/net_test.cc \ | ||
| 4804 | - torrent/utils/net_test.h \ | ||
| 4805 | torrent/utils/option_strings_test.cc \ | ||
| 4806 | torrent/utils/option_strings_test.h \ | ||
| 4807 | torrent/utils/test_extents.cc \ | ||
| 4808 | torrent/utils/test_extents.h \ | ||
| 4809 | + torrent/utils/test_log_buffer.cc \ | ||
| 4810 | + torrent/utils/test_log_buffer.h \ | ||
| 4811 | torrent/utils/test_queue_buckets.cc \ | ||
| 4812 | torrent/utils/test_queue_buckets.h \ | ||
| 4813 | torrent/utils/test_uri_parser.cc \ | ||
| 4814 | diff --git a/test/data/hash_check_queue_test.cc b/test/data/hash_check_queue_test.cc | ||
| 4815 | index c6bdeaec..4b15245e 100644 | ||
| 4816 | --- a/test/data/hash_check_queue_test.cc | ||
| 4817 | +++ b/test/data/hash_check_queue_test.cc | ||
| 4818 | @@ -1,7 +1,7 @@ | ||
| 4819 | #include "config.h" | ||
| 4820 | |||
| 4821 | +#include <functional> | ||
| 4822 | #include <signal.h> | ||
| 4823 | -#include lt_tr1_functional | ||
| 4824 | |||
| 4825 | #include "data/hash_queue_node.h" | ||
| 4826 | #include "utils/sha1.h" | ||
| 4827 | diff --git a/test/data/hash_queue_test.cc b/test/data/hash_queue_test.cc | ||
| 4828 | index 287c28e9..d7ce3ba8 100644 | ||
| 4829 | --- a/test/data/hash_queue_test.cc | ||
| 4830 | +++ b/test/data/hash_queue_test.cc | ||
| 4831 | @@ -1,7 +1,7 @@ | ||
| 4832 | #include "config.h" | ||
| 4833 | |||
| 4834 | +#include <functional> | ||
| 4835 | #include <signal.h> | ||
| 4836 | -#include lt_tr1_functional | ||
| 4837 | |||
| 4838 | #include "data/hash_queue_node.h" | ||
| 4839 | #include "torrent/chunk_manager.h" | ||
| 4840 | diff --git a/test/helpers/expect_fd.h b/test/helpers/expect_fd.h | ||
| 4841 | new file mode 100644 | ||
| 4842 | index 00000000..178cbabc | ||
| 4843 | --- /dev/null | ||
| 4844 | +++ b/test/helpers/expect_fd.h | ||
| 4845 | @@ -0,0 +1,107 @@ | ||
| 4846 | +#ifndef LIBTORRENT_HELPER_EXPECT_FD_H | ||
| 4847 | +#define LIBTORRENT_HELPER_EXPECT_FD_H | ||
| 4848 | + | ||
| 4849 | +#include "helpers/mock_function.h" | ||
| 4850 | + | ||
| 4851 | +#include <fcntl.h> | ||
| 4852 | +#include <torrent/event.h> | ||
| 4853 | +#include <torrent/net/fd.h> | ||
| 4854 | +#include <torrent/net/socket_address.h> | ||
| 4855 | + | ||
| 4856 | +typedef std::vector<torrent::sa_unique_ptr> sap_cache_type; | ||
| 4857 | + | ||
| 4858 | +inline const sockaddr* | ||
| 4859 | +sap_cache_copy_addr_c_ptr(sap_cache_type& sap_cache, const torrent::c_sa_unique_ptr& sap, uint16_t port = 0) { | ||
| 4860 | + sap_cache.push_back(torrent::sap_copy_addr(sap, port)); | ||
| 4861 | + return sap_cache.back().get(); | ||
| 4862 | +} | ||
| 4863 | + | ||
| 4864 | +inline void | ||
| 4865 | +expect_event_open_re(int idx) { | ||
| 4866 | + mock_expect(&torrent::poll_event_open, mock_compare_map<torrent::Event>::begin_pointer + idx); | ||
| 4867 | + mock_expect(&torrent::poll_event_insert_read, mock_compare_map<torrent::Event>::begin_pointer + idx); | ||
| 4868 | + mock_expect(&torrent::poll_event_insert_error, mock_compare_map<torrent::Event>::begin_pointer + idx); | ||
| 4869 | +} | ||
| 4870 | + | ||
| 4871 | +inline void | ||
| 4872 | +expect_event_closed_fd(int idx, int fd) { | ||
| 4873 | + mock_expect(&torrent::fd__close, 0, fd); | ||
| 4874 | + mock_expect(&torrent::poll_event_closed, mock_compare_map<torrent::Event>::begin_pointer + idx); | ||
| 4875 | +} | ||
| 4876 | + | ||
| 4877 | +inline void | ||
| 4878 | +expect_fd_inet_tcp(int fd) { | ||
| 4879 | + mock_expect(&torrent::fd__socket, fd, (int)PF_INET, (int)SOCK_STREAM, (int)IPPROTO_TCP); | ||
| 4880 | +} | ||
| 4881 | + | ||
| 4882 | +inline void | ||
| 4883 | +expect_fd_inet6_tcp(int fd) { | ||
| 4884 | + mock_expect(&torrent::fd__socket, fd, (int)PF_INET6, (int)SOCK_STREAM, (int)IPPROTO_TCP); | ||
| 4885 | +} | ||
| 4886 | + | ||
| 4887 | +inline void | ||
| 4888 | +expect_fd_inet_tcp_nonblock(int fd) { | ||
| 4889 | + mock_expect(&torrent::fd__socket, fd, (int)PF_INET, (int)SOCK_STREAM, (int)IPPROTO_TCP); | ||
| 4890 | + mock_expect(&torrent::fd__fcntl_int, 0, fd, F_SETFL, O_NONBLOCK); | ||
| 4891 | +} | ||
| 4892 | + | ||
| 4893 | +inline void | ||
| 4894 | +expect_fd_inet6_tcp_nonblock(int fd) { | ||
| 4895 | + mock_expect(&torrent::fd__socket, fd, (int)PF_INET6, (int)SOCK_STREAM, (int)IPPROTO_TCP); | ||
| 4896 | + mock_expect(&torrent::fd__fcntl_int, 0, fd, F_SETFL, O_NONBLOCK); | ||
| 4897 | +} | ||
| 4898 | + | ||
| 4899 | +inline void | ||
| 4900 | +expect_fd_inet_tcp_nonblock_reuseaddr(int fd) { | ||
| 4901 | + mock_expect(&torrent::fd__socket, fd, (int)PF_INET, (int)SOCK_STREAM, (int)IPPROTO_TCP); | ||
| 4902 | + mock_expect(&torrent::fd__fcntl_int, 0, fd, F_SETFL, O_NONBLOCK); | ||
| 4903 | + mock_expect(&torrent::fd__setsockopt_int, 0, fd, (int)SOL_SOCKET, (int)SO_REUSEADDR, (int)true); | ||
| 4904 | +} | ||
| 4905 | + | ||
| 4906 | +inline void | ||
| 4907 | +expect_fd_inet6_tcp_nonblock_reuseaddr(int fd) { | ||
| 4908 | + mock_expect(&torrent::fd__socket, fd, (int)PF_INET6, (int)SOCK_STREAM, (int)IPPROTO_TCP); | ||
| 4909 | + mock_expect(&torrent::fd__fcntl_int, 0, fd, F_SETFL, O_NONBLOCK); | ||
| 4910 | + mock_expect(&torrent::fd__setsockopt_int, 0, fd, (int)SOL_SOCKET, (int)SO_REUSEADDR, (int)true); | ||
| 4911 | +} | ||
| 4912 | + | ||
| 4913 | +inline void | ||
| 4914 | +expect_fd_inet6_tcp_v6only_nonblock(int fd) { | ||
| 4915 | + mock_expect(&torrent::fd__socket, fd, (int)PF_INET6, (int)SOCK_STREAM, (int)IPPROTO_TCP); | ||
| 4916 | + mock_expect(&torrent::fd__setsockopt_int, 0, fd, (int)IPPROTO_IPV6, (int)IPV6_V6ONLY, (int)true); | ||
| 4917 | + mock_expect(&torrent::fd__fcntl_int, 0, fd, F_SETFL, O_NONBLOCK); | ||
| 4918 | +} | ||
| 4919 | + | ||
| 4920 | +inline void | ||
| 4921 | +expect_fd_inet6_tcp_v6only_nonblock_reuseaddr(int fd) { | ||
| 4922 | + mock_expect(&torrent::fd__socket, fd, (int)PF_INET6, (int)SOCK_STREAM, (int)IPPROTO_TCP); | ||
| 4923 | + mock_expect(&torrent::fd__setsockopt_int, 0, fd, (int)IPPROTO_IPV6, (int)IPV6_V6ONLY, (int)true); | ||
| 4924 | + mock_expect(&torrent::fd__fcntl_int, 0, fd, F_SETFL, O_NONBLOCK); | ||
| 4925 | + mock_expect(&torrent::fd__setsockopt_int, 0, fd, (int)SOL_SOCKET, (int)SO_REUSEADDR, (int)true); | ||
| 4926 | +} | ||
| 4927 | + | ||
| 4928 | +inline void | ||
| 4929 | +expect_fd_bind_connect(int fd, const torrent::c_sa_unique_ptr& bind_sap, const torrent::c_sa_unique_ptr& connect_sap) { | ||
| 4930 | + mock_expect(&torrent::fd__bind, 0, fd, bind_sap.get(), (socklen_t)torrent::sap_length(bind_sap)); | ||
| 4931 | + mock_expect(&torrent::fd__connect, 0, fd, connect_sap.get(), (socklen_t)torrent::sap_length(connect_sap)); | ||
| 4932 | +} | ||
| 4933 | + | ||
| 4934 | +inline void | ||
| 4935 | +expect_fd_bind_fail_range(int fd, sap_cache_type& sap_cache, const torrent::c_sa_unique_ptr& sap, uint16_t first_port, uint16_t last_port) { | ||
| 4936 | + do { | ||
| 4937 | + mock_expect(&torrent::fd__bind, -1, fd, sap_cache_copy_addr_c_ptr(sap_cache, sap, first_port), (socklen_t)torrent::sap_length(sap)); | ||
| 4938 | + } while (first_port++ != last_port); | ||
| 4939 | +} | ||
| 4940 | + | ||
| 4941 | +inline void | ||
| 4942 | +expect_fd_bind_listen(int fd, const torrent::c_sa_unique_ptr& sap) { | ||
| 4943 | + mock_expect(&torrent::fd__bind, 0, fd, sap.get(), (socklen_t)torrent::sap_length(sap)); | ||
| 4944 | + mock_expect(&torrent::fd__listen, 0, fd, SOMAXCONN); | ||
| 4945 | +} | ||
| 4946 | + | ||
| 4947 | +inline void | ||
| 4948 | +expect_fd_connect(int fd, const torrent::c_sa_unique_ptr& sap) { | ||
| 4949 | + mock_expect(&torrent::fd__connect, 0, fd, sap.get(), (socklen_t)torrent::sap_length(sap)); | ||
| 4950 | +} | ||
| 4951 | + | ||
| 4952 | +#endif | ||
| 4953 | diff --git a/test/helpers/expect_utils.h b/test/helpers/expect_utils.h | ||
| 4954 | new file mode 100644 | ||
| 4955 | index 00000000..c84a11e0 | ||
| 4956 | --- /dev/null | ||
| 4957 | +++ b/test/helpers/expect_utils.h | ||
| 4958 | @@ -0,0 +1,13 @@ | ||
| 4959 | +#ifndef LIBTORRENT_HELPER_EXPECT_UTILS_H | ||
| 4960 | +#define LIBTORRENT_HELPER_EXPECT_UTILS_H | ||
| 4961 | + | ||
| 4962 | +#include "helpers/mock_function.h" | ||
| 4963 | + | ||
| 4964 | +#include <torrent/utils/random.h> | ||
| 4965 | + | ||
| 4966 | +inline void | ||
| 4967 | +expect_random_uniform_uint16(uint16_t result, uint16_t first, uint16_t last) { | ||
| 4968 | + mock_expect(&torrent::random_uniform_uint16, result, first, last); | ||
| 4969 | +} | ||
| 4970 | + | ||
| 4971 | +#endif | ||
| 4972 | diff --git a/test/helpers/mock_compare.h b/test/helpers/mock_compare.h | ||
| 4973 | new file mode 100644 | ||
| 4974 | index 00000000..3ea90305 | ||
| 4975 | --- /dev/null | ||
| 4976 | +++ b/test/helpers/mock_compare.h | ||
| 4977 | @@ -0,0 +1,96 @@ | ||
| 4978 | +#ifndef LIBTORRENT_HELPERS_MOCK_COMPARE_H | ||
| 4979 | +#define LIBTORRENT_HELPERS_MOCK_COMPARE_H | ||
| 4980 | + | ||
| 4981 | +#include <algorithm> | ||
| 4982 | +#include <type_traits> | ||
| 4983 | +#include <torrent/event.h> | ||
| 4984 | +#include <torrent/net/socket_address.h> | ||
| 4985 | + | ||
| 4986 | +// Compare arguments to mock functions with what is expected. The lhs | ||
| 4987 | +// are the expected arguments, rhs are the ones called with. | ||
| 4988 | + | ||
| 4989 | +template <typename Arg> | ||
| 4990 | +inline bool mock_compare_arg(Arg lhs, Arg rhs) { return lhs == rhs; } | ||
| 4991 | + | ||
| 4992 | +template <int I, typename A, typename... Args> | ||
| 4993 | +typename std::enable_if<I == 1, int>::type | ||
| 4994 | +mock_compare_tuple(const std::tuple<A, Args...>& lhs, const std::tuple<Args...>& rhs) { | ||
| 4995 | + return mock_compare_arg(std::get<I>(lhs), std::get<I - 1>(rhs)) ? 0 : 1; | ||
| 4996 | +} | ||
| 4997 | + | ||
| 4998 | +template <int I, typename A, typename... Args> | ||
| 4999 | +typename std::enable_if<1 < I, int>::type | ||
| 5000 | +mock_compare_tuple(const std::tuple<A, Args...>& lhs, const std::tuple<Args...>& rhs) { | ||
| 5001 | + auto res = mock_compare_tuple<I - 1>(lhs, rhs); | ||
| 5002 | + | ||
| 5003 | + if (res != 0) | ||
| 5004 | + return res; | ||
| 5005 | + | ||
| 5006 | + return mock_compare_arg(std::get<I>(lhs), std::get<I - 1>(rhs)) ? 0 : I; | ||
| 5007 | +} | ||
| 5008 | + | ||
| 5009 | +//template <typename T, typename std::enable_if<!std::is_const<T>::value, int>::type = 0> | ||
| 5010 | +template <typename T> | ||
| 5011 | +struct mock_compare_map { | ||
| 5012 | + typedef std::map<const T*, const T*> values_type; | ||
| 5013 | + | ||
| 5014 | + constexpr static T* begin_pointer = reinterpret_cast<T*>(0x1000); | ||
| 5015 | + constexpr static T* end_pointer = reinterpret_cast<T*>(0x2000); | ||
| 5016 | + | ||
| 5017 | + static bool is_key(const T* k) { | ||
| 5018 | + return k >= begin_pointer && k < end_pointer; | ||
| 5019 | + } | ||
| 5020 | + | ||
| 5021 | + static bool has_key(const T* k) { | ||
| 5022 | + return values.find(k) != values.end(); | ||
| 5023 | + } | ||
| 5024 | + | ||
| 5025 | + static bool has_value(const T* v) { | ||
| 5026 | + return std::find_if(values.begin(), values.end(), [v](typename values_type::value_type& kv) { return v == kv.second; }) != values.end(); | ||
| 5027 | + } | ||
| 5028 | + | ||
| 5029 | + static const T* get(const T* k) { | ||
| 5030 | + auto itr = values.find(k); | ||
| 5031 | + CPPUNIT_ASSERT_MESSAGE("mock_compare_map get failed, not inserted", itr != values.end()); | ||
| 5032 | + return itr->second; | ||
| 5033 | + } | ||
| 5034 | + | ||
| 5035 | + static values_type values; | ||
| 5036 | +}; | ||
| 5037 | + | ||
| 5038 | +template<typename T> | ||
| 5039 | +typename mock_compare_map<T>::values_type mock_compare_map<T>::values; | ||
| 5040 | + | ||
| 5041 | +template<typename T> | ||
| 5042 | +void mock_compare_add(T* v) { | ||
| 5043 | + mock_compare_map<T>::add_value(v); | ||
| 5044 | +} | ||
| 5045 | + | ||
| 5046 | +// | ||
| 5047 | +// Specialize: | ||
| 5048 | +// | ||
| 5049 | + | ||
| 5050 | +template <> | ||
| 5051 | +inline bool mock_compare_arg<sockaddr*>(sockaddr* lhs, sockaddr* rhs) { | ||
| 5052 | + return lhs != nullptr && rhs != nullptr && torrent::sa_equal(lhs, rhs); | ||
| 5053 | +} | ||
| 5054 | +template <> | ||
| 5055 | +inline bool mock_compare_arg<const sockaddr*>(const sockaddr* lhs, const sockaddr* rhs) { | ||
| 5056 | + return lhs != nullptr && rhs != nullptr && torrent::sa_equal(lhs, rhs); | ||
| 5057 | +} | ||
| 5058 | + | ||
| 5059 | +template <> | ||
| 5060 | +inline bool mock_compare_arg<torrent::Event*>(torrent::Event* lhs, torrent::Event* rhs) { | ||
| 5061 | + if (mock_compare_map<torrent::Event>::is_key(lhs)) { | ||
| 5062 | + if (!mock_compare_map<torrent::Event>::has_value(rhs)) { | ||
| 5063 | + mock_compare_map<torrent::Event>::values[lhs] = rhs; | ||
| 5064 | + return true; | ||
| 5065 | + } | ||
| 5066 | + | ||
| 5067 | + return mock_compare_map<torrent::Event>::has_key(lhs) && mock_compare_map<torrent::Event>::get(lhs) == rhs; | ||
| 5068 | + } | ||
| 5069 | + | ||
| 5070 | + return lhs == rhs; | ||
| 5071 | +} | ||
| 5072 | + | ||
| 5073 | +#endif | ||
| 5074 | diff --git a/test/helpers/mock_function.cc b/test/helpers/mock_function.cc | ||
| 5075 | new file mode 100644 | ||
| 5076 | index 00000000..83e81551 | ||
| 5077 | --- /dev/null | ||
| 5078 | +++ b/test/helpers/mock_function.cc | ||
| 5079 | @@ -0,0 +1,170 @@ | ||
| 5080 | +#include "config.h" | ||
| 5081 | + | ||
| 5082 | +#include "mock_function.h" | ||
| 5083 | + | ||
| 5084 | +#include <fcntl.h> | ||
| 5085 | +#include <iostream> | ||
| 5086 | +#include <torrent/event.h> | ||
| 5087 | +#include <torrent/net/socket_address.h> | ||
| 5088 | +#include <torrent/net/fd.h> | ||
| 5089 | +#include <torrent/utils/log.h> | ||
| 5090 | +#include <torrent/utils/random.h> | ||
| 5091 | + | ||
| 5092 | +#define MOCK_CLEANUP_MAP(MOCK_FUNC) \ | ||
| 5093 | + CPPUNIT_ASSERT_MESSAGE("expected mock function calls not completed for '" #MOCK_FUNC "'", mock_cleanup_map(&MOCK_FUNC) || ignore_assert); | ||
| 5094 | +#define MOCK_LOG(log_fmt, ...) \ | ||
| 5095 | + lt_log_print(torrent::LOG_MOCK_CALLS, "%s: " log_fmt, __func__, __VA_ARGS__); | ||
| 5096 | + | ||
| 5097 | +void | ||
| 5098 | +mock_clear(bool ignore_assert) { | ||
| 5099 | + MOCK_CLEANUP_MAP(torrent::fd__accept); | ||
| 5100 | + MOCK_CLEANUP_MAP(torrent::fd__bind); | ||
| 5101 | + MOCK_CLEANUP_MAP(torrent::fd__close); | ||
| 5102 | + MOCK_CLEANUP_MAP(torrent::fd__connect); | ||
| 5103 | + MOCK_CLEANUP_MAP(torrent::fd__fcntl_int); | ||
| 5104 | + MOCK_CLEANUP_MAP(torrent::fd__listen); | ||
| 5105 | + MOCK_CLEANUP_MAP(torrent::fd__setsockopt_int); | ||
| 5106 | + MOCK_CLEANUP_MAP(torrent::fd__socket); | ||
| 5107 | + | ||
| 5108 | + MOCK_CLEANUP_MAP(torrent::poll_event_open); | ||
| 5109 | + MOCK_CLEANUP_MAP(torrent::poll_event_close); | ||
| 5110 | + MOCK_CLEANUP_MAP(torrent::poll_event_closed); | ||
| 5111 | + MOCK_CLEANUP_MAP(torrent::poll_event_insert_read); | ||
| 5112 | + MOCK_CLEANUP_MAP(torrent::poll_event_insert_write); | ||
| 5113 | + MOCK_CLEANUP_MAP(torrent::poll_event_insert_error); | ||
| 5114 | + MOCK_CLEANUP_MAP(torrent::poll_event_remove_read); | ||
| 5115 | + MOCK_CLEANUP_MAP(torrent::poll_event_remove_write); | ||
| 5116 | + MOCK_CLEANUP_MAP(torrent::poll_event_remove_error); | ||
| 5117 | + | ||
| 5118 | + MOCK_CLEANUP_MAP(torrent::random_uniform_uint16); | ||
| 5119 | + MOCK_CLEANUP_MAP(torrent::random_uniform_uint32); | ||
| 5120 | + | ||
| 5121 | + mock_compare_map<torrent::Event>::values.clear(); | ||
| 5122 | +}; | ||
| 5123 | + | ||
| 5124 | +void mock_init() { | ||
| 5125 | + log_add_group_output(torrent::LOG_MOCK_CALLS, "test_output"); | ||
| 5126 | + mock_clear(true); | ||
| 5127 | +} | ||
| 5128 | + | ||
| 5129 | +void mock_cleanup() { | ||
| 5130 | + mock_clear(false); | ||
| 5131 | +} | ||
| 5132 | + | ||
| 5133 | +namespace torrent { | ||
| 5134 | + | ||
| 5135 | +// | ||
| 5136 | +// Mock functions for 'torrent/net/fd.h': | ||
| 5137 | +// | ||
| 5138 | + | ||
| 5139 | +int fd__accept(int socket, sockaddr *address, socklen_t *address_len) { | ||
| 5140 | + MOCK_LOG("entry socket:%i address:%s address_len:%u", | ||
| 5141 | + socket, torrent::sa_pretty_str(address).c_str(), (unsigned int)(*address_len)); | ||
| 5142 | + auto ret = mock_call<int>(__func__, &torrent::fd__accept, socket, address, address_len); | ||
| 5143 | + MOCK_LOG("exit socket:%i address:%s address_len:%u", | ||
| 5144 | + socket, torrent::sa_pretty_str(address).c_str(), (unsigned int)(*address_len)); | ||
| 5145 | + return ret; | ||
| 5146 | +} | ||
| 5147 | + | ||
| 5148 | +int fd__bind(int socket, const sockaddr *address, socklen_t address_len) { | ||
| 5149 | + MOCK_LOG("socket:%i address:%s address_len:%u", | ||
| 5150 | + socket, torrent::sa_pretty_str(address).c_str(), (unsigned int)address_len); | ||
| 5151 | + return mock_call<int>(__func__, &torrent::fd__bind, socket, address, address_len); | ||
| 5152 | +} | ||
| 5153 | + | ||
| 5154 | +int fd__close(int fildes) { | ||
| 5155 | + MOCK_LOG("filedes:%i", fildes); | ||
| 5156 | + return mock_call<int>(__func__, &torrent::fd__close, fildes); | ||
| 5157 | +} | ||
| 5158 | + | ||
| 5159 | +int fd__connect(int socket, const sockaddr *address, socklen_t address_len) { | ||
| 5160 | + MOCK_LOG("socket:%i address:%s address_len:%u", | ||
| 5161 | + socket, torrent::sa_pretty_str(address).c_str(), (unsigned int)address_len); | ||
| 5162 | + return mock_call<int>(__func__, &torrent::fd__connect, socket, address, address_len); | ||
| 5163 | +} | ||
| 5164 | + | ||
| 5165 | +int fd__fcntl_int(int fildes, int cmd, int arg) { | ||
| 5166 | + MOCK_LOG("filedes:%i cmd:%i arg:%i", fildes, cmd, arg); | ||
| 5167 | + return mock_call<int>(__func__, &torrent::fd__fcntl_int, fildes, cmd, arg); | ||
| 5168 | +} | ||
| 5169 | + | ||
| 5170 | +int fd__listen(int socket, int backlog) { | ||
| 5171 | + MOCK_LOG("socket:%i backlog:%i", socket, backlog); | ||
| 5172 | + return mock_call<int>(__func__, &torrent::fd__listen, socket, backlog); | ||
| 5173 | +} | ||
| 5174 | + | ||
| 5175 | +int fd__setsockopt_int(int socket, int level, int option_name, int option_value) { | ||
| 5176 | + MOCK_LOG("socket:%i level:%i option_name:%i option_value:%i", | ||
| 5177 | + socket, level, option_name, option_value); | ||
| 5178 | + return mock_call<int>(__func__, &torrent::fd__setsockopt_int, socket, level, option_name, option_value); | ||
| 5179 | +} | ||
| 5180 | + | ||
| 5181 | +int fd__socket(int domain, int type, int protocol) { | ||
| 5182 | + MOCK_LOG("domain:%i type:%i protocol:%i", domain, type, protocol); | ||
| 5183 | + return mock_call<int>(__func__, &torrent::fd__socket, domain, type, protocol); | ||
| 5184 | +} | ||
| 5185 | + | ||
| 5186 | +// | ||
| 5187 | +// Mock functions for 'torrent/event.h': | ||
| 5188 | +// | ||
| 5189 | + | ||
| 5190 | +void poll_event_open(Event* event) { | ||
| 5191 | + MOCK_LOG("fd:%i type_name:%s", event->file_descriptor(), event->type_name()); | ||
| 5192 | + return mock_call<void>(__func__, &torrent::poll_event_open, event); | ||
| 5193 | +} | ||
| 5194 | + | ||
| 5195 | +void poll_event_close(Event* event) { | ||
| 5196 | + MOCK_LOG("fd:%i type_name:%s", event->file_descriptor(), event->type_name()); | ||
| 5197 | + return mock_call<void>(__func__, &torrent::poll_event_close, event); | ||
| 5198 | +} | ||
| 5199 | + | ||
| 5200 | +void poll_event_closed(Event* event) { | ||
| 5201 | + MOCK_LOG("fd:%i type_name:%s", event->file_descriptor(), event->type_name()); | ||
| 5202 | + return mock_call<void>(__func__, &torrent::poll_event_closed, event); | ||
| 5203 | +} | ||
| 5204 | + | ||
| 5205 | +void poll_event_insert_read(Event* event) { | ||
| 5206 | + MOCK_LOG("fd:%i type_name:%s", event->file_descriptor(), event->type_name()); | ||
| 5207 | + return mock_call<void>(__func__, &torrent::poll_event_insert_read, event); | ||
| 5208 | +} | ||
| 5209 | + | ||
| 5210 | +void poll_event_insert_write(Event* event) { | ||
| 5211 | + MOCK_LOG("fd:%i type_name:%s", event->file_descriptor(), event->type_name()); | ||
| 5212 | + return mock_call<void>(__func__, &torrent::poll_event_insert_write, event); | ||
| 5213 | +} | ||
| 5214 | + | ||
| 5215 | +void poll_event_insert_error(Event* event) { | ||
| 5216 | + MOCK_LOG("fd:%i type_name:%s", event->file_descriptor(), event->type_name()); | ||
| 5217 | + return mock_call<void>(__func__, &torrent::poll_event_insert_error, event); | ||
| 5218 | +} | ||
| 5219 | + | ||
| 5220 | +void poll_event_remove_read(Event* event) { | ||
| 5221 | + MOCK_LOG("fd:%i type_name:%s", event->file_descriptor(), event->type_name()); | ||
| 5222 | + return mock_call<void>(__func__, &torrent::poll_event_remove_read, event); | ||
| 5223 | +} | ||
| 5224 | + | ||
| 5225 | +void poll_event_remove_write(Event* event) { | ||
| 5226 | + MOCK_LOG("fd:%i type_name:%s", event->file_descriptor(), event->type_name()); | ||
| 5227 | + return mock_call<void>(__func__, &torrent::poll_event_remove_write, event); | ||
| 5228 | +} | ||
| 5229 | + | ||
| 5230 | +void poll_event_remove_error(Event* event) { | ||
| 5231 | + MOCK_LOG("fd:%i type_name:%s", event->file_descriptor(), event->type_name()); | ||
| 5232 | + return mock_call<void>(__func__, &torrent::poll_event_remove_error, event); | ||
| 5233 | +} | ||
| 5234 | + | ||
| 5235 | +// | ||
| 5236 | +// Mock functions for 'torrent/utils/random.h': | ||
| 5237 | +// | ||
| 5238 | + | ||
| 5239 | +uint16_t random_uniform_uint16(uint16_t min, uint16_t max) { | ||
| 5240 | + MOCK_LOG("min:%" PRIu16 " max:%" PRIu16, min, max); | ||
| 5241 | + return mock_call<uint16_t>(__func__, &torrent::random_uniform_uint16, min, max); | ||
| 5242 | +} | ||
| 5243 | + | ||
| 5244 | +uint32_t random_uniform_uint32(uint32_t min, uint32_t max) { | ||
| 5245 | + MOCK_LOG("min:%" PRIu32 " max:%" PRIu32, min, max); | ||
| 5246 | + return mock_call<uint32_t>(__func__, &torrent::random_uniform_uint32, min, max); | ||
| 5247 | +} | ||
| 5248 | + | ||
| 5249 | +} | ||
| 5250 | diff --git a/test/helpers/mock_function.h b/test/helpers/mock_function.h | ||
| 5251 | new file mode 100644 | ||
| 5252 | index 00000000..6c194137 | ||
| 5253 | --- /dev/null | ||
| 5254 | +++ b/test/helpers/mock_function.h | ||
| 5255 | @@ -0,0 +1,133 @@ | ||
| 5256 | +#ifndef LIBTORRENT_HELPERS_MOCK_FUNCTION_H | ||
| 5257 | +#define LIBTORRENT_HELPERS_MOCK_FUNCTION_H | ||
| 5258 | + | ||
| 5259 | +#include <functional> | ||
| 5260 | +#include <map> | ||
| 5261 | +#include <string> | ||
| 5262 | +#include <tuple> | ||
| 5263 | +#include <type_traits> | ||
| 5264 | +#include <utility> | ||
| 5265 | +#include <cppunit/extensions/HelperMacros.h> | ||
| 5266 | + | ||
| 5267 | +#include "helpers/mock_compare.h" | ||
| 5268 | + | ||
| 5269 | +template<typename R, typename... Args> | ||
| 5270 | +struct mock_function_map { | ||
| 5271 | + typedef std::tuple<R, Args...> call_type; | ||
| 5272 | + typedef std::vector<call_type> call_list_type; | ||
| 5273 | + typedef std::map<void*, call_list_type> func_map_type; | ||
| 5274 | + | ||
| 5275 | + typedef std::function<R (Args...)> function_type; | ||
| 5276 | + typedef std::map<void*, function_type> redirect_map_type; | ||
| 5277 | + | ||
| 5278 | + static func_map_type functions; | ||
| 5279 | + static redirect_map_type redirects; | ||
| 5280 | + | ||
| 5281 | + static bool cleanup(void* fn) { | ||
| 5282 | + redirects.erase(fn); | ||
| 5283 | + return functions.erase(fn) == 0; | ||
| 5284 | + } | ||
| 5285 | + | ||
| 5286 | + static R ret_erase(void* fn) { | ||
| 5287 | + auto itr = functions.find(fn); | ||
| 5288 | + auto ret = std::get<0>(itr->second.front()); | ||
| 5289 | + itr->second.erase(itr->second.begin()); | ||
| 5290 | + | ||
| 5291 | + if (itr->second.empty()) | ||
| 5292 | + functions.erase(itr); | ||
| 5293 | + | ||
| 5294 | + return ret; | ||
| 5295 | + } | ||
| 5296 | +}; | ||
| 5297 | + | ||
| 5298 | +template<typename R, typename... Args> | ||
| 5299 | +typename mock_function_map<R, Args...>::func_map_type mock_function_map<R, Args...>::functions; | ||
| 5300 | +template<typename R, typename... Args> | ||
| 5301 | +typename mock_function_map<R, Args...>::redirect_map_type mock_function_map<R, Args...>::redirects; | ||
| 5302 | + | ||
| 5303 | +struct mock_void {}; | ||
| 5304 | + | ||
| 5305 | +template<typename R, typename... Args> | ||
| 5306 | +struct mock_function_type { | ||
| 5307 | + typedef mock_function_map<R, Args...> type; | ||
| 5308 | + | ||
| 5309 | + static int compare_expected(typename type::call_type lhs, Args... rhs) { | ||
| 5310 | + return mock_compare_tuple<sizeof...(Args)>(lhs, std::make_tuple(rhs...)); | ||
| 5311 | + } | ||
| 5312 | + | ||
| 5313 | + static R ret_erase(void* fn) { return type::ret_erase(fn); } | ||
| 5314 | + static bool has_redirect(void* fn) { return type::redirects.find(fn) != type::redirects.end(); } | ||
| 5315 | + static R call_redirect(void* fn, Args... args) { return type::redirects.find(fn)->second(args...); } | ||
| 5316 | +}; | ||
| 5317 | + | ||
| 5318 | +template<typename... Args> | ||
| 5319 | +struct mock_function_type<void, Args...> { | ||
| 5320 | + typedef mock_function_map<mock_void, Args...> type; | ||
| 5321 | + | ||
| 5322 | + static int compare_expected(typename type::call_type lhs, Args... rhs) { | ||
| 5323 | + return mock_compare_tuple<sizeof...(Args)>(lhs, std::make_tuple(rhs...)); | ||
| 5324 | + } | ||
| 5325 | + | ||
| 5326 | + static void ret_erase(void* fn) { type::ret_erase(fn); } | ||
| 5327 | + static bool has_redirect(void* fn) { return type::redirects.find(fn) != type::redirects.end(); } | ||
| 5328 | + static void call_redirect(void* fn, Args... args) { type::redirects.find(fn)->second(args...); } | ||
| 5329 | +}; | ||
| 5330 | + | ||
| 5331 | +void mock_init(); | ||
| 5332 | +void mock_cleanup(); | ||
| 5333 | + | ||
| 5334 | +template<typename R, typename... Args> | ||
| 5335 | +bool | ||
| 5336 | +mock_cleanup_map(R fn[[gnu::unused]](Args...)) { | ||
| 5337 | + return mock_function_type<R, Args...>::type::cleanup(reinterpret_cast<void*>(fn)); | ||
| 5338 | +} | ||
| 5339 | + | ||
| 5340 | +template<typename R, typename... Args> | ||
| 5341 | +void | ||
| 5342 | +mock_expect(R fn(Args...), R ret, Args... args) { | ||
| 5343 | + typedef mock_function_map<R, Args...> mock_map; | ||
| 5344 | + mock_map::functions[reinterpret_cast<void*>(fn)].push_back(std::tuple<R, Args...>(ret, args...)); | ||
| 5345 | +} | ||
| 5346 | + | ||
| 5347 | +template<typename... Args> | ||
| 5348 | +void | ||
| 5349 | +mock_expect(void fn(Args...), Args... args) { | ||
| 5350 | + typedef mock_function_map<mock_void, Args...> mock_map; | ||
| 5351 | + mock_map::functions[reinterpret_cast<void*>(fn)].push_back(std::tuple<mock_void, Args...>(mock_void(), args...)); | ||
| 5352 | +} | ||
| 5353 | + | ||
| 5354 | +template<typename R, typename... Args> | ||
| 5355 | +void | ||
| 5356 | +mock_redirect(R fn(Args...), std::function<R (Args...)> func) { | ||
| 5357 | + typedef mock_function_map<R, Args...> mock_map; | ||
| 5358 | + mock_map::redirects[reinterpret_cast<void*>(fn)] = func; | ||
| 5359 | +} | ||
| 5360 | + | ||
| 5361 | +template<typename R, typename... Args> | ||
| 5362 | +auto | ||
| 5363 | +mock_call_direct(std::string name, R fn(Args...), Args... args) -> decltype(fn(args...)) { | ||
| 5364 | + typedef mock_function_type<R, Args...> mock_type; | ||
| 5365 | + | ||
| 5366 | + auto itr = mock_type::type::functions.find(reinterpret_cast<void*>(fn)); | ||
| 5367 | + CPPUNIT_ASSERT_MESSAGE(("mock_call expected function calls exhausted by '" + name + "'").c_str(), | ||
| 5368 | + itr != mock_type::type::functions.end()); | ||
| 5369 | + | ||
| 5370 | + auto mismatch_arg = mock_type::compare_expected(itr->second.front(), args...); | ||
| 5371 | + CPPUNIT_ASSERT_MESSAGE(("mock_call expected function call argument " + std::to_string(mismatch_arg) + " mismatch for '" + name + "'").c_str(), | ||
| 5372 | + mismatch_arg == 0); | ||
| 5373 | + | ||
| 5374 | + return mock_type::ret_erase(reinterpret_cast<void*>(fn)); | ||
| 5375 | +} | ||
| 5376 | + | ||
| 5377 | +template<typename R, typename... Args> | ||
| 5378 | +auto | ||
| 5379 | +mock_call(std::string name, R fn(Args...), Args... args) -> decltype(fn(args...)) { | ||
| 5380 | + typedef mock_function_type<R, Args...> mock_type; | ||
| 5381 | + | ||
| 5382 | + if (mock_type::has_redirect(reinterpret_cast<void*>(fn))) | ||
| 5383 | + return mock_type::call_redirect(reinterpret_cast<void*>(fn), args...); | ||
| 5384 | + | ||
| 5385 | + return mock_call_direct(name, fn, args...); | ||
| 5386 | +} | ||
| 5387 | + | ||
| 5388 | +#endif | ||
| 5389 | diff --git a/test/helpers/network.h b/test/helpers/network.h | ||
| 5390 | new file mode 100644 | ||
| 5391 | index 00000000..6cf2f870 | ||
| 5392 | --- /dev/null | ||
| 5393 | +++ b/test/helpers/network.h | ||
| 5394 | @@ -0,0 +1,182 @@ | ||
| 5395 | +#ifndef LIBTORRENT_HELPER_NETWORK_H | ||
| 5396 | +#define LIBTORRENT_HELPER_NETWORK_H | ||
| 5397 | + | ||
| 5398 | +#include <functional> | ||
| 5399 | +#include <string> | ||
| 5400 | +#include <cppunit/extensions/HelperMacros.h> | ||
| 5401 | + | ||
| 5402 | +#include "torrent/net/address_info.h" | ||
| 5403 | + | ||
| 5404 | +// | ||
| 5405 | +// Socket addresses | ||
| 5406 | +// | ||
| 5407 | + | ||
| 5408 | +#define TEST_DEFAULT_SA \ | ||
| 5409 | + auto sin_any = wrap_ai_get_first_sa("0.0.0.0"); \ | ||
| 5410 | + auto sin_any_5000 = wrap_ai_get_first_sa("0.0.0.0", "5000"); \ | ||
| 5411 | + auto sin_any_5005 = wrap_ai_get_first_sa("0.0.0.0", "5005"); \ | ||
| 5412 | + auto sin_bc = wrap_ai_get_first_sa("255.255.255.255"); \ | ||
| 5413 | + auto sin_bc_5000 = wrap_ai_get_first_sa("255.255.255.255", "5000"); \ | ||
| 5414 | + auto sin_bnd = wrap_ai_get_first_sa("123.123.123.123"); \ | ||
| 5415 | + auto sin_1 = wrap_ai_get_first_sa("1.2.3.4"); \ | ||
| 5416 | + auto sin_1_5000 = wrap_ai_get_first_sa("1.2.3.4", "5000"); \ | ||
| 5417 | + auto sin_1_5005 = wrap_ai_get_first_sa("1.2.3.4", "5005"); \ | ||
| 5418 | + auto sin_1_5100 = wrap_ai_get_first_sa("1.2.3.4", "5100"); \ | ||
| 5419 | + auto sin_2 = wrap_ai_get_first_sa("4.3.2.1"); \ | ||
| 5420 | + auto sin_2_5000 = wrap_ai_get_first_sa("4.3.2.1", "5000"); \ | ||
| 5421 | + auto sin_2_5100 = wrap_ai_get_first_sa("4.3.2.1", "5100"); \ | ||
| 5422 | + \ | ||
| 5423 | + auto sin6_any = wrap_ai_get_first_sa("::"); \ | ||
| 5424 | + auto sin6_any_5000 = wrap_ai_get_first_sa("::", "5000"); \ | ||
| 5425 | + auto sin6_any_5005 = wrap_ai_get_first_sa("::", "5005"); \ | ||
| 5426 | + auto sin6_bnd = wrap_ai_get_first_sa("ff01::123"); \ | ||
| 5427 | + auto sin6_1 = wrap_ai_get_first_sa("ff01::1"); \ | ||
| 5428 | + auto sin6_1_5000 = wrap_ai_get_first_sa("ff01::1", "5000"); \ | ||
| 5429 | + auto sin6_1_5005 = wrap_ai_get_first_sa("ff01::1", "5005"); \ | ||
| 5430 | + auto sin6_1_5100 = wrap_ai_get_first_sa("ff01::1", "5100"); \ | ||
| 5431 | + auto sin6_2 = wrap_ai_get_first_sa("ff02::2"); \ | ||
| 5432 | + auto sin6_2_5000 = wrap_ai_get_first_sa("ff02::2", "5000"); \ | ||
| 5433 | + auto sin6_2_5100 = wrap_ai_get_first_sa("ff02::2", "5100"); \ | ||
| 5434 | + auto sin6_v4_1 = wrap_ai_get_first_sa("::ffff:1.2.3.4"); \ | ||
| 5435 | + auto sin6_v4_1_5000 = wrap_ai_get_first_sa("::ffff:1.2.3.4", "5000"); \ | ||
| 5436 | + auto sin6_v4_any = wrap_ai_get_first_sa("::ffff:0.0.0.0"); \ | ||
| 5437 | + auto sin6_v4_any_5000 = wrap_ai_get_first_sa("::ffff:0.0.0.0", "5000"); \ | ||
| 5438 | + auto sin6_v4_bc = wrap_ai_get_first_sa("::ffff:255.255.255.255"); \ | ||
| 5439 | + auto sin6_v4_bc_5000 = wrap_ai_get_first_sa("::ffff:255.255.255.255", "5000"); \ | ||
| 5440 | + auto sin6_v4_bnd = wrap_ai_get_first_sa("::ffff:123.123.123.123"); \ | ||
| 5441 | + \ | ||
| 5442 | + auto c_sin_any = wrap_ai_get_first_c_sa("0.0.0.0"); \ | ||
| 5443 | + auto c_sin_any_5000 = wrap_ai_get_first_c_sa("0.0.0.0", "5000"); \ | ||
| 5444 | + auto c_sin_any_5005 = wrap_ai_get_first_c_sa("0.0.0.0", "5005"); \ | ||
| 5445 | + auto c_sin_any_5010 = wrap_ai_get_first_c_sa("0.0.0.0", "5010"); \ | ||
| 5446 | + auto c_sin_any_6881 = wrap_ai_get_first_c_sa("0.0.0.0", "6881"); \ | ||
| 5447 | + auto c_sin_any_6900 = wrap_ai_get_first_c_sa("0.0.0.0", "6900"); \ | ||
| 5448 | + auto c_sin_any_6999 = wrap_ai_get_first_c_sa("0.0.0.0", "6999"); \ | ||
| 5449 | + auto c_sin_bc = wrap_ai_get_first_c_sa("255.255.255.255"); \ | ||
| 5450 | + auto c_sin_bc_5000 = wrap_ai_get_first_c_sa("255.255.255.255", "5000"); \ | ||
| 5451 | + auto c_sin_bnd = wrap_ai_get_first_c_sa("123.123.123.123"); \ | ||
| 5452 | + auto c_sin_bnd_5000 = wrap_ai_get_first_c_sa("123.123.123.123", "5000"); \ | ||
| 5453 | + auto c_sin_bnd_6881 = wrap_ai_get_first_c_sa("123.123.123.123", "6881"); \ | ||
| 5454 | + auto c_sin_bnd_6900 = wrap_ai_get_first_c_sa("123.123.123.123", "6900"); \ | ||
| 5455 | + auto c_sin_bnd_6999 = wrap_ai_get_first_c_sa("123.123.123.123", "6999"); \ | ||
| 5456 | + auto c_sin_1 = wrap_ai_get_first_c_sa("1.2.3.4"); \ | ||
| 5457 | + auto c_sin_1_5000 = wrap_ai_get_first_c_sa("1.2.3.4", "5000"); \ | ||
| 5458 | + auto c_sin_1_5005 = wrap_ai_get_first_c_sa("1.2.3.4", "5005"); \ | ||
| 5459 | + auto c_sin_1_5010 = wrap_ai_get_first_c_sa("1.2.3.4", "5010"); \ | ||
| 5460 | + auto c_sin_1_6881 = wrap_ai_get_first_c_sa("1.2.3.4", "6881"); \ | ||
| 5461 | + auto c_sin_1_6900 = wrap_ai_get_first_c_sa("1.2.3.4", "6900"); \ | ||
| 5462 | + auto c_sin_1_6999 = wrap_ai_get_first_c_sa("1.2.3.4", "6999"); \ | ||
| 5463 | + auto c_sin_2 = wrap_ai_get_first_c_sa("4.3.2.1"); \ | ||
| 5464 | + auto c_sin_2_5000 = wrap_ai_get_first_c_sa("4.3.2.1", "5000"); \ | ||
| 5465 | + auto c_sin_2_5100 = wrap_ai_get_first_c_sa("4.3.2.1", "5100"); \ | ||
| 5466 | + \ | ||
| 5467 | + auto c_sin6_any = wrap_ai_get_first_c_sa("::"); \ | ||
| 5468 | + auto c_sin6_any_5000 = wrap_ai_get_first_c_sa("::", "5000"); \ | ||
| 5469 | + auto c_sin6_any_5005 = wrap_ai_get_first_c_sa("::", "5005"); \ | ||
| 5470 | + auto c_sin6_any_5010 = wrap_ai_get_first_c_sa("::", "5010"); \ | ||
| 5471 | + auto c_sin6_any_6881 = wrap_ai_get_first_c_sa("::", "6881"); \ | ||
| 5472 | + auto c_sin6_any_6900 = wrap_ai_get_first_c_sa("::", "6900"); \ | ||
| 5473 | + auto c_sin6_any_6999 = wrap_ai_get_first_c_sa("::", "6999"); \ | ||
| 5474 | + auto c_sin6_bnd = wrap_ai_get_first_c_sa("ff01::123"); \ | ||
| 5475 | + auto c_sin6_bnd_5000 = wrap_ai_get_first_c_sa("ff01::123", "5000"); \ | ||
| 5476 | + auto c_sin6_bnd_6881 = wrap_ai_get_first_c_sa("ff01::123", "6881"); \ | ||
| 5477 | + auto c_sin6_bnd_6900 = wrap_ai_get_first_c_sa("ff01::123", "6900"); \ | ||
| 5478 | + auto c_sin6_bnd_6999 = wrap_ai_get_first_c_sa("ff01::123", "6999"); \ | ||
| 5479 | + auto c_sin6_v4_1_5000 = wrap_ai_get_first_c_sa("::ffff:1.2.3.4", "5000"); \ | ||
| 5480 | + auto c_sin6_1 = wrap_ai_get_first_c_sa("ff01::1"); \ | ||
| 5481 | + auto c_sin6_1_5000 = wrap_ai_get_first_c_sa("ff01::1", "5000"); \ | ||
| 5482 | + auto c_sin6_1_5005 = wrap_ai_get_first_c_sa("ff01::1", "5005"); \ | ||
| 5483 | + auto c_sin6_1_5010 = wrap_ai_get_first_c_sa("ff01::1", "5010"); \ | ||
| 5484 | + auto c_sin6_1_5100 = wrap_ai_get_first_c_sa("ff01::1", "5100"); \ | ||
| 5485 | + auto c_sin6_1_6881 = wrap_ai_get_first_c_sa("ff01::1", "6881"); \ | ||
| 5486 | + auto c_sin6_1_6900 = wrap_ai_get_first_c_sa("ff01::1", "6900"); \ | ||
| 5487 | + auto c_sin6_1_6999 = wrap_ai_get_first_c_sa("ff01::1", "6999"); \ | ||
| 5488 | + auto c_sin6_2 = wrap_ai_get_first_c_sa("ff02::2"); \ | ||
| 5489 | + auto c_sin6_2_5000 = wrap_ai_get_first_c_sa("ff02::2", "5000"); \ | ||
| 5490 | + auto c_sin6_2_5100 = wrap_ai_get_first_c_sa("ff02::2", "5100"); | ||
| 5491 | + | ||
| 5492 | +inline bool | ||
| 5493 | +compare_sin6_addr(in6_addr lhs, in6_addr rhs) { | ||
| 5494 | + return std::equal(lhs.s6_addr, lhs.s6_addr + 16, rhs.s6_addr); | ||
| 5495 | +} | ||
| 5496 | + | ||
| 5497 | +inline bool | ||
| 5498 | +compare_listen_result(const torrent::listen_result_type& lhs, int rhs_fd, const torrent::c_sa_unique_ptr& rhs_sap) { | ||
| 5499 | + return lhs.fd == rhs_fd && | ||
| 5500 | + ((lhs.address && rhs_sap) || ((lhs.address && rhs_sap) && torrent::sap_equal(lhs.address, rhs_sap))); | ||
| 5501 | +} | ||
| 5502 | + | ||
| 5503 | +inline torrent::sa_unique_ptr | ||
| 5504 | +wrap_ai_get_first_sa(const char* nodename, const char* servname = nullptr, const addrinfo* hints = nullptr) { | ||
| 5505 | + auto sa = torrent::ai_get_first_sa(nodename, servname, hints); | ||
| 5506 | + | ||
| 5507 | + CPPUNIT_ASSERT_MESSAGE(("wrap_ai_get_first_sa: nodename:'" + std::string(nodename) + "'").c_str(), | ||
| 5508 | + sa != nullptr); | ||
| 5509 | + return sa; | ||
| 5510 | +} | ||
| 5511 | + | ||
| 5512 | +inline torrent::c_sa_unique_ptr | ||
| 5513 | +wrap_ai_get_first_c_sa(const char* nodename, const char* servname = nullptr, const addrinfo* hints = nullptr) { | ||
| 5514 | + auto sa = torrent::ai_get_first_sa(nodename, servname, hints); | ||
| 5515 | + | ||
| 5516 | + CPPUNIT_ASSERT_MESSAGE(("wrap_ai_get_first_sa: nodename:'" + std::string(nodename) + "'").c_str(), | ||
| 5517 | + sa != nullptr); | ||
| 5518 | + return torrent::c_sa_unique_ptr(sa.release()); | ||
| 5519 | +} | ||
| 5520 | + | ||
| 5521 | +// | ||
| 5522 | +// Address info tests: | ||
| 5523 | +// | ||
| 5524 | + | ||
| 5525 | +typedef std::function<int (torrent::ai_unique_ptr&)> test_ai_ref; | ||
| 5526 | + | ||
| 5527 | +enum ai_flags_enum : int { | ||
| 5528 | + aif_none = 0x0, | ||
| 5529 | + aif_inet = 0x1, | ||
| 5530 | + aif_inet6 = 0x2, | ||
| 5531 | + aif_any = 0x4, | ||
| 5532 | +}; | ||
| 5533 | + | ||
| 5534 | +constexpr ai_flags_enum operator | (ai_flags_enum a, ai_flags_enum b) { | ||
| 5535 | + return static_cast<ai_flags_enum>(static_cast<int>(a) | static_cast<int>(b)); | ||
| 5536 | +} | ||
| 5537 | + | ||
| 5538 | +template <ai_flags_enum ai_flags> | ||
| 5539 | +inline bool | ||
| 5540 | +test_valid_ai_ref(test_ai_ref ftor, uint16_t port = 0) { | ||
| 5541 | + torrent::ai_unique_ptr ai; | ||
| 5542 | + | ||
| 5543 | + if (int err = ftor(ai)) { | ||
| 5544 | + std::cout << std::endl << "valid_ai_ref got error '" << gai_strerror(err) << "'" << std::endl; | ||
| 5545 | + return false; | ||
| 5546 | + } | ||
| 5547 | + | ||
| 5548 | + if ((ai_flags & aif_inet) && !torrent::sa_is_inet(ai->ai_addr)) | ||
| 5549 | + return false; | ||
| 5550 | + | ||
| 5551 | + if ((ai_flags & aif_inet6) && !torrent::sa_is_inet6(ai->ai_addr)) | ||
| 5552 | + return false; | ||
| 5553 | + | ||
| 5554 | + if (!!(ai_flags & aif_any) == !torrent::sa_is_any(ai->ai_addr)) | ||
| 5555 | + return false; | ||
| 5556 | + | ||
| 5557 | + if (torrent::sa_port(ai->ai_addr) != port) | ||
| 5558 | + return false; | ||
| 5559 | + | ||
| 5560 | + return true; | ||
| 5561 | +} | ||
| 5562 | + | ||
| 5563 | +inline bool | ||
| 5564 | +test_valid_ai_ref_err(test_ai_ref ftor, int expect_err) { | ||
| 5565 | + torrent::ai_unique_ptr ai; | ||
| 5566 | + int err = ftor(ai); | ||
| 5567 | + | ||
| 5568 | + if (err != expect_err) { | ||
| 5569 | + std::cout << std::endl << "ai_ref_err got wrong error, expected '" << gai_strerror(expect_err) << "', got '" << gai_strerror(err) << "'" << std::endl; | ||
| 5570 | + return false; | ||
| 5571 | + } | ||
| 5572 | + | ||
| 5573 | + return true; | ||
| 5574 | +} | ||
| 5575 | + | ||
| 5576 | +#endif | ||
| 5577 | diff --git a/test/helpers/progress_listener.cc b/test/helpers/progress_listener.cc | ||
| 5578 | new file mode 100644 | ||
| 5579 | index 00000000..02803ffc | ||
| 5580 | --- /dev/null | ||
| 5581 | +++ b/test/helpers/progress_listener.cc | ||
| 5582 | @@ -0,0 +1,63 @@ | ||
| 5583 | +#include "config.h" | ||
| 5584 | + | ||
| 5585 | +#include "progress_listener.h" | ||
| 5586 | + | ||
| 5587 | +#include <algorithm> | ||
| 5588 | +#include <iostream> | ||
| 5589 | +#include <iterator> | ||
| 5590 | +#include <numeric> | ||
| 5591 | +#include <stdexcept> | ||
| 5592 | +#include "torrent/utils/log.h" | ||
| 5593 | +#include "torrent/utils/log_buffer.h" | ||
| 5594 | + | ||
| 5595 | +static std::string | ||
| 5596 | +get_test_path(const test_list_type& tl) { | ||
| 5597 | + if (tl.size() < 2) | ||
| 5598 | + return ""; | ||
| 5599 | + | ||
| 5600 | + return std::accumulate(std::next(tl.begin()), std::prev(tl.end()), std::string(), [](std::string result, CppUnit::Test* test) { | ||
| 5601 | + return std::move(result) + test->getName() + "::"; | ||
| 5602 | + }); | ||
| 5603 | +} | ||
| 5604 | + | ||
| 5605 | +void | ||
| 5606 | +progress_listener::startTest(CppUnit::Test *test) { | ||
| 5607 | + std::cout << get_test_path(m_test_path) << test->getName() << std::flush; | ||
| 5608 | + | ||
| 5609 | + torrent::log_cleanup(); | ||
| 5610 | + | ||
| 5611 | + m_last_test_failed = false; | ||
| 5612 | + m_current_log_buffer = torrent::log_open_log_buffer("test_output"); | ||
| 5613 | +} | ||
| 5614 | + | ||
| 5615 | +void | ||
| 5616 | +progress_listener::addFailure(const CppUnit::TestFailure &failure) { | ||
| 5617 | + // AddFailure is called for parent test suits, so only deal with leafs. | ||
| 5618 | + if (m_current_log_buffer == nullptr) | ||
| 5619 | + return; | ||
| 5620 | + | ||
| 5621 | + std::cout << " : " << (failure.isError() ? "error" : "assertion"); | ||
| 5622 | + | ||
| 5623 | + m_last_test_failed = true; | ||
| 5624 | + m_failures.push_back(std::move(failure_type{failure.failedTestName(), std::move(m_current_log_buffer)})); | ||
| 5625 | +} | ||
| 5626 | + | ||
| 5627 | +void | ||
| 5628 | +progress_listener::endTest(CppUnit::Test *test) { | ||
| 5629 | + std::cout << (m_last_test_failed ? "" : " : OK") << std::endl; | ||
| 5630 | + | ||
| 5631 | + m_current_log_buffer.reset(); | ||
| 5632 | + torrent::log_cleanup(); | ||
| 5633 | +} | ||
| 5634 | + | ||
| 5635 | +void | ||
| 5636 | +progress_listener::startSuite(CppUnit::Test *suite) { | ||
| 5637 | + m_test_path.push_back(suite); | ||
| 5638 | + | ||
| 5639 | + std::cout << std::endl << get_test_path(m_test_path) << suite->getName() << ":" << std::endl; | ||
| 5640 | +} | ||
| 5641 | + | ||
| 5642 | +void | ||
| 5643 | +progress_listener::endSuite(CppUnit::Test *suite) { | ||
| 5644 | + m_test_path.pop_back(); | ||
| 5645 | +} | ||
| 5646 | diff --git a/test/helpers/progress_listener.h b/test/helpers/progress_listener.h | ||
| 5647 | new file mode 100644 | ||
| 5648 | index 00000000..18fb8faa | ||
| 5649 | --- /dev/null | ||
| 5650 | +++ b/test/helpers/progress_listener.h | ||
| 5651 | @@ -0,0 +1,47 @@ | ||
| 5652 | +#include <memory> | ||
| 5653 | +#include <vector> | ||
| 5654 | +#include <cppunit/Test.h> | ||
| 5655 | +#include <cppunit/TestFailure.h> | ||
| 5656 | +#include <cppunit/TestListener.h> | ||
| 5657 | + | ||
| 5658 | +#include "torrent/utils/log_buffer.h" | ||
| 5659 | + | ||
| 5660 | +struct failure_type { | ||
| 5661 | + std::string name; | ||
| 5662 | + torrent::log_buffer_ptr log; | ||
| 5663 | +}; | ||
| 5664 | + | ||
| 5665 | +typedef std::unique_ptr<CppUnit::TestFailure> test_failure_ptr; | ||
| 5666 | +typedef std::vector<CppUnit::Test*> test_list_type; | ||
| 5667 | +typedef std::vector<failure_type> failure_list_type; | ||
| 5668 | + | ||
| 5669 | +class progress_listener : public CppUnit::TestListener { | ||
| 5670 | +public: | ||
| 5671 | + progress_listener() : m_last_test_failed(false) {} | ||
| 5672 | + | ||
| 5673 | + void startTest(CppUnit::Test *test) override; | ||
| 5674 | + void addFailure(const CppUnit::TestFailure &failure) override; | ||
| 5675 | + void endTest(CppUnit::Test *test) override; | ||
| 5676 | + | ||
| 5677 | + void startSuite(CppUnit::Test *suite) override; | ||
| 5678 | + void endSuite(CppUnit::Test *suite) override; | ||
| 5679 | + | ||
| 5680 | + //Called by a TestRunner before running the test. | ||
| 5681 | + // void startTestRun(CppUnit::Test *test, CppUnit::TestResult *event_manager) override; | ||
| 5682 | + | ||
| 5683 | + // Called by a TestRunner after running the test. | ||
| 5684 | + // void endTestRun(CppUnit::Test *test, CppUnit::TestResult *event_manager) override; | ||
| 5685 | + | ||
| 5686 | + const failure_list_type& failures() { return m_failures; } | ||
| 5687 | + failure_list_type&& move_failures() { return std::move(m_failures); } | ||
| 5688 | + | ||
| 5689 | +private: | ||
| 5690 | + progress_listener(const progress_listener& rhs) = delete; | ||
| 5691 | + void operator =(const progress_listener& rhs) = delete; | ||
| 5692 | + | ||
| 5693 | + test_list_type m_test_path; | ||
| 5694 | + failure_list_type m_failures; | ||
| 5695 | + bool m_last_test_failed; | ||
| 5696 | + | ||
| 5697 | + torrent::log_buffer_ptr m_current_log_buffer; | ||
| 5698 | +}; | ||
| 5699 | diff --git a/test/helpers/test_fixture.cc b/test/helpers/test_fixture.cc | ||
| 5700 | new file mode 100644 | ||
| 5701 | index 00000000..4d8d7214 | ||
| 5702 | --- /dev/null | ||
| 5703 | +++ b/test/helpers/test_fixture.cc | ||
| 5704 | @@ -0,0 +1,18 @@ | ||
| 5705 | +#include "config.h" | ||
| 5706 | + | ||
| 5707 | +#include "test_fixture.h" | ||
| 5708 | + | ||
| 5709 | +#include "torrent/utils/log.h" | ||
| 5710 | + | ||
| 5711 | +void | ||
| 5712 | +test_fixture::setUp() { | ||
| 5713 | + mock_init(); | ||
| 5714 | + | ||
| 5715 | + log_add_group_output(torrent::LOG_CONNECTION_BIND, "test_output"); | ||
| 5716 | + log_add_group_output(torrent::LOG_CONNECTION_FD, "test_output"); | ||
| 5717 | +} | ||
| 5718 | + | ||
| 5719 | +void | ||
| 5720 | +test_fixture::tearDown() { | ||
| 5721 | + mock_cleanup(); | ||
| 5722 | +} | ||
| 5723 | diff --git a/test/helpers/test_fixture.h b/test/helpers/test_fixture.h | ||
| 5724 | new file mode 100644 | ||
| 5725 | index 00000000..312d5009 | ||
| 5726 | --- /dev/null | ||
| 5727 | +++ b/test/helpers/test_fixture.h | ||
| 5728 | @@ -0,0 +1,14 @@ | ||
| 5729 | +#ifndef LIBTORRENT_HELPER_TEST_FIXTURE_H | ||
| 5730 | +#define LIBTORRENT_HELPER_TEST_FIXTURE_H | ||
| 5731 | + | ||
| 5732 | +#include <cppunit/extensions/HelperMacros.h> | ||
| 5733 | + | ||
| 5734 | +#include "helpers/mock_function.h" | ||
| 5735 | + | ||
| 5736 | +class test_fixture : public CppUnit::TestFixture { | ||
| 5737 | +public: | ||
| 5738 | + void setUp(); | ||
| 5739 | + void tearDown(); | ||
| 5740 | +}; | ||
| 5741 | + | ||
| 5742 | +#endif | ||
| 5743 | diff --git a/test/helpers/utils.h b/test/helpers/utils.h | ||
| 5744 | new file mode 100644 | ||
| 5745 | index 00000000..d18450c1 | ||
| 5746 | --- /dev/null | ||
| 5747 | +++ b/test/helpers/utils.h | ||
| 5748 | @@ -0,0 +1,60 @@ | ||
| 5749 | +#ifndef LIBTORRENT_HELPER_UTILS_H | ||
| 5750 | +#define LIBTORRENT_HELPER_UTILS_H | ||
| 5751 | + | ||
| 5752 | +#include <algorithm> | ||
| 5753 | +#include <iostream> | ||
| 5754 | +#include <cppunit/extensions/TestFactoryRegistry.h> | ||
| 5755 | +#include <torrent/utils/log.h> | ||
| 5756 | + | ||
| 5757 | +static void | ||
| 5758 | +dump_failure_log(const failure_type& failure) { | ||
| 5759 | + if (failure.log->empty()) | ||
| 5760 | + return; | ||
| 5761 | + | ||
| 5762 | + std::cout << std::endl << failure.name << std::endl; | ||
| 5763 | + | ||
| 5764 | + // Doesn't print dump messages as log_buffer drops them. | ||
| 5765 | + std::for_each(failure.log->begin(), failure.log->end(), [](const torrent::log_entry& entry) { | ||
| 5766 | + std::cout << entry.timestamp << ' ' << entry.message << '\n'; | ||
| 5767 | + }); | ||
| 5768 | + | ||
| 5769 | + std::cout << std::flush; | ||
| 5770 | +} | ||
| 5771 | + | ||
| 5772 | +static void | ||
| 5773 | +dump_failures(const failure_list_type& failures) { | ||
| 5774 | + if (failures.empty()) | ||
| 5775 | + return; | ||
| 5776 | + | ||
| 5777 | + std::cout << std::endl | ||
| 5778 | + << "=================" << std::endl | ||
| 5779 | + << "Failed Test Logs:" << std::endl | ||
| 5780 | + << "=================" << std::endl; | ||
| 5781 | + | ||
| 5782 | + std::for_each(failures.begin(), failures.end(), [](const failure_type& failure) { | ||
| 5783 | + dump_failure_log(failure); | ||
| 5784 | + }); | ||
| 5785 | + std::cout << std::endl; | ||
| 5786 | +} | ||
| 5787 | + | ||
| 5788 | +static | ||
| 5789 | +void add_tests(CppUnit::TextUi::TestRunner& runner, const char* c_test_names) { | ||
| 5790 | + if (c_test_names == NULL || std::string(c_test_names).empty()) { | ||
| 5791 | + runner.addTest(CppUnit::TestFactoryRegistry::getRegistry().makeTest()); | ||
| 5792 | + return; | ||
| 5793 | + } | ||
| 5794 | + | ||
| 5795 | + const std::string& test_names(c_test_names); | ||
| 5796 | + | ||
| 5797 | + size_t pos = 0; | ||
| 5798 | + size_t next = 0; | ||
| 5799 | + | ||
| 5800 | + while ((next = test_names.find(',', pos)) < test_names.size()) { | ||
| 5801 | + runner.addTest(CppUnit::TestFactoryRegistry::getRegistry(test_names.substr(pos, next - pos)).makeTest()); | ||
| 5802 | + pos = next + 1; | ||
| 5803 | + } | ||
| 5804 | + | ||
| 5805 | + runner.addTest(CppUnit::TestFactoryRegistry::getRegistry(test_names.substr(pos)).makeTest()); | ||
| 5806 | +} | ||
| 5807 | + | ||
| 5808 | +#endif | ||
| 5809 | diff --git a/test/main.cc b/test/main.cc | ||
| 5810 | index e69d3d70..da93fead 100644 | ||
| 5811 | --- a/test/main.cc | ||
| 5812 | +++ b/test/main.cc | ||
| 5813 | @@ -1,44 +1,92 @@ | ||
| 5814 | +#include "config.h" | ||
| 5815 | + | ||
| 5816 | +#include <cstdlib> | ||
| 5817 | #include <stdexcept> | ||
| 5818 | +#include <signal.h> | ||
| 5819 | +#include <string.h> | ||
| 5820 | #include <cppunit/BriefTestProgressListener.h> | ||
| 5821 | #include <cppunit/CompilerOutputter.h> | ||
| 5822 | #include <cppunit/TestResult.h> | ||
| 5823 | #include <cppunit/TestResultCollector.h> | ||
| 5824 | +#include <cppunit/extensions/HelperMacros.h> | ||
| 5825 | #include <cppunit/extensions/TestFactoryRegistry.h> | ||
| 5826 | #include <cppunit/ui/text/TestRunner.h> | ||
| 5827 | |||
| 5828 | -int main(int argc, char* argv[]) | ||
| 5829 | -{ | ||
| 5830 | +#ifdef USE_EXECINFO | ||
| 5831 | +#include <execinfo.h> | ||
| 5832 | +#endif | ||
| 5833 | + | ||
| 5834 | +#include "helpers/progress_listener.h" | ||
| 5835 | +#include "helpers/utils.h" | ||
| 5836 | + | ||
| 5837 | +CPPUNIT_REGISTRY_ADD_TO_DEFAULT("net"); | ||
| 5838 | +CPPUNIT_REGISTRY_ADD_TO_DEFAULT("torrent/net"); | ||
| 5839 | +CPPUNIT_REGISTRY_ADD_TO_DEFAULT("torrent/utils"); | ||
| 5840 | + | ||
| 5841 | +void | ||
| 5842 | +do_test_panic(int signum) { | ||
| 5843 | + signal(signum, SIG_DFL); | ||
| 5844 | + | ||
| 5845 | + std::cout << std::endl << std::endl << "Caught " << strsignal(signum) << ", dumping stack:" << std::endl << std::endl; | ||
| 5846 | + | ||
| 5847 | +#ifdef USE_EXECINFO | ||
| 5848 | + void* stackPtrs[20]; | ||
| 5849 | + | ||
| 5850 | + // Print the stack and exit. | ||
| 5851 | + int stackSize = backtrace(stackPtrs, 20); | ||
| 5852 | + char** stackStrings = backtrace_symbols(stackPtrs, stackSize); | ||
| 5853 | + | ||
| 5854 | + for (int i = 0; i < stackSize; ++i) | ||
| 5855 | + std::cout << stackStrings[i] << std::endl; | ||
| 5856 | + | ||
| 5857 | +#else | ||
| 5858 | + std::cout << "Stack dump not enabled." << std::endl; | ||
| 5859 | +#endif | ||
| 5860 | + | ||
| 5861 | + std::cout << std::endl; | ||
| 5862 | + torrent::log_cleanup(); | ||
| 5863 | + std::abort(); | ||
| 5864 | +} | ||
| 5865 | + | ||
| 5866 | +void | ||
| 5867 | +register_signal_handlers() { | ||
| 5868 | + struct sigaction sa; | ||
| 5869 | + sigemptyset(&sa.sa_mask); | ||
| 5870 | + sa.sa_flags = SA_RESTART; | ||
| 5871 | + sa.sa_handler = &do_test_panic; | ||
| 5872 | + | ||
| 5873 | + if (sigaction(SIGSEGV, &sa, NULL) == -1) { | ||
| 5874 | + std::cout << "Could not register signal handlers." << std::endl; | ||
| 5875 | + exit(-1); | ||
| 5876 | + } | ||
| 5877 | +} | ||
| 5878 | + | ||
| 5879 | +int main(int argc, char* argv[]) { | ||
| 5880 | + register_signal_handlers(); | ||
| 5881 | + | ||
| 5882 | CppUnit::TestResult controller; | ||
| 5883 | CppUnit::TestResultCollector result; | ||
| 5884 | - CppUnit::BriefTestProgressListener progressListener; | ||
| 5885 | + progress_listener progress; | ||
| 5886 | |||
| 5887 | controller.addListener( &result ); | ||
| 5888 | - controller.addListener( &progressListener ); | ||
| 5889 | - | ||
| 5890 | - // Get the top level suite from the registry | ||
| 5891 | - CppUnit::Test *suite = CppUnit::TestFactoryRegistry::getRegistry().makeTest(); | ||
| 5892 | + controller.addListener( &progress ); | ||
| 5893 | |||
| 5894 | - // Adds the test to the list of test to run | ||
| 5895 | CppUnit::TextUi::TestRunner runner; | ||
| 5896 | - runner.addTest( suite ); | ||
| 5897 | + add_tests(runner, std::getenv("TEST_NAME")); | ||
| 5898 | |||
| 5899 | - // Change the default outputter to a compiler error format outputter | ||
| 5900 | - runner.setOutputter( new CppUnit::CompilerOutputter( &runner.result(), | ||
| 5901 | - std::cerr ) ); | ||
| 5902 | try { | ||
| 5903 | std::cout << "Running "; | ||
| 5904 | runner.run( controller ); | ||
| 5905 | |||
| 5906 | - std::cerr << std::endl; | ||
| 5907 | - | ||
| 5908 | + // TODO: Make outputter. | ||
| 5909 | + dump_failures(progress.failures()); | ||
| 5910 | + | ||
| 5911 | // Print test in a compiler compatible format. | ||
| 5912 | CppUnit::CompilerOutputter outputter( &result, std::cerr ); | ||
| 5913 | outputter.write(); | ||
| 5914 | |||
| 5915 | } catch ( std::invalid_argument &e ) { // Test path not resolved | ||
| 5916 | - std::cerr << std::endl | ||
| 5917 | - << "ERROR: " << e.what() | ||
| 5918 | - << std::endl; | ||
| 5919 | + std::cerr << std::endl << "ERROR: " << e.what() << std::endl; | ||
| 5920 | return 1; | ||
| 5921 | } | ||
| 5922 | |||
| 5923 | diff --git a/test/net/test_socket_listen.cc b/test/net/test_socket_listen.cc | ||
| 5924 | new file mode 100644 | ||
| 5925 | index 00000000..e86a078b | ||
| 5926 | --- /dev/null | ||
| 5927 | +++ b/test/net/test_socket_listen.cc | ||
| 5928 | @@ -0,0 +1,398 @@ | ||
| 5929 | +#include "config.h" | ||
| 5930 | + | ||
| 5931 | +#include "test_socket_listen.h" | ||
| 5932 | + | ||
| 5933 | +#include "helpers/expect_fd.h" | ||
| 5934 | +#include "helpers/expect_utils.h" | ||
| 5935 | +#include "helpers/mock_function.h" | ||
| 5936 | +#include "helpers/network.h" | ||
| 5937 | + | ||
| 5938 | +#include <net/socket_listen.h> | ||
| 5939 | +#include <torrent/exceptions.h> | ||
| 5940 | +#include <torrent/utils/log.h> | ||
| 5941 | + | ||
| 5942 | +CPPUNIT_TEST_SUITE_NAMED_REGISTRATION(test_socket_listen, "net"); | ||
| 5943 | + | ||
| 5944 | +struct test_sl_deleter { | ||
| 5945 | + void operator()(torrent::socket_listen* sl) const { if (!sl->is_open()) delete sl; } | ||
| 5946 | +}; | ||
| 5947 | + | ||
| 5948 | +typedef std::unique_ptr<torrent::socket_listen, test_sl_deleter> test_sl_unique_ptr; | ||
| 5949 | + | ||
| 5950 | +#define TEST_SL_BEGIN(name) \ | ||
| 5951 | + test_sl_unique_ptr sl(new torrent::socket_listen); \ | ||
| 5952 | + std::vector<torrent::sa_unique_ptr> sap_cache; \ | ||
| 5953 | + lt_log_print(torrent::LOG_MOCK_CALLS, "sl_begin: %s", name); \ | ||
| 5954 | + TEST_DEFAULT_SA; | ||
| 5955 | + | ||
| 5956 | +#define TEST_SL_ASSERT_OPEN(_sap_bind, _sap_result, _flags) \ | ||
| 5957 | + TEST_SL_ASSERT_OPEN_PORT(_sap_bind, _sap_result, 5000, 5009, 5005, _flags); \ | ||
| 5958 | + CPPUNIT_ASSERT(sl->socket_address_port() == 5005); | ||
| 5959 | + | ||
| 5960 | +#define TEST_SL_ASSERT_OPEN_PORT(_sap_bind, _sap_result, _first_port, _last_port, _itr_port, _flags) \ | ||
| 5961 | + expect_event_open_re(0); \ | ||
| 5962 | + CPPUNIT_ASSERT(sl->open(_sap_bind, _first_port, _last_port, _itr_port, _flags)); \ | ||
| 5963 | + CPPUNIT_ASSERT(sl->is_open()); \ | ||
| 5964 | + CPPUNIT_ASSERT(torrent::sa_equal(sl->socket_address(), _sap_result.get())); | ||
| 5965 | + | ||
| 5966 | +#define TEST_SL_ASSERT_OPEN_SEQUENTIAL(_sap_bind, _sap_result, _first_port, _last_port, _flags) \ | ||
| 5967 | + expect_event_open_re(0); \ | ||
| 5968 | + CPPUNIT_ASSERT(sl->open_sequential(_sap_bind, _first_port, _last_port, _flags)); \ | ||
| 5969 | + CPPUNIT_ASSERT(sl->is_open()); \ | ||
| 5970 | + CPPUNIT_ASSERT(torrent::sa_equal(sl->socket_address(), _sap_result.get())); | ||
| 5971 | + | ||
| 5972 | +#define TEST_SL_ASSERT_OPEN_RANDOMIZE(_sap_bind, _sap_result, _first_port, _last_port, _flags) \ | ||
| 5973 | + expect_event_open_re(0); \ | ||
| 5974 | + CPPUNIT_ASSERT(sl->open_randomize(_sap_bind, _first_port, _last_port, _flags)); \ | ||
| 5975 | + CPPUNIT_ASSERT(sl->is_open()); \ | ||
| 5976 | + CPPUNIT_ASSERT(torrent::sa_equal(sl->socket_address(), _sap_result.get())); | ||
| 5977 | + | ||
| 5978 | +#define TEST_SL_ASSERT_CLOSED() \ | ||
| 5979 | + CPPUNIT_ASSERT(!sl->is_open()); \ | ||
| 5980 | + CPPUNIT_ASSERT(sl->file_descriptor() == -1); \ | ||
| 5981 | + CPPUNIT_ASSERT(sl->socket_address() == nullptr); \ | ||
| 5982 | + CPPUNIT_ASSERT(sl->socket_address_port() == 0); | ||
| 5983 | + | ||
| 5984 | +#define TEST_SL_CLOSE(_fd) \ | ||
| 5985 | + mock_expect(&torrent::fd__close, 0, _fd); \ | ||
| 5986 | + mock_expect(&torrent::poll_event_closed, (torrent::Event*)sl.get()); \ | ||
| 5987 | + CPPUNIT_ASSERT_NO_THROW(sl->close()); \ | ||
| 5988 | + TEST_SL_ASSERT_CLOSED(); | ||
| 5989 | + | ||
| 5990 | +#define TEST_SL_MOCK_CLOSED_PORT_RANGE(_src_sap, _first_port, _last_port) \ | ||
| 5991 | + { uint16_t _port = _first_port; do { \ | ||
| 5992 | + sap_cache.push_back(torrent::sap_copy(_src_sap)); \ | ||
| 5993 | + torrent::sap_set_port(sap_cache.back(), _port); \ | ||
| 5994 | + mock_expect(&torrent::fd__bind, -1, 1000, \ | ||
| 5995 | + (const sockaddr*)sap_cache.back().get(), \ | ||
| 5996 | + (socklen_t)torrent::sap_length(sap_cache.back())); \ | ||
| 5997 | + } while (_port++ != _last_port); \ | ||
| 5998 | + } | ||
| 5999 | + | ||
| 6000 | +void | ||
| 6001 | +test_socket_listen::test_basic() { | ||
| 6002 | + TEST_SL_BEGIN("basic"); | ||
| 6003 | + TEST_SL_ASSERT_CLOSED(); | ||
| 6004 | + CPPUNIT_ASSERT(sl->backlog() == SOMAXCONN); | ||
| 6005 | + CPPUNIT_ASSERT(sl->type_name() == std::string("socket_listen")); | ||
| 6006 | +} | ||
| 6007 | + | ||
| 6008 | +void | ||
| 6009 | +test_socket_listen::test_open_error() { | ||
| 6010 | + { TEST_SL_BEGIN("open twice"); | ||
| 6011 | + expect_fd_inet6_tcp_nonblock(1000); | ||
| 6012 | + expect_fd_bind_listen(1000, c_sin6_any_5005); | ||
| 6013 | + TEST_SL_ASSERT_OPEN(torrent::sap_copy(sin6_any), c_sin6_any_5005, torrent::fd_flag_stream | torrent::fd_flag_nonblock); | ||
| 6014 | + CPPUNIT_ASSERT_THROW(sl->open(torrent::sap_copy(sin6_any), 5000, 5009, 5005, torrent::fd_flag_stream), | ||
| 6015 | + torrent::internal_error); | ||
| 6016 | + TEST_SL_CLOSE(1000); | ||
| 6017 | + }; | ||
| 6018 | + { TEST_SL_BEGIN("sin_any, stream, no v4only"); | ||
| 6019 | + CPPUNIT_ASSERT_THROW(sl->open(torrent::sap_copy(sin_any), 5000, 5009, 5005, torrent::fd_flag_stream), | ||
| 6020 | + torrent::internal_error); | ||
| 6021 | + TEST_SL_ASSERT_CLOSED(); | ||
| 6022 | + }; | ||
| 6023 | +} | ||
| 6024 | + | ||
| 6025 | +void | ||
| 6026 | +test_socket_listen::test_open_sap() { | ||
| 6027 | + { TEST_SL_BEGIN("sin6_any, stream"); | ||
| 6028 | + expect_fd_inet6_tcp(1000); | ||
| 6029 | + expect_fd_bind_listen(1000, c_sin6_any_5005); | ||
| 6030 | + TEST_SL_ASSERT_OPEN(torrent::sap_copy(sin6_any), c_sin6_any_5005, torrent::fd_flag_stream); | ||
| 6031 | + TEST_SL_CLOSE(1000); | ||
| 6032 | + }; | ||
| 6033 | + { TEST_SL_BEGIN("sin_any, stream|v4only"); | ||
| 6034 | + expect_fd_inet_tcp(1000); | ||
| 6035 | + expect_fd_bind_listen(1000, c_sin_any_5005); | ||
| 6036 | + TEST_SL_ASSERT_OPEN(torrent::sap_copy(sin_any), c_sin_any_5005, torrent::fd_flag_stream | torrent::fd_flag_v4only); | ||
| 6037 | + TEST_SL_CLOSE(1000); | ||
| 6038 | + }; | ||
| 6039 | + { TEST_SL_BEGIN("sin_1, stream|v4only"); | ||
| 6040 | + expect_fd_inet_tcp(1000); | ||
| 6041 | + expect_fd_bind_listen(1000, c_sin_1_5005); | ||
| 6042 | + TEST_SL_ASSERT_OPEN(torrent::sap_copy(sin_1), c_sin_1_5005, torrent::fd_flag_stream | torrent::fd_flag_v4only); | ||
| 6043 | + TEST_SL_CLOSE(1000); | ||
| 6044 | + }; | ||
| 6045 | + { TEST_SL_BEGIN("sin6_any, stream|v6only"); | ||
| 6046 | + expect_fd_inet6_tcp(1000); | ||
| 6047 | + mock_expect(&torrent::fd__setsockopt_int, 0, 1000, (int)IPPROTO_IPV6, (int)IPV6_V6ONLY, (int)true); | ||
| 6048 | + expect_fd_bind_listen(1000, c_sin6_any_5005); | ||
| 6049 | + TEST_SL_ASSERT_OPEN(torrent::sap_copy(sin6_any), c_sin6_any_5005, torrent::fd_flag_stream | torrent::fd_flag_v6only); | ||
| 6050 | + TEST_SL_CLOSE(1000); | ||
| 6051 | + }; | ||
| 6052 | + { TEST_SL_BEGIN("sin6_1, stream|v6only"); | ||
| 6053 | + expect_fd_inet6_tcp(1000); | ||
| 6054 | + mock_expect(&torrent::fd__setsockopt_int, 0, 1000, (int)IPPROTO_IPV6, (int)IPV6_V6ONLY, (int)true); | ||
| 6055 | + expect_fd_bind_listen(1000, c_sin6_1_5005); | ||
| 6056 | + TEST_SL_ASSERT_OPEN(torrent::sap_copy(sin6_1), c_sin6_1_5005, torrent::fd_flag_stream | torrent::fd_flag_v6only); | ||
| 6057 | + TEST_SL_CLOSE(1000); | ||
| 6058 | + }; | ||
| 6059 | +} | ||
| 6060 | + | ||
| 6061 | +void | ||
| 6062 | +test_socket_listen::test_open_sap_error() { | ||
| 6063 | + { TEST_SL_BEGIN("unspec"); | ||
| 6064 | + CPPUNIT_ASSERT_THROW(sl->open(torrent::sa_make_unspec(), 5000, 5009, 5005, torrent::fd_flag_stream), torrent::internal_error); | ||
| 6065 | + TEST_SL_ASSERT_CLOSED(); | ||
| 6066 | + }; | ||
| 6067 | + { TEST_SL_BEGIN("unix"); | ||
| 6068 | + CPPUNIT_ASSERT_THROW(sl->open(torrent::sa_make_unix("test"), 5000, 5009, 5005, torrent::fd_flag_stream), torrent::internal_error); | ||
| 6069 | + TEST_SL_ASSERT_CLOSED(); | ||
| 6070 | + }; | ||
| 6071 | + { TEST_SL_BEGIN("sin_any_5005"); | ||
| 6072 | + CPPUNIT_ASSERT_THROW(sl->open(torrent::sap_copy(sin_any_5005), 5000, 5009, 5005, torrent::fd_flag_stream | torrent::fd_flag_v4only), torrent::internal_error); | ||
| 6073 | + TEST_SL_ASSERT_CLOSED(); | ||
| 6074 | + }; | ||
| 6075 | + { TEST_SL_BEGIN("sin6_any_5005"); | ||
| 6076 | + CPPUNIT_ASSERT_THROW(sl->open(torrent::sap_copy(sin6_any_5005), 5000, 5009, 5005, torrent::fd_flag_stream), torrent::internal_error); | ||
| 6077 | + TEST_SL_ASSERT_CLOSED(); | ||
| 6078 | + }; | ||
| 6079 | + { TEST_SL_BEGIN("sin_any"); | ||
| 6080 | + CPPUNIT_ASSERT_THROW(sl->open(torrent::sap_to_v4mapped(sin_any), 5000, 5009, 5005, torrent::fd_flag_stream | torrent::fd_flag_v4only), torrent::internal_error); | ||
| 6081 | + TEST_SL_ASSERT_CLOSED(); | ||
| 6082 | + }; | ||
| 6083 | + { TEST_SL_BEGIN("sin_1, v4mapped"); | ||
| 6084 | + CPPUNIT_ASSERT_THROW(sl->open(torrent::sap_to_v4mapped(sin_1), 5000, 5009, 5005, torrent::fd_flag_stream | torrent::fd_flag_v4only), torrent::internal_error); | ||
| 6085 | + TEST_SL_ASSERT_CLOSED(); | ||
| 6086 | + }; | ||
| 6087 | + { TEST_SL_BEGIN("sin_broadcast"); | ||
| 6088 | + CPPUNIT_ASSERT_THROW(sl->open(torrent::sap_copy(sin_bc), 5000, 5009, 5005, torrent::fd_flag_stream | torrent::fd_flag_v4only), torrent::internal_error); | ||
| 6089 | + TEST_SL_ASSERT_CLOSED(); | ||
| 6090 | + }; | ||
| 6091 | +} | ||
| 6092 | + | ||
| 6093 | +void | ||
| 6094 | +test_socket_listen::test_open_flags() { | ||
| 6095 | + { TEST_SL_BEGIN("sin_any, stream|v4only|nonblock"); | ||
| 6096 | + expect_fd_inet_tcp_nonblock(1000); | ||
| 6097 | + expect_fd_bind_listen(1000, c_sin_any_5005); | ||
| 6098 | + TEST_SL_ASSERT_OPEN(torrent::sap_copy_addr(sin_any), c_sin_any_5005, torrent::fd_flag_stream | torrent::fd_flag_v4only | torrent::fd_flag_nonblock); | ||
| 6099 | + TEST_SL_CLOSE(1000); | ||
| 6100 | + }; | ||
| 6101 | + { TEST_SL_BEGIN("sin6_any, stream|nonblock"); | ||
| 6102 | + expect_fd_inet6_tcp_nonblock(1000); | ||
| 6103 | + expect_fd_bind_listen(1000, c_sin6_any_5005); | ||
| 6104 | + TEST_SL_ASSERT_OPEN(torrent::sap_copy(sin6_any), c_sin6_any_5005, torrent::fd_flag_stream | torrent::fd_flag_nonblock); | ||
| 6105 | + TEST_SL_CLOSE(1000); | ||
| 6106 | + }; | ||
| 6107 | + { TEST_SL_BEGIN("sin_any, stream|v4only|reuse_address"); | ||
| 6108 | + expect_fd_inet_tcp(1000); | ||
| 6109 | + mock_expect(&torrent::fd__setsockopt_int, 0, 1000, (int)SOL_SOCKET, (int)SO_REUSEADDR, (int)true); | ||
| 6110 | + expect_fd_bind_listen(1000, c_sin_any_5005); | ||
| 6111 | + TEST_SL_ASSERT_OPEN(torrent::sap_copy_addr(sin_any), c_sin_any_5005, torrent::fd_flag_stream | torrent::fd_flag_v4only | torrent::fd_flag_reuse_address); | ||
| 6112 | + TEST_SL_CLOSE(1000); | ||
| 6113 | + }; | ||
| 6114 | + { TEST_SL_BEGIN("sin6_any, stream|reuse_address"); | ||
| 6115 | + expect_fd_inet6_tcp(1000); | ||
| 6116 | + mock_expect(&torrent::fd__setsockopt_int, 0, 1000, (int)SOL_SOCKET, (int)SO_REUSEADDR, (int)true); | ||
| 6117 | + expect_fd_bind_listen(1000, c_sin6_any_5005); | ||
| 6118 | + TEST_SL_ASSERT_OPEN(torrent::sap_copy(sin6_any), c_sin6_any_5005, torrent::fd_flag_stream | torrent::fd_flag_reuse_address); | ||
| 6119 | + TEST_SL_CLOSE(1000); | ||
| 6120 | + }; | ||
| 6121 | + { TEST_SL_BEGIN("sin_any, stream|v4only|nonblock|reuse_address"); | ||
| 6122 | + expect_fd_inet_tcp_nonblock(1000); | ||
| 6123 | + mock_expect(&torrent::fd__setsockopt_int, 0, 1000, (int)SOL_SOCKET, (int)SO_REUSEADDR, (int)true); | ||
| 6124 | + expect_fd_bind_listen(1000, c_sin_any_5005); | ||
| 6125 | + TEST_SL_ASSERT_OPEN(torrent::sap_copy_addr(sin_any), c_sin_any_5005, torrent::fd_flag_stream | torrent::fd_flag_v4only | torrent::fd_flag_nonblock | torrent::fd_flag_reuse_address); | ||
| 6126 | + TEST_SL_CLOSE(1000); | ||
| 6127 | + }; | ||
| 6128 | + { TEST_SL_BEGIN("sin6_any, stream|nonblock|reuse_address"); | ||
| 6129 | + expect_fd_inet6_tcp_nonblock_reuseaddr(1000); | ||
| 6130 | + expect_fd_bind_listen(1000, c_sin6_any_5005); | ||
| 6131 | + TEST_SL_ASSERT_OPEN(torrent::sap_copy(sin6_any), c_sin6_any_5005, torrent::fd_flag_stream | torrent::fd_flag_nonblock | torrent::fd_flag_reuse_address); | ||
| 6132 | + TEST_SL_CLOSE(1000); | ||
| 6133 | + }; | ||
| 6134 | +} | ||
| 6135 | + | ||
| 6136 | +void | ||
| 6137 | +test_socket_listen::test_open_flags_error() { | ||
| 6138 | + { TEST_SL_BEGIN("sin6_any, fd_flags(0)"); | ||
| 6139 | + CPPUNIT_ASSERT_THROW(sl->open(torrent::sap_copy(sin6_any), 5000, 5009, 5005, torrent::fd_flags(0)), torrent::internal_error); | ||
| 6140 | + TEST_SL_ASSERT_CLOSED(); | ||
| 6141 | + }; | ||
| 6142 | + { TEST_SL_BEGIN("sin6_any, fd_flags(0xffff)"); | ||
| 6143 | + CPPUNIT_ASSERT_THROW(sl->open(torrent::sap_copy(sin6_any), 5000, 5009, 5005, torrent::fd_flags(0xffff)), torrent::internal_error); | ||
| 6144 | + TEST_SL_ASSERT_CLOSED(); | ||
| 6145 | + }; | ||
| 6146 | +} | ||
| 6147 | + | ||
| 6148 | +void | ||
| 6149 | +test_socket_listen::test_open_port_single() { | ||
| 6150 | + { TEST_SL_BEGIN("sin6_any, stream"); | ||
| 6151 | + expect_fd_inet6_tcp(1000); | ||
| 6152 | + expect_fd_bind_listen(1000, c_sin6_any_5000); | ||
| 6153 | + TEST_SL_ASSERT_OPEN_PORT(torrent::sap_copy(sin6_any), c_sin6_any_5000, 5000, 5000, 5000, torrent::fd_flag_stream); | ||
| 6154 | + TEST_SL_CLOSE(1000); | ||
| 6155 | + }; | ||
| 6156 | + { TEST_SL_BEGIN("sin_any, stream"); | ||
| 6157 | + expect_fd_inet_tcp(1000); | ||
| 6158 | + expect_fd_bind_listen(1000, c_sin_any_5000); | ||
| 6159 | + TEST_SL_ASSERT_OPEN_PORT(torrent::sap_copy(sin_any), c_sin_any_5000, 5000, 5000, 5000, torrent::fd_flag_stream | torrent::fd_flag_v4only); | ||
| 6160 | + TEST_SL_CLOSE(1000); | ||
| 6161 | + }; | ||
| 6162 | +} | ||
| 6163 | + | ||
| 6164 | +void | ||
| 6165 | +test_socket_listen::test_open_port_single_error() { | ||
| 6166 | + { TEST_SL_BEGIN("sin6_any, 0, 0, 0"); | ||
| 6167 | + CPPUNIT_ASSERT_THROW(sl->open(torrent::sap_copy(sin6_any), 0, 0, 0, torrent::fd_flag_stream), torrent::internal_error); | ||
| 6168 | + TEST_SL_ASSERT_CLOSED(); | ||
| 6169 | + }; | ||
| 6170 | + { TEST_SL_BEGIN("sin6_any, 1000, 0, 0"); | ||
| 6171 | + CPPUNIT_ASSERT_THROW(sl->open(torrent::sap_copy(sin6_any), 1000, 0, 0, torrent::fd_flag_stream), torrent::internal_error); | ||
| 6172 | + TEST_SL_ASSERT_CLOSED(); | ||
| 6173 | + }; | ||
| 6174 | + { TEST_SL_BEGIN("sin6_any, 0, 1000, 0"); | ||
| 6175 | + CPPUNIT_ASSERT_THROW(sl->open(torrent::sap_copy(sin6_any), 0, 1000, 0, torrent::fd_flag_stream), torrent::internal_error); | ||
| 6176 | + TEST_SL_ASSERT_CLOSED(); | ||
| 6177 | + }; | ||
| 6178 | + { TEST_SL_BEGIN("sin6_any, 0, 0, 500"); | ||
| 6179 | + CPPUNIT_ASSERT_THROW(sl->open(torrent::sap_copy(sin6_any), 0, 0, 500, torrent::fd_flag_stream), torrent::internal_error); | ||
| 6180 | + TEST_SL_ASSERT_CLOSED(); | ||
| 6181 | + }; | ||
| 6182 | + { TEST_SL_BEGIN("sin6_any, 0, 1000, 500"); | ||
| 6183 | + CPPUNIT_ASSERT_THROW(sl->open(torrent::sap_copy(sin6_any), 0, 1000, 500, torrent::fd_flag_stream), torrent::internal_error); | ||
| 6184 | + TEST_SL_ASSERT_CLOSED(); | ||
| 6185 | + }; | ||
| 6186 | +} | ||
| 6187 | + | ||
| 6188 | +void | ||
| 6189 | +test_socket_listen::test_open_port_range() { | ||
| 6190 | + { TEST_SL_BEGIN("sin6_any, stream, first"); | ||
| 6191 | + expect_fd_inet6_tcp(1000); | ||
| 6192 | + expect_fd_bind_listen(1000, c_sin6_any_5000); | ||
| 6193 | + TEST_SL_ASSERT_OPEN_PORT(torrent::sap_copy(sin6_any), c_sin6_any_5000, 5000, 5010, 5000, torrent::fd_flag_stream); | ||
| 6194 | + TEST_SL_CLOSE(1000); | ||
| 6195 | + }; | ||
| 6196 | + { TEST_SL_BEGIN("sin6_any, stream, from first to middle port"); | ||
| 6197 | + expect_fd_inet6_tcp(1000); | ||
| 6198 | + TEST_SL_MOCK_CLOSED_PORT_RANGE(sin6_any, 5000, 5004); | ||
| 6199 | + expect_fd_bind_listen(1000, c_sin6_any_5005); | ||
| 6200 | + TEST_SL_ASSERT_OPEN_PORT(torrent::sap_copy(sin6_any), c_sin6_any_5005, 5000, 5010, 5000, torrent::fd_flag_stream); | ||
| 6201 | + TEST_SL_CLOSE(1000); | ||
| 6202 | + }; | ||
| 6203 | + { TEST_SL_BEGIN("sin6_any, stream, from first to last port"); | ||
| 6204 | + expect_fd_inet6_tcp(1000); | ||
| 6205 | + TEST_SL_MOCK_CLOSED_PORT_RANGE(sin6_any, 5000, 5009); | ||
| 6206 | + expect_fd_bind_listen(1000, c_sin6_any_5010); | ||
| 6207 | + TEST_SL_ASSERT_OPEN_PORT(torrent::sap_copy(sin6_any), c_sin6_any_5010, 5000, 5010, 5000, torrent::fd_flag_stream); | ||
| 6208 | + TEST_SL_CLOSE(1000); | ||
| 6209 | + }; | ||
| 6210 | + { TEST_SL_BEGIN("sin6_any, stream, middle"); | ||
| 6211 | + expect_fd_inet6_tcp(1000); | ||
| 6212 | + expect_fd_bind_listen(1000, c_sin6_any_5005); | ||
| 6213 | + TEST_SL_ASSERT_OPEN_PORT(torrent::sap_copy(sin6_any), c_sin6_any_5005, 5000, 5010, 5005, torrent::fd_flag_stream); | ||
| 6214 | + TEST_SL_CLOSE(1000); | ||
| 6215 | + }; | ||
| 6216 | + { TEST_SL_BEGIN("sin6_any, stream, from middle to last port"); | ||
| 6217 | + expect_fd_inet6_tcp(1000); | ||
| 6218 | + TEST_SL_MOCK_CLOSED_PORT_RANGE(sin6_any, 5005, 5009); | ||
| 6219 | + expect_fd_bind_listen(1000, c_sin6_any_5010); | ||
| 6220 | + TEST_SL_ASSERT_OPEN_PORT(torrent::sap_copy(sin6_any), c_sin6_any_5010, 5000, 5010, 5005, torrent::fd_flag_stream); | ||
| 6221 | + TEST_SL_CLOSE(1000); | ||
| 6222 | + }; | ||
| 6223 | + { TEST_SL_BEGIN("sin6_any, stream, last"); | ||
| 6224 | + expect_fd_inet6_tcp(1000); | ||
| 6225 | + expect_fd_bind_listen(1000, c_sin6_any_5010); | ||
| 6226 | + TEST_SL_ASSERT_OPEN_PORT(torrent::sap_copy(sin6_any), c_sin6_any_5010, 5000, 5010, 5010, torrent::fd_flag_stream); | ||
| 6227 | + TEST_SL_CLOSE(1000); | ||
| 6228 | + }; | ||
| 6229 | + { TEST_SL_BEGIN("sin6_any, stream, from last to first port"); | ||
| 6230 | + expect_fd_inet6_tcp(1000); | ||
| 6231 | + TEST_SL_MOCK_CLOSED_PORT_RANGE(sin6_any, 5010, 5010); | ||
| 6232 | + expect_fd_bind_listen(1000, c_sin6_any_5000); | ||
| 6233 | + TEST_SL_ASSERT_OPEN_PORT(torrent::sap_copy(sin6_any), c_sin6_any_5000, 5000, 5010, 5010, torrent::fd_flag_stream); | ||
| 6234 | + TEST_SL_CLOSE(1000); | ||
| 6235 | + }; | ||
| 6236 | + { TEST_SL_BEGIN("sin6_any, stream, from last to middle port"); | ||
| 6237 | + expect_fd_inet6_tcp(1000); | ||
| 6238 | + TEST_SL_MOCK_CLOSED_PORT_RANGE(sin6_any, 5010, 5010); | ||
| 6239 | + TEST_SL_MOCK_CLOSED_PORT_RANGE(sin6_any, 5000, 5004); | ||
| 6240 | + expect_fd_bind_listen(1000, c_sin6_any_5005); | ||
| 6241 | + TEST_SL_ASSERT_OPEN_PORT(torrent::sap_copy(sin6_any), c_sin6_any_5005, 5000, 5010, 5010, torrent::fd_flag_stream); | ||
| 6242 | + TEST_SL_CLOSE(1000); | ||
| 6243 | + }; | ||
| 6244 | +} | ||
| 6245 | + | ||
| 6246 | +void | ||
| 6247 | +test_socket_listen::test_open_port_range_error() { | ||
| 6248 | + { TEST_SL_BEGIN("sin6_any, first > last"); | ||
| 6249 | + CPPUNIT_ASSERT_THROW(sl->open(torrent::sap_copy(sin6_any), 5000, 4999, 5000, torrent::fd_flag_stream), torrent::internal_error); | ||
| 6250 | + TEST_SL_ASSERT_CLOSED(); | ||
| 6251 | + }; | ||
| 6252 | + { TEST_SL_BEGIN("sin6_any, first > itr"); | ||
| 6253 | + CPPUNIT_ASSERT_THROW(sl->open(torrent::sap_copy(sin6_any), 5001, 5009, 5000, torrent::fd_flag_stream), torrent::internal_error); | ||
| 6254 | + TEST_SL_ASSERT_CLOSED(); | ||
| 6255 | + }; | ||
| 6256 | + { TEST_SL_BEGIN("sin6_any, itr > last"); | ||
| 6257 | + CPPUNIT_ASSERT_THROW(sl->open(torrent::sap_copy(sin6_any), 5000, 5009, 5010, torrent::fd_flag_stream), torrent::internal_error); | ||
| 6258 | + TEST_SL_ASSERT_CLOSED(); | ||
| 6259 | + }; | ||
| 6260 | + { TEST_SL_BEGIN("sin6_any, min first > last"); | ||
| 6261 | + CPPUNIT_ASSERT_THROW(sl->open(torrent::sap_copy(sin6_any), 2, 1, 2, torrent::fd_flag_stream), torrent::internal_error); | ||
| 6262 | + TEST_SL_ASSERT_CLOSED(); | ||
| 6263 | + }; | ||
| 6264 | + { TEST_SL_BEGIN("sin6_any, min first > itr"); | ||
| 6265 | + CPPUNIT_ASSERT_THROW(sl->open(torrent::sap_copy(sin6_any), 2, 1000, 1, torrent::fd_flag_stream), torrent::internal_error); | ||
| 6266 | + TEST_SL_ASSERT_CLOSED(); | ||
| 6267 | + }; | ||
| 6268 | + { TEST_SL_BEGIN("sin6_any, min itr > last"); | ||
| 6269 | + CPPUNIT_ASSERT_THROW(sl->open(torrent::sap_copy(sin6_any), 1, 2, 3, torrent::fd_flag_stream), torrent::internal_error); | ||
| 6270 | + TEST_SL_ASSERT_CLOSED(); | ||
| 6271 | + }; | ||
| 6272 | + { TEST_SL_BEGIN("sin6_any, max first > last"); | ||
| 6273 | + CPPUNIT_ASSERT_THROW(sl->open(torrent::sap_copy(sin6_any), 0xffff, 0xfffe, 0xffff, torrent::fd_flag_stream), torrent::internal_error); | ||
| 6274 | + TEST_SL_ASSERT_CLOSED(); | ||
| 6275 | + }; | ||
| 6276 | + { TEST_SL_BEGIN("sin6_any, max first > itr"); | ||
| 6277 | + CPPUNIT_ASSERT_THROW(sl->open(torrent::sap_copy(sin6_any), 0xffff, 0xffff, 0xfffe, torrent::fd_flag_stream), torrent::internal_error); | ||
| 6278 | + TEST_SL_ASSERT_CLOSED(); | ||
| 6279 | + }; | ||
| 6280 | + { TEST_SL_BEGIN("sin6_any, max itr > last"); | ||
| 6281 | + CPPUNIT_ASSERT_THROW(sl->open(torrent::sap_copy(sin6_any), 0xfffe, 0xfffe, 0xffff, torrent::fd_flag_stream), torrent::internal_error); | ||
| 6282 | + TEST_SL_ASSERT_CLOSED(); | ||
| 6283 | + }; | ||
| 6284 | +} | ||
| 6285 | + | ||
| 6286 | +void | ||
| 6287 | +test_socket_listen::test_open_sequential() { | ||
| 6288 | + { TEST_SL_BEGIN("sin6_any, stream"); | ||
| 6289 | + expect_fd_inet6_tcp(1000); | ||
| 6290 | + expect_fd_bind_listen(1000, c_sin6_any_5000); | ||
| 6291 | + TEST_SL_ASSERT_OPEN_SEQUENTIAL(torrent::sap_copy(sin6_any), c_sin6_any_5000, 5000, 5010, torrent::fd_flag_stream); | ||
| 6292 | + TEST_SL_CLOSE(1000); | ||
| 6293 | + }; | ||
| 6294 | +} | ||
| 6295 | + | ||
| 6296 | +void | ||
| 6297 | +test_socket_listen::test_open_randomize() { | ||
| 6298 | + { TEST_SL_BEGIN("sin6_any, stream"); | ||
| 6299 | + expect_random_uniform_uint16(5005, 5000, 5010); | ||
| 6300 | + expect_fd_inet6_tcp(1000); | ||
| 6301 | + expect_fd_bind_listen(1000, c_sin6_any_5005); | ||
| 6302 | + TEST_SL_ASSERT_OPEN_RANDOMIZE(torrent::sap_copy(sin6_any), c_sin6_any_5005, 5000, 5010, torrent::fd_flag_stream); | ||
| 6303 | + TEST_SL_CLOSE(1000); | ||
| 6304 | + }; | ||
| 6305 | +} | ||
| 6306 | + | ||
| 6307 | +// deal with reuse error | ||
| 6308 | + | ||
| 6309 | +void | ||
| 6310 | +test_socket_listen::test_accept() { | ||
| 6311 | + { TEST_SL_BEGIN("sin6_any, stream"); | ||
| 6312 | + expect_fd_inet6_tcp(1000); | ||
| 6313 | + expect_fd_bind_listen(1000, c_sin6_any_5000); | ||
| 6314 | + TEST_SL_ASSERT_OPEN_SEQUENTIAL(torrent::sap_copy(sin6_any), c_sin6_any_5000, 5000, 5010, torrent::fd_flag_stream); | ||
| 6315 | + | ||
| 6316 | + std::vector<torrent::fd_sap_tuple> accepted_connections; | ||
| 6317 | + | ||
| 6318 | + sl->set_slot_accepted([&accepted_connections](int accept_fd, torrent::sa_unique_ptr sap) { | ||
| 6319 | + accepted_connections.push_back(torrent::fd_sap_tuple{accept_fd, std::move(sap)}); | ||
| 6320 | + }); | ||
| 6321 | + | ||
| 6322 | + // CPPUNIT_ASSERT(accepted_connections.size() > 0 && torrent::fd_sap_equal(accepted_connections[0], torrent::fd_sap_tuple{2000, torrent::sap_copy(sin6_1_5100)})); | ||
| 6323 | + | ||
| 6324 | + TEST_SL_CLOSE(1000); | ||
| 6325 | + }; | ||
| 6326 | +} | ||
| 6327 | diff --git a/test/net/test_socket_listen.h b/test/net/test_socket_listen.h | ||
| 6328 | new file mode 100644 | ||
| 6329 | index 00000000..5d06f7f3 | ||
| 6330 | --- /dev/null | ||
| 6331 | +++ b/test/net/test_socket_listen.h | ||
| 6332 | @@ -0,0 +1,44 @@ | ||
| 6333 | +#include "helpers/test_fixture.h" | ||
| 6334 | + | ||
| 6335 | +class test_socket_listen : public test_fixture { | ||
| 6336 | + CPPUNIT_TEST_SUITE(test_socket_listen); | ||
| 6337 | + | ||
| 6338 | + CPPUNIT_TEST(test_basic); | ||
| 6339 | + | ||
| 6340 | + CPPUNIT_TEST(test_open_error); | ||
| 6341 | + CPPUNIT_TEST(test_open_sap); | ||
| 6342 | + CPPUNIT_TEST(test_open_sap_error); | ||
| 6343 | + CPPUNIT_TEST(test_open_flags); | ||
| 6344 | + CPPUNIT_TEST(test_open_flags_error); | ||
| 6345 | + | ||
| 6346 | + CPPUNIT_TEST(test_open_port_single); | ||
| 6347 | + CPPUNIT_TEST(test_open_port_single_error); | ||
| 6348 | + CPPUNIT_TEST(test_open_port_range); | ||
| 6349 | + CPPUNIT_TEST(test_open_port_range_error); | ||
| 6350 | + | ||
| 6351 | + CPPUNIT_TEST(test_open_sequential); | ||
| 6352 | + CPPUNIT_TEST(test_open_randomize); | ||
| 6353 | + | ||
| 6354 | + CPPUNIT_TEST(test_accept); | ||
| 6355 | + | ||
| 6356 | + CPPUNIT_TEST_SUITE_END(); | ||
| 6357 | + | ||
| 6358 | +public: | ||
| 6359 | + void test_basic(); | ||
| 6360 | + | ||
| 6361 | + void test_open_error(); | ||
| 6362 | + void test_open_sap(); | ||
| 6363 | + void test_open_sap_error(); | ||
| 6364 | + void test_open_flags(); | ||
| 6365 | + void test_open_flags_error(); | ||
| 6366 | + | ||
| 6367 | + void test_open_port_single(); | ||
| 6368 | + void test_open_port_single_error(); | ||
| 6369 | + void test_open_port_range(); | ||
| 6370 | + void test_open_port_range_error(); | ||
| 6371 | + | ||
| 6372 | + void test_open_sequential(); | ||
| 6373 | + void test_open_randomize(); | ||
| 6374 | + | ||
| 6375 | + void test_accept(); | ||
| 6376 | +}; | ||
| 6377 | diff --git a/test/torrent/net/test_address_info.cc b/test/torrent/net/test_address_info.cc | ||
| 6378 | new file mode 100644 | ||
| 6379 | index 00000000..e3ee24d1 | ||
| 6380 | --- /dev/null | ||
| 6381 | +++ b/test/torrent/net/test_address_info.cc | ||
| 6382 | @@ -0,0 +1,62 @@ | ||
| 6383 | +#include "config.h" | ||
| 6384 | + | ||
| 6385 | +#include "test_address_info.h" | ||
| 6386 | + | ||
| 6387 | +#include "helpers/network.h" | ||
| 6388 | +#include "torrent/net/address_info.h" | ||
| 6389 | +#include "torrent/net/socket_address.h" | ||
| 6390 | + | ||
| 6391 | +CPPUNIT_TEST_SUITE_NAMED_REGISTRATION(test_address_info, "torrent/net"); | ||
| 6392 | + | ||
| 6393 | +void | ||
| 6394 | +test_address_info::test_basic() { | ||
| 6395 | + CPPUNIT_ASSERT(test_valid_ai_ref<aif_inet|aif_any> (std::bind(torrent::ai_get_addrinfo, "0.0.0.0", nullptr, nullptr, std::placeholders::_1))); | ||
| 6396 | + CPPUNIT_ASSERT(test_valid_ai_ref<aif_inet6|aif_any>(std::bind(torrent::ai_get_addrinfo, "::", nullptr, nullptr, std::placeholders::_1))); | ||
| 6397 | + | ||
| 6398 | + CPPUNIT_ASSERT(test_valid_ai_ref<aif_inet> (std::bind(torrent::ai_get_addrinfo, "1.1.1.1", nullptr, nullptr, std::placeholders::_1))); | ||
| 6399 | + CPPUNIT_ASSERT(test_valid_ai_ref<aif_inet6>(std::bind(torrent::ai_get_addrinfo, "ff01::1", nullptr, nullptr, std::placeholders::_1))); | ||
| 6400 | + CPPUNIT_ASSERT(test_valid_ai_ref<aif_inet6>(std::bind(torrent::ai_get_addrinfo, "2001:0db8:85a3:0000:0000:8a2e:0370:7334", nullptr, nullptr, std::placeholders::_1))); | ||
| 6401 | + | ||
| 6402 | + CPPUNIT_ASSERT(test_valid_ai_ref<aif_inet> (std::bind(torrent::ai_get_addrinfo, "1.1.1.1", "22123", nullptr, std::placeholders::_1), 22123)); | ||
| 6403 | + CPPUNIT_ASSERT(test_valid_ai_ref<aif_inet6>(std::bind(torrent::ai_get_addrinfo, "2001:db8:a::", "22123", nullptr, std::placeholders::_1), 22123)); | ||
| 6404 | + | ||
| 6405 | + CPPUNIT_ASSERT(test_valid_ai_ref<aif_none> (std::bind(torrent::ai_get_addrinfo, "localhost", nullptr, nullptr, std::placeholders::_1))); | ||
| 6406 | + | ||
| 6407 | + CPPUNIT_ASSERT(test_valid_ai_ref_err(std::bind(torrent::ai_get_addrinfo, "1.1.1.300", nullptr, nullptr, std::placeholders::_1), EAI_NONAME)); | ||
| 6408 | + CPPUNIT_ASSERT(test_valid_ai_ref_err(std::bind(torrent::ai_get_addrinfo, "2001:db8:a::22123", nullptr, nullptr, std::placeholders::_1), EAI_NONAME)); | ||
| 6409 | +} | ||
| 6410 | + | ||
| 6411 | +void | ||
| 6412 | +test_address_info::test_numericserv() { | ||
| 6413 | + CPPUNIT_ASSERT(test_valid_ai_ref<aif_inet> (std::bind(torrent::ai_get_addrinfo, "1.1.1.1", nullptr, torrent::ai_make_hint(AI_NUMERICHOST, 0, 0).get(), std::placeholders::_1))); | ||
| 6414 | + | ||
| 6415 | + CPPUNIT_ASSERT(test_valid_ai_ref_err(std::bind(torrent::ai_get_addrinfo, "localhost", nullptr, torrent::ai_make_hint(AI_NUMERICHOST, 0, 0).get(), std::placeholders::_1), EAI_NONAME)); | ||
| 6416 | +} | ||
| 6417 | + | ||
| 6418 | +void | ||
| 6419 | +test_address_info::test_helpers() { | ||
| 6420 | + torrent::sin_unique_ptr sin_zero = torrent::sin_from_sa(wrap_ai_get_first_sa("0.0.0.0")); | ||
| 6421 | + CPPUNIT_ASSERT(sin_zero != nullptr); | ||
| 6422 | + CPPUNIT_ASSERT(sin_zero->sin_family == AF_INET); | ||
| 6423 | + CPPUNIT_ASSERT(sin_zero->sin_port == 0); | ||
| 6424 | + CPPUNIT_ASSERT(sin_zero->sin_addr.s_addr == in_addr().s_addr); | ||
| 6425 | + | ||
| 6426 | + torrent::sin_unique_ptr sin_1 = torrent::sin_from_sa(wrap_ai_get_first_sa("1.2.3.4")); | ||
| 6427 | + CPPUNIT_ASSERT(sin_1 != nullptr); | ||
| 6428 | + CPPUNIT_ASSERT(sin_1->sin_family == AF_INET); | ||
| 6429 | + CPPUNIT_ASSERT(sin_1->sin_port == 0); | ||
| 6430 | + CPPUNIT_ASSERT(sin_1->sin_addr.s_addr == htonl(0x01020304)); | ||
| 6431 | + | ||
| 6432 | + torrent::sin6_unique_ptr sin6_zero = torrent::sin6_from_sa(wrap_ai_get_first_sa("::")); | ||
| 6433 | + CPPUNIT_ASSERT(sin6_zero != nullptr); | ||
| 6434 | + CPPUNIT_ASSERT(sin6_zero->sin6_family == AF_INET6); | ||
| 6435 | + CPPUNIT_ASSERT(sin6_zero->sin6_port == 0); | ||
| 6436 | + CPPUNIT_ASSERT(compare_sin6_addr(sin6_zero->sin6_addr, in6_addr{0})); | ||
| 6437 | + | ||
| 6438 | + torrent::sin6_unique_ptr sin6_1 = torrent::sin6_from_sa(wrap_ai_get_first_sa("ff01::1")); | ||
| 6439 | + CPPUNIT_ASSERT(sin6_1 != nullptr); | ||
| 6440 | + CPPUNIT_ASSERT(sin6_1->sin6_family == AF_INET6); | ||
| 6441 | + CPPUNIT_ASSERT(sin6_1->sin6_port == 0); | ||
| 6442 | + CPPUNIT_ASSERT(compare_sin6_addr(sin6_1->sin6_addr, in6_addr{0xff, 0x01, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1})); | ||
| 6443 | + CPPUNIT_ASSERT(!compare_sin6_addr(sin6_1->sin6_addr, in6_addr{0xff, 0x01, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2})); | ||
| 6444 | +} | ||
| 6445 | diff --git a/test/torrent/net/test_address_info.h b/test/torrent/net/test_address_info.h | ||
| 6446 | new file mode 100644 | ||
| 6447 | index 00000000..c2ce9188 | ||
| 6448 | --- /dev/null | ||
| 6449 | +++ b/test/torrent/net/test_address_info.h | ||
| 6450 | @@ -0,0 +1,19 @@ | ||
| 6451 | +#include <cppunit/extensions/HelperMacros.h> | ||
| 6452 | + | ||
| 6453 | +class test_address_info : public CppUnit::TestFixture { | ||
| 6454 | + CPPUNIT_TEST_SUITE(test_address_info); | ||
| 6455 | + | ||
| 6456 | + CPPUNIT_TEST(test_basic); | ||
| 6457 | + CPPUNIT_TEST(test_numericserv); | ||
| 6458 | + CPPUNIT_TEST(test_helpers); | ||
| 6459 | + | ||
| 6460 | + CPPUNIT_TEST_SUITE_END(); | ||
| 6461 | + | ||
| 6462 | +public: | ||
| 6463 | + void setUp() {} | ||
| 6464 | + void tearDown() {} | ||
| 6465 | + | ||
| 6466 | + void test_basic(); | ||
| 6467 | + void test_numericserv(); | ||
| 6468 | + void test_helpers(); | ||
| 6469 | +}; | ||
| 6470 | diff --git a/test/torrent/net/test_fd.cc b/test/torrent/net/test_fd.cc | ||
| 6471 | new file mode 100644 | ||
| 6472 | index 00000000..3cab0c5e | ||
| 6473 | --- /dev/null | ||
| 6474 | +++ b/test/torrent/net/test_fd.cc | ||
| 6475 | @@ -0,0 +1,24 @@ | ||
| 6476 | +#include "config.h" | ||
| 6477 | + | ||
| 6478 | +#include "test_fd.h" | ||
| 6479 | + | ||
| 6480 | +#include <torrent/net/fd.h> | ||
| 6481 | + | ||
| 6482 | +CPPUNIT_TEST_SUITE_NAMED_REGISTRATION(test_fd, "torrent/net"); | ||
| 6483 | + | ||
| 6484 | +void | ||
| 6485 | +test_fd::test_valid_flags() { | ||
| 6486 | + CPPUNIT_ASSERT(torrent::fd_valid_flags(torrent::fd_flag_stream)); | ||
| 6487 | + CPPUNIT_ASSERT(torrent::fd_valid_flags(torrent::fd_flag_stream | torrent::fd_flag_nonblock)); | ||
| 6488 | + CPPUNIT_ASSERT(torrent::fd_valid_flags(torrent::fd_flag_stream | torrent::fd_flag_reuse_address)); | ||
| 6489 | + CPPUNIT_ASSERT(torrent::fd_valid_flags(torrent::fd_flag_stream | torrent::fd_flag_v4only)); | ||
| 6490 | + CPPUNIT_ASSERT(torrent::fd_valid_flags(torrent::fd_flag_stream | torrent::fd_flag_v6only)); | ||
| 6491 | + | ||
| 6492 | + CPPUNIT_ASSERT(!torrent::fd_valid_flags(torrent::fd_flag_v4only | torrent::fd_flag_v6only)); | ||
| 6493 | + CPPUNIT_ASSERT(!torrent::fd_valid_flags(torrent::fd_flag_stream | torrent::fd_flag_v4only | torrent::fd_flag_v6only)); | ||
| 6494 | + | ||
| 6495 | + CPPUNIT_ASSERT(!torrent::fd_valid_flags(torrent::fd_flags())); | ||
| 6496 | + CPPUNIT_ASSERT(!torrent::fd_valid_flags(torrent::fd_flags(~torrent::fd_flag_all))); | ||
| 6497 | + CPPUNIT_ASSERT(!torrent::fd_valid_flags(torrent::fd_flags(torrent::fd_flag_stream | ~torrent::fd_flag_all))); | ||
| 6498 | + CPPUNIT_ASSERT(!torrent::fd_valid_flags(torrent::fd_flags(0x3245132))); | ||
| 6499 | +} | ||
| 6500 | diff --git a/test/torrent/net/test_fd.h b/test/torrent/net/test_fd.h | ||
| 6501 | new file mode 100644 | ||
| 6502 | index 00000000..6ba718fc | ||
| 6503 | --- /dev/null | ||
| 6504 | +++ b/test/torrent/net/test_fd.h | ||
| 6505 | @@ -0,0 +1,12 @@ | ||
| 6506 | +#include "helpers/test_fixture.h" | ||
| 6507 | + | ||
| 6508 | +class test_fd : public test_fixture { | ||
| 6509 | + CPPUNIT_TEST_SUITE(test_fd); | ||
| 6510 | + | ||
| 6511 | + CPPUNIT_TEST(test_valid_flags); | ||
| 6512 | + | ||
| 6513 | + CPPUNIT_TEST_SUITE_END(); | ||
| 6514 | + | ||
| 6515 | +public: | ||
| 6516 | + void test_valid_flags(); | ||
| 6517 | +}; | ||
| 6518 | diff --git a/test/torrent/net/test_socket_address.cc b/test/torrent/net/test_socket_address.cc | ||
| 6519 | new file mode 100644 | ||
| 6520 | index 00000000..8a1b0c8a | ||
| 6521 | --- /dev/null | ||
| 6522 | +++ b/test/torrent/net/test_socket_address.cc | ||
| 6523 | @@ -0,0 +1,383 @@ | ||
| 6524 | +#include "config.h" | ||
| 6525 | + | ||
| 6526 | +#include "test_socket_address.h" | ||
| 6527 | + | ||
| 6528 | +#include "helpers/network.h" | ||
| 6529 | +#include "torrent/exceptions.h" | ||
| 6530 | +#include "torrent/net/socket_address.h" | ||
| 6531 | + | ||
| 6532 | +CPPUNIT_TEST_SUITE_NAMED_REGISTRATION(test_socket_address, "torrent/net"); | ||
| 6533 | + | ||
| 6534 | +void | ||
| 6535 | +test_socket_address::test_sa_is_any() { | ||
| 6536 | + TEST_DEFAULT_SA; | ||
| 6537 | + | ||
| 6538 | + CPPUNIT_ASSERT(torrent::sap_is_any(sin_any)); | ||
| 6539 | + CPPUNIT_ASSERT(torrent::sap_is_any(sin_any_5000)); | ||
| 6540 | + CPPUNIT_ASSERT(torrent::sap_is_any(sin6_v4_any)); | ||
| 6541 | + CPPUNIT_ASSERT(torrent::sap_is_any(sin6_v4_any_5000)); | ||
| 6542 | + | ||
| 6543 | + CPPUNIT_ASSERT(!torrent::sap_is_any(sin_bc)); | ||
| 6544 | + CPPUNIT_ASSERT(!torrent::sap_is_any(sin_1)); | ||
| 6545 | + CPPUNIT_ASSERT(!torrent::sap_is_any(sin6_1)); | ||
| 6546 | + CPPUNIT_ASSERT(!torrent::sap_is_any(sin_bc_5000)); | ||
| 6547 | + CPPUNIT_ASSERT(!torrent::sap_is_any(sin_1_5000)); | ||
| 6548 | + CPPUNIT_ASSERT(!torrent::sap_is_any(sin6_1_5000)); | ||
| 6549 | + | ||
| 6550 | + CPPUNIT_ASSERT(!torrent::sap_is_any(c_sin_bc)); | ||
| 6551 | + CPPUNIT_ASSERT(!torrent::sap_is_any(c_sin_1)); | ||
| 6552 | + CPPUNIT_ASSERT(!torrent::sap_is_any(c_sin6_1)); | ||
| 6553 | + CPPUNIT_ASSERT(!torrent::sap_is_any(c_sin_bc_5000)); | ||
| 6554 | + CPPUNIT_ASSERT(!torrent::sap_is_any(c_sin_1_5000)); | ||
| 6555 | + CPPUNIT_ASSERT(!torrent::sap_is_any(c_sin6_1_5000)); | ||
| 6556 | +} | ||
| 6557 | + | ||
| 6558 | +void | ||
| 6559 | +test_socket_address::test_sa_is_broadcast() { | ||
| 6560 | + TEST_DEFAULT_SA; | ||
| 6561 | + | ||
| 6562 | + CPPUNIT_ASSERT(torrent::sap_is_broadcast(sin_bc)); | ||
| 6563 | + CPPUNIT_ASSERT(torrent::sap_is_broadcast(sin_bc_5000)); | ||
| 6564 | + CPPUNIT_ASSERT(torrent::sap_is_broadcast(sin6_v4_bc)); | ||
| 6565 | + CPPUNIT_ASSERT(torrent::sap_is_broadcast(sin6_v4_bc_5000)); | ||
| 6566 | + | ||
| 6567 | + CPPUNIT_ASSERT(!torrent::sap_is_broadcast(sin_any)); | ||
| 6568 | + CPPUNIT_ASSERT(!torrent::sap_is_broadcast(sin_1)); | ||
| 6569 | + CPPUNIT_ASSERT(!torrent::sap_is_broadcast(sin6_any)); | ||
| 6570 | + CPPUNIT_ASSERT(!torrent::sap_is_broadcast(sin6_1)); | ||
| 6571 | + CPPUNIT_ASSERT(!torrent::sap_is_broadcast(sin_any_5000)); | ||
| 6572 | + CPPUNIT_ASSERT(!torrent::sap_is_broadcast(sin_1_5000)); | ||
| 6573 | + CPPUNIT_ASSERT(!torrent::sap_is_broadcast(sin6_any_5000)); | ||
| 6574 | + CPPUNIT_ASSERT(!torrent::sap_is_broadcast(sin6_1_5000)); | ||
| 6575 | + | ||
| 6576 | + CPPUNIT_ASSERT(!torrent::sap_is_broadcast(c_sin_any)); | ||
| 6577 | + CPPUNIT_ASSERT(!torrent::sap_is_broadcast(c_sin_1)); | ||
| 6578 | + CPPUNIT_ASSERT(!torrent::sap_is_broadcast(c_sin6_any)); | ||
| 6579 | + CPPUNIT_ASSERT(!torrent::sap_is_broadcast(c_sin6_1)); | ||
| 6580 | + CPPUNIT_ASSERT(!torrent::sap_is_broadcast(c_sin_any_5000)); | ||
| 6581 | + CPPUNIT_ASSERT(!torrent::sap_is_broadcast(c_sin_1_5000)); | ||
| 6582 | + CPPUNIT_ASSERT(!torrent::sap_is_broadcast(c_sin6_any_5000)); | ||
| 6583 | + CPPUNIT_ASSERT(!torrent::sap_is_broadcast(c_sin6_1_5000)); | ||
| 6584 | +} | ||
| 6585 | + | ||
| 6586 | +void | ||
| 6587 | +test_socket_address::test_make() { | ||
| 6588 | + torrent::sa_unique_ptr sa_unspec = torrent::sa_make_unspec(); | ||
| 6589 | + CPPUNIT_ASSERT(sa_unspec != nullptr); | ||
| 6590 | + CPPUNIT_ASSERT(sa_unspec->sa_family == AF_UNSPEC); | ||
| 6591 | + | ||
| 6592 | + torrent::sa_unique_ptr sa_inet = torrent::sa_make_inet(); | ||
| 6593 | + CPPUNIT_ASSERT(sa_inet != nullptr); | ||
| 6594 | + CPPUNIT_ASSERT(sa_inet->sa_family == AF_INET); | ||
| 6595 | + | ||
| 6596 | + sockaddr_in* sin_inet = reinterpret_cast<sockaddr_in*>(sa_inet.get()); | ||
| 6597 | + CPPUNIT_ASSERT(sin_inet->sin_family == AF_INET); | ||
| 6598 | + CPPUNIT_ASSERT(sin_inet->sin_port == 0); | ||
| 6599 | + CPPUNIT_ASSERT(sin_inet->sin_addr.s_addr == in_addr().s_addr); | ||
| 6600 | + | ||
| 6601 | + torrent::sa_unique_ptr sa_inet6 = torrent::sa_make_inet6(); | ||
| 6602 | + CPPUNIT_ASSERT(sa_inet6 != nullptr); | ||
| 6603 | + CPPUNIT_ASSERT(sa_inet6->sa_family == AF_INET6); | ||
| 6604 | + | ||
| 6605 | + sockaddr_in6* sin6_inet6 = reinterpret_cast<sockaddr_in6*>(sa_inet6.get()); | ||
| 6606 | + CPPUNIT_ASSERT(sin6_inet6->sin6_family == AF_INET6); | ||
| 6607 | + CPPUNIT_ASSERT(sin6_inet6->sin6_port == 0); | ||
| 6608 | + CPPUNIT_ASSERT(sin6_inet6->sin6_flowinfo == 0); | ||
| 6609 | + CPPUNIT_ASSERT(compare_sin6_addr(sin6_inet6->sin6_addr, in6_addr{0})); | ||
| 6610 | + CPPUNIT_ASSERT(sin6_inet6->sin6_scope_id == 0); | ||
| 6611 | + | ||
| 6612 | + torrent::sa_unique_ptr sa_unix = torrent::sa_make_unix(""); | ||
| 6613 | + CPPUNIT_ASSERT(sa_unix != nullptr); | ||
| 6614 | + CPPUNIT_ASSERT(sa_unix->sa_family == AF_UNIX); | ||
| 6615 | +} | ||
| 6616 | + | ||
| 6617 | +void | ||
| 6618 | +test_socket_address::test_sin_from_sa() { | ||
| 6619 | + torrent::sa_unique_ptr sa_zero = wrap_ai_get_first_sa("0.0.0.0"); | ||
| 6620 | + torrent::sin_unique_ptr sin_zero; | ||
| 6621 | + | ||
| 6622 | + CPPUNIT_ASSERT(sa_zero != nullptr); | ||
| 6623 | + CPPUNIT_ASSERT_NO_THROW({ sin_zero = torrent::sin_from_sa(std::move(sa_zero)); }); | ||
| 6624 | + CPPUNIT_ASSERT(sa_zero == nullptr); | ||
| 6625 | + CPPUNIT_ASSERT(sin_zero != nullptr); | ||
| 6626 | + | ||
| 6627 | + CPPUNIT_ASSERT(sin_zero->sin_addr.s_addr == htonl(0x0)); | ||
| 6628 | + | ||
| 6629 | + torrent::sa_unique_ptr sa_inet = wrap_ai_get_first_sa("1.2.3.4"); | ||
| 6630 | + torrent::sin_unique_ptr sin_inet; | ||
| 6631 | + | ||
| 6632 | + CPPUNIT_ASSERT(sa_inet != nullptr); | ||
| 6633 | + CPPUNIT_ASSERT_NO_THROW({ sin_inet = torrent::sin_from_sa(std::move(sa_inet)); }); | ||
| 6634 | + CPPUNIT_ASSERT(sa_inet == nullptr); | ||
| 6635 | + CPPUNIT_ASSERT(sin_inet != nullptr); | ||
| 6636 | + | ||
| 6637 | + CPPUNIT_ASSERT(sin_inet->sin_addr.s_addr == htonl(0x01020304)); | ||
| 6638 | + | ||
| 6639 | + CPPUNIT_ASSERT_THROW(torrent::sin_from_sa(torrent::sa_unique_ptr()), torrent::internal_error); | ||
| 6640 | + CPPUNIT_ASSERT_THROW(torrent::sin_from_sa(torrent::sa_make_unspec()), torrent::internal_error); | ||
| 6641 | + CPPUNIT_ASSERT_THROW(torrent::sin_from_sa(torrent::sa_make_inet6()), torrent::internal_error); | ||
| 6642 | +} | ||
| 6643 | + | ||
| 6644 | +void | ||
| 6645 | +test_socket_address::test_sin6_from_sa() { | ||
| 6646 | + torrent::sa_unique_ptr sa_zero = wrap_ai_get_first_sa("::"); | ||
| 6647 | + torrent::sin6_unique_ptr sin6_zero; | ||
| 6648 | + | ||
| 6649 | + CPPUNIT_ASSERT(sa_zero != nullptr); | ||
| 6650 | + CPPUNIT_ASSERT_NO_THROW({ sin6_zero = torrent::sin6_from_sa(std::move(sa_zero)); }); | ||
| 6651 | + CPPUNIT_ASSERT(sa_zero == nullptr); | ||
| 6652 | + CPPUNIT_ASSERT(sin6_zero != nullptr); | ||
| 6653 | + | ||
| 6654 | + CPPUNIT_ASSERT(sin6_zero->sin6_addr.s6_addr[0] == 0x0); | ||
| 6655 | + CPPUNIT_ASSERT(sin6_zero->sin6_addr.s6_addr[1] == 0x0); | ||
| 6656 | + CPPUNIT_ASSERT(sin6_zero->sin6_addr.s6_addr[15] == 0x0); | ||
| 6657 | + | ||
| 6658 | + torrent::sa_unique_ptr sa_inet6 = wrap_ai_get_first_sa("ff01::1"); | ||
| 6659 | + torrent::sin6_unique_ptr sin6_inet6; | ||
| 6660 | + | ||
| 6661 | + CPPUNIT_ASSERT(sa_inet6 != nullptr); | ||
| 6662 | + CPPUNIT_ASSERT_NO_THROW({ sin6_inet6 = torrent::sin6_from_sa(std::move(sa_inet6)); }); | ||
| 6663 | + CPPUNIT_ASSERT(sa_inet6 == nullptr); | ||
| 6664 | + CPPUNIT_ASSERT(sin6_inet6 != nullptr); | ||
| 6665 | + | ||
| 6666 | + CPPUNIT_ASSERT(sin6_inet6->sin6_addr.s6_addr[0] == 0xff); | ||
| 6667 | + CPPUNIT_ASSERT(sin6_inet6->sin6_addr.s6_addr[1] == 0x01); | ||
| 6668 | + CPPUNIT_ASSERT(sin6_inet6->sin6_addr.s6_addr[15] == 0x01); | ||
| 6669 | + | ||
| 6670 | + CPPUNIT_ASSERT_THROW(torrent::sin6_from_sa(torrent::sa_unique_ptr()), torrent::internal_error); | ||
| 6671 | + CPPUNIT_ASSERT_THROW(torrent::sin6_from_sa(torrent::sa_make_unspec()), torrent::internal_error); | ||
| 6672 | + CPPUNIT_ASSERT_THROW(torrent::sin6_from_sa(torrent::sa_make_inet()), torrent::internal_error); | ||
| 6673 | +} | ||
| 6674 | + | ||
| 6675 | +void | ||
| 6676 | +test_socket_address::test_sa_equal() { | ||
| 6677 | + TEST_DEFAULT_SA; | ||
| 6678 | + | ||
| 6679 | + CPPUNIT_ASSERT(torrent::sap_equal(torrent::sa_make_unspec(), torrent::sa_make_unspec())); | ||
| 6680 | + CPPUNIT_ASSERT(torrent::sap_equal(torrent::sa_make_inet(), torrent::sa_make_inet())); | ||
| 6681 | + CPPUNIT_ASSERT(torrent::sap_equal(torrent::sa_make_inet6(), torrent::sa_make_inet6())); | ||
| 6682 | + | ||
| 6683 | + CPPUNIT_ASSERT(!torrent::sap_equal(torrent::sa_make_unspec(), torrent::sa_make_inet())); | ||
| 6684 | + CPPUNIT_ASSERT(!torrent::sap_equal(torrent::sa_make_unspec(), torrent::sa_make_inet6())); | ||
| 6685 | + CPPUNIT_ASSERT(!torrent::sap_equal(torrent::sa_make_inet(), torrent::sa_make_inet6())); | ||
| 6686 | + CPPUNIT_ASSERT(!torrent::sap_equal(torrent::sa_make_inet6(), torrent::sa_make_inet())); | ||
| 6687 | + | ||
| 6688 | + CPPUNIT_ASSERT(torrent::sap_equal(sin_1, sin_1)); | ||
| 6689 | + CPPUNIT_ASSERT(torrent::sap_equal(sin_1, c_sin_1)); | ||
| 6690 | + CPPUNIT_ASSERT(torrent::sap_equal(c_sin_1, sin_1)); | ||
| 6691 | + CPPUNIT_ASSERT(torrent::sap_equal(c_sin_1, c_sin_1)); | ||
| 6692 | + | ||
| 6693 | + CPPUNIT_ASSERT(!torrent::sap_equal(sin_1, sin_2)); | ||
| 6694 | + CPPUNIT_ASSERT(!torrent::sap_equal(sin_1, c_sin_2)); | ||
| 6695 | + CPPUNIT_ASSERT(!torrent::sap_equal(c_sin_1, sin_2)); | ||
| 6696 | + CPPUNIT_ASSERT(!torrent::sap_equal(c_sin_1, c_sin_2)); | ||
| 6697 | + | ||
| 6698 | + CPPUNIT_ASSERT(torrent::sap_equal(sin6_1, sin6_1)); | ||
| 6699 | + CPPUNIT_ASSERT(torrent::sap_equal(sin6_1, c_sin6_1)); | ||
| 6700 | + CPPUNIT_ASSERT(torrent::sap_equal(c_sin6_1, sin6_1)); | ||
| 6701 | + CPPUNIT_ASSERT(torrent::sap_equal(c_sin6_1, c_sin6_1)); | ||
| 6702 | + | ||
| 6703 | + CPPUNIT_ASSERT(!torrent::sap_equal(sin6_1, sin6_2)); | ||
| 6704 | + CPPUNIT_ASSERT(!torrent::sap_equal(sin6_1, c_sin6_2)); | ||
| 6705 | + CPPUNIT_ASSERT(!torrent::sap_equal(c_sin6_1, sin6_2)); | ||
| 6706 | + CPPUNIT_ASSERT(!torrent::sap_equal(c_sin6_1, c_sin6_2)); | ||
| 6707 | + | ||
| 6708 | + CPPUNIT_ASSERT(torrent::sap_equal(sin_1_5000, sin_1_5000)); | ||
| 6709 | + CPPUNIT_ASSERT(torrent::sap_equal(sin6_1_5000, sin6_1_5000)); | ||
| 6710 | + CPPUNIT_ASSERT(!torrent::sap_equal(sin_1_5000, sin_1_5100)); | ||
| 6711 | + CPPUNIT_ASSERT(!torrent::sap_equal(sin6_1_5000, sin6_1_5100)); | ||
| 6712 | + CPPUNIT_ASSERT(!torrent::sap_equal(sin_1_5000, sin_2_5000)); | ||
| 6713 | + CPPUNIT_ASSERT(!torrent::sap_equal(sin6_1_5000, sin6_2_5000)); | ||
| 6714 | + CPPUNIT_ASSERT(!torrent::sap_equal(sin_1_5000, sin_2_5100)); | ||
| 6715 | + CPPUNIT_ASSERT(!torrent::sap_equal(sin6_1_5000, sin6_2_5100)); | ||
| 6716 | + | ||
| 6717 | + CPPUNIT_ASSERT_THROW(torrent::sap_equal(torrent::sa_make_unix(""), torrent::sa_make_unix("")), torrent::internal_error); | ||
| 6718 | + CPPUNIT_ASSERT_THROW(torrent::sap_equal(torrent::sa_make_unix(""), sin6_1), torrent::internal_error); | ||
| 6719 | + CPPUNIT_ASSERT_THROW(torrent::sap_equal(sin6_1, torrent::sa_make_unix("")), torrent::internal_error); | ||
| 6720 | +} | ||
| 6721 | + | ||
| 6722 | +void | ||
| 6723 | +test_socket_address::test_sa_equal_addr() { | ||
| 6724 | + TEST_DEFAULT_SA; | ||
| 6725 | + | ||
| 6726 | + CPPUNIT_ASSERT(torrent::sap_equal_addr(torrent::sa_make_unspec(), torrent::sa_make_unspec())); | ||
| 6727 | + CPPUNIT_ASSERT(torrent::sap_equal_addr(torrent::sa_make_inet(), torrent::sa_make_inet())); | ||
| 6728 | + CPPUNIT_ASSERT(torrent::sap_equal_addr(torrent::sa_make_inet6(), torrent::sa_make_inet6())); | ||
| 6729 | + | ||
| 6730 | + CPPUNIT_ASSERT(!torrent::sap_equal_addr(torrent::sa_make_unspec(), torrent::sa_make_inet())); | ||
| 6731 | + CPPUNIT_ASSERT(!torrent::sap_equal_addr(torrent::sa_make_unspec(), torrent::sa_make_inet6())); | ||
| 6732 | + CPPUNIT_ASSERT(!torrent::sap_equal_addr(torrent::sa_make_inet(), torrent::sa_make_inet6())); | ||
| 6733 | + CPPUNIT_ASSERT(!torrent::sap_equal_addr(torrent::sa_make_inet6(), torrent::sa_make_inet())); | ||
| 6734 | + | ||
| 6735 | + CPPUNIT_ASSERT(torrent::sap_equal_addr(sin_1, sin_1)); | ||
| 6736 | + CPPUNIT_ASSERT(torrent::sap_equal_addr(sin_1, c_sin_1)); | ||
| 6737 | + CPPUNIT_ASSERT(torrent::sap_equal_addr(c_sin_1, sin_1)); | ||
| 6738 | + CPPUNIT_ASSERT(torrent::sap_equal_addr(c_sin_1, c_sin_1)); | ||
| 6739 | + | ||
| 6740 | + CPPUNIT_ASSERT(!torrent::sap_equal_addr(sin_1, sin_2)); | ||
| 6741 | + CPPUNIT_ASSERT(!torrent::sap_equal_addr(sin_1, c_sin_2)); | ||
| 6742 | + CPPUNIT_ASSERT(!torrent::sap_equal_addr(c_sin_1, sin_2)); | ||
| 6743 | + CPPUNIT_ASSERT(!torrent::sap_equal_addr(c_sin_1, c_sin_2)); | ||
| 6744 | + | ||
| 6745 | + CPPUNIT_ASSERT(torrent::sap_equal_addr(sin6_1, sin6_1)); | ||
| 6746 | + CPPUNIT_ASSERT(torrent::sap_equal_addr(sin6_1, c_sin6_1)); | ||
| 6747 | + CPPUNIT_ASSERT(torrent::sap_equal_addr(c_sin6_1, sin6_1)); | ||
| 6748 | + CPPUNIT_ASSERT(torrent::sap_equal_addr(c_sin6_1, c_sin6_1)); | ||
| 6749 | + | ||
| 6750 | + CPPUNIT_ASSERT(!torrent::sap_equal_addr(sin6_1, sin6_2)); | ||
| 6751 | + CPPUNIT_ASSERT(!torrent::sap_equal_addr(sin6_1, c_sin6_2)); | ||
| 6752 | + CPPUNIT_ASSERT(!torrent::sap_equal_addr(c_sin6_1, sin6_2)); | ||
| 6753 | + CPPUNIT_ASSERT(!torrent::sap_equal_addr(c_sin6_1, c_sin6_2)); | ||
| 6754 | + | ||
| 6755 | + CPPUNIT_ASSERT(torrent::sap_equal_addr(sin_1_5000, sin_1_5000)); | ||
| 6756 | + CPPUNIT_ASSERT(torrent::sap_equal_addr(sin6_1_5000, sin6_1_5000)); | ||
| 6757 | + CPPUNIT_ASSERT(torrent::sap_equal_addr(sin_1_5000, sin_1_5100)); | ||
| 6758 | + CPPUNIT_ASSERT(torrent::sap_equal_addr(sin6_1_5000, sin6_1_5100)); | ||
| 6759 | + CPPUNIT_ASSERT(!torrent::sap_equal_addr(sin_1_5000, sin_2_5000)); | ||
| 6760 | + CPPUNIT_ASSERT(!torrent::sap_equal_addr(sin6_1_5000, sin6_2_5000)); | ||
| 6761 | + CPPUNIT_ASSERT(!torrent::sap_equal_addr(sin_1_5000, sin_2_5100)); | ||
| 6762 | + CPPUNIT_ASSERT(!torrent::sap_equal_addr(sin6_1_5000, sin6_2_5100)); | ||
| 6763 | + | ||
| 6764 | + CPPUNIT_ASSERT_THROW(torrent::sap_equal_addr(torrent::sa_make_unix(""), torrent::sa_make_unix("")), torrent::internal_error); | ||
| 6765 | + CPPUNIT_ASSERT_THROW(torrent::sap_equal_addr(torrent::sa_make_unix(""), sin6_1), torrent::internal_error); | ||
| 6766 | + CPPUNIT_ASSERT_THROW(torrent::sap_equal_addr(sin6_1, torrent::sa_make_unix("")), torrent::internal_error); | ||
| 6767 | +} | ||
| 6768 | + | ||
| 6769 | +void | ||
| 6770 | +test_socket_address::test_sa_copy() { | ||
| 6771 | + TEST_DEFAULT_SA; | ||
| 6772 | + | ||
| 6773 | + CPPUNIT_ASSERT(torrent::sap_equal(torrent::sap_copy(torrent::sa_make_unspec()), torrent::sa_make_unspec())); | ||
| 6774 | + CPPUNIT_ASSERT(torrent::sap_equal(torrent::sap_copy(torrent::sa_make_inet()), sin_any)); | ||
| 6775 | + CPPUNIT_ASSERT(torrent::sap_equal(torrent::sap_copy(torrent::sa_make_inet6()), sin6_any)); | ||
| 6776 | + | ||
| 6777 | + CPPUNIT_ASSERT(torrent::sap_copy(sin_1).get() != sin_1.get()); | ||
| 6778 | + CPPUNIT_ASSERT(torrent::sap_copy(c_sin_1).get() != c_sin_1.get()); | ||
| 6779 | + CPPUNIT_ASSERT(torrent::sap_copy(sin6_1).get() != sin6_1.get()); | ||
| 6780 | + CPPUNIT_ASSERT(torrent::sap_copy(c_sin6_1).get() != c_sin6_1.get()); | ||
| 6781 | + CPPUNIT_ASSERT(torrent::sap_copy(sin_1_5000).get() != sin_1_5000.get()); | ||
| 6782 | + CPPUNIT_ASSERT(torrent::sap_copy(sin6_1_5000).get() != sin6_1_5000.get()); | ||
| 6783 | + | ||
| 6784 | + CPPUNIT_ASSERT(torrent::sap_equal(torrent::sap_copy(sin_1), sin_1)); | ||
| 6785 | + CPPUNIT_ASSERT(torrent::sap_equal(torrent::sap_copy(sin_1), c_sin_1)); | ||
| 6786 | + CPPUNIT_ASSERT(torrent::sap_equal(torrent::sap_copy(c_sin_1), sin_1)); | ||
| 6787 | + CPPUNIT_ASSERT(torrent::sap_equal(torrent::sap_copy(c_sin_1), c_sin_1)); | ||
| 6788 | + | ||
| 6789 | + CPPUNIT_ASSERT(torrent::sap_equal(torrent::sap_copy(sin6_1), sin6_1)); | ||
| 6790 | + CPPUNIT_ASSERT(torrent::sap_equal(torrent::sap_copy(sin6_1), c_sin6_1)); | ||
| 6791 | + CPPUNIT_ASSERT(torrent::sap_equal(torrent::sap_copy(c_sin6_1), sin6_1)); | ||
| 6792 | + CPPUNIT_ASSERT(torrent::sap_equal(torrent::sap_copy(c_sin6_1), c_sin6_1)); | ||
| 6793 | + | ||
| 6794 | + CPPUNIT_ASSERT(torrent::sap_equal(torrent::sap_copy(sin_1_5000), sin_1_5000)); | ||
| 6795 | + CPPUNIT_ASSERT(torrent::sap_equal(torrent::sap_copy(sin6_1_5000), sin6_1_5000)); | ||
| 6796 | + | ||
| 6797 | + auto sin6_flags = torrent::sap_copy(sin6_1_5000); | ||
| 6798 | + reinterpret_cast<sockaddr_in6*>(sin6_flags.get())->sin6_flowinfo = 0x12345678; | ||
| 6799 | + reinterpret_cast<sockaddr_in6*>(sin6_flags.get())->sin6_scope_id = 0x12345678; | ||
| 6800 | + | ||
| 6801 | + // TODO: Need 'strict' equal test. | ||
| 6802 | + CPPUNIT_ASSERT(torrent::sap_equal(torrent::sap_copy(sin6_flags), sin6_flags)); | ||
| 6803 | + | ||
| 6804 | + CPPUNIT_ASSERT_THROW(torrent::sap_copy(torrent::sa_unique_ptr()), torrent::internal_error); | ||
| 6805 | + CPPUNIT_ASSERT_THROW(torrent::sap_copy(torrent::c_sa_unique_ptr()), torrent::internal_error); | ||
| 6806 | +} | ||
| 6807 | + | ||
| 6808 | +void | ||
| 6809 | +test_socket_address::test_sa_copy_addr() { | ||
| 6810 | + TEST_DEFAULT_SA; | ||
| 6811 | + | ||
| 6812 | + CPPUNIT_ASSERT(torrent::sap_equal(torrent::sap_copy_addr(torrent::sa_make_unspec()), torrent::sa_make_unspec())); | ||
| 6813 | + CPPUNIT_ASSERT(torrent::sap_equal(torrent::sap_copy_addr(torrent::sa_make_inet()), sin_any)); | ||
| 6814 | + CPPUNIT_ASSERT(torrent::sap_equal(torrent::sap_copy_addr(torrent::sa_make_inet6()), sin6_any)); | ||
| 6815 | + CPPUNIT_ASSERT(torrent::sap_equal(torrent::sap_copy_addr(torrent::sa_make_unspec(), 5000), torrent::sa_make_unspec())); | ||
| 6816 | + CPPUNIT_ASSERT(torrent::sap_equal(torrent::sap_copy_addr(torrent::sa_make_inet(), 5000), sin_any_5000)); | ||
| 6817 | + CPPUNIT_ASSERT(torrent::sap_equal(torrent::sap_copy_addr(torrent::sa_make_inet6(), 5000), sin6_any_5000)); | ||
| 6818 | + | ||
| 6819 | + CPPUNIT_ASSERT(torrent::sap_copy_addr(sin_1).get() != sin_1.get()); | ||
| 6820 | + CPPUNIT_ASSERT(torrent::sap_copy_addr(c_sin_1).get() != c_sin_1.get()); | ||
| 6821 | + CPPUNIT_ASSERT(torrent::sap_copy_addr(sin6_1).get() != sin6_1.get()); | ||
| 6822 | + CPPUNIT_ASSERT(torrent::sap_copy_addr(c_sin6_1).get() != c_sin6_1.get()); | ||
| 6823 | + CPPUNIT_ASSERT(torrent::sap_copy_addr(sin_1_5000).get() != sin_1_5000.get()); | ||
| 6824 | + CPPUNIT_ASSERT(torrent::sap_copy_addr(sin6_1_5000).get() != sin6_1_5000.get()); | ||
| 6825 | + | ||
| 6826 | + CPPUNIT_ASSERT(torrent::sap_equal(torrent::sap_copy_addr(sin_1), sin_1)); | ||
| 6827 | + CPPUNIT_ASSERT(torrent::sap_equal(torrent::sap_copy_addr(sin_1), c_sin_1)); | ||
| 6828 | + CPPUNIT_ASSERT(torrent::sap_equal(torrent::sap_copy_addr(c_sin_1), sin_1)); | ||
| 6829 | + CPPUNIT_ASSERT(torrent::sap_equal(torrent::sap_copy_addr(c_sin_1), c_sin_1)); | ||
| 6830 | + CPPUNIT_ASSERT(torrent::sap_equal(torrent::sap_copy_addr(sin_1, 5000), sin_1_5000)); | ||
| 6831 | + CPPUNIT_ASSERT(torrent::sap_equal(torrent::sap_copy_addr(sin_1, 5000), c_sin_1_5000)); | ||
| 6832 | + CPPUNIT_ASSERT(torrent::sap_equal(torrent::sap_copy_addr(c_sin_1, 5000), sin_1_5000)); | ||
| 6833 | + CPPUNIT_ASSERT(torrent::sap_equal(torrent::sap_copy_addr(c_sin_1, 5000), c_sin_1_5000)); | ||
| 6834 | + | ||
| 6835 | + CPPUNIT_ASSERT(torrent::sap_equal(torrent::sap_copy_addr(sin6_1), sin6_1)); | ||
| 6836 | + CPPUNIT_ASSERT(torrent::sap_equal(torrent::sap_copy_addr(sin6_1), c_sin6_1)); | ||
| 6837 | + CPPUNIT_ASSERT(torrent::sap_equal(torrent::sap_copy_addr(c_sin6_1), sin6_1)); | ||
| 6838 | + CPPUNIT_ASSERT(torrent::sap_equal(torrent::sap_copy_addr(c_sin6_1), c_sin6_1)); | ||
| 6839 | + CPPUNIT_ASSERT(torrent::sap_equal(torrent::sap_copy_addr(sin6_1, 5000), sin6_1_5000)); | ||
| 6840 | + CPPUNIT_ASSERT(torrent::sap_equal(torrent::sap_copy_addr(sin6_1, 5000), c_sin6_1_5000)); | ||
| 6841 | + CPPUNIT_ASSERT(torrent::sap_equal(torrent::sap_copy_addr(c_sin6_1, 5000), sin6_1_5000)); | ||
| 6842 | + CPPUNIT_ASSERT(torrent::sap_equal(torrent::sap_copy_addr(c_sin6_1, 5000), c_sin6_1_5000)); | ||
| 6843 | + | ||
| 6844 | + CPPUNIT_ASSERT(torrent::sap_equal(torrent::sap_copy_addr(sin_1_5000), sin_1)); | ||
| 6845 | + CPPUNIT_ASSERT(torrent::sap_equal(torrent::sap_copy_addr(sin6_1_5000), sin6_1)); | ||
| 6846 | + CPPUNIT_ASSERT(torrent::sap_equal(torrent::sap_copy_addr(sin_1_5000, 5100), sin_1_5100)); | ||
| 6847 | + CPPUNIT_ASSERT(torrent::sap_equal(torrent::sap_copy_addr(sin6_1_5000, 5100), sin6_1_5100)); | ||
| 6848 | + | ||
| 6849 | + auto sin6_flags = wrap_ai_get_first_sa("ff01::1", "5555"); | ||
| 6850 | + reinterpret_cast<sockaddr_in6*>(sin6_flags.get())->sin6_flowinfo = 0x12345678; | ||
| 6851 | + reinterpret_cast<sockaddr_in6*>(sin6_flags.get())->sin6_scope_id = 0x12345678; | ||
| 6852 | + | ||
| 6853 | + CPPUNIT_ASSERT(torrent::sap_equal(torrent::sap_copy_addr(sin6_flags), sin6_1)); | ||
| 6854 | + | ||
| 6855 | + CPPUNIT_ASSERT_THROW(torrent::sap_copy_addr(torrent::sa_unique_ptr()), torrent::internal_error); | ||
| 6856 | + CPPUNIT_ASSERT_THROW(torrent::sap_copy_addr(torrent::c_sa_unique_ptr()), torrent::internal_error); | ||
| 6857 | + CPPUNIT_ASSERT_THROW(torrent::sap_copy_addr(torrent::sa_unique_ptr(), 5000), torrent::internal_error); | ||
| 6858 | + CPPUNIT_ASSERT_THROW(torrent::sap_copy_addr(torrent::c_sa_unique_ptr(), 5000), torrent::internal_error); | ||
| 6859 | +} | ||
| 6860 | + | ||
| 6861 | +void | ||
| 6862 | +test_socket_address::test_sa_from_v4mapped() { | ||
| 6863 | + TEST_DEFAULT_SA; | ||
| 6864 | + | ||
| 6865 | + CPPUNIT_ASSERT(torrent::sap_equal_addr(torrent::sap_from_v4mapped(sin6_v4_any), sin_any)); | ||
| 6866 | + CPPUNIT_ASSERT(torrent::sap_is_port_any(torrent::sap_from_v4mapped(sin6_v4_any))); | ||
| 6867 | + | ||
| 6868 | + CPPUNIT_ASSERT(torrent::sap_equal_addr(torrent::sap_from_v4mapped(sin6_v4_1), sin_1)); | ||
| 6869 | + CPPUNIT_ASSERT(torrent::sap_is_port_any(torrent::sap_from_v4mapped(sin6_v4_1))); | ||
| 6870 | + | ||
| 6871 | + CPPUNIT_ASSERT(torrent::sap_equal_addr(torrent::sap_from_v4mapped(sin6_v4_bc), sin_bc)); | ||
| 6872 | + CPPUNIT_ASSERT(torrent::sap_is_port_any(torrent::sap_from_v4mapped(sin6_v4_bc))); | ||
| 6873 | + | ||
| 6874 | + CPPUNIT_ASSERT_THROW(torrent::sap_from_v4mapped(torrent::sa_make_unspec()), torrent::internal_error); | ||
| 6875 | + CPPUNIT_ASSERT_THROW(torrent::sap_from_v4mapped(torrent::sa_make_inet()), torrent::internal_error); | ||
| 6876 | + CPPUNIT_ASSERT_THROW(torrent::sap_from_v4mapped(torrent::sa_make_unix("")), torrent::internal_error); | ||
| 6877 | + CPPUNIT_ASSERT_THROW(torrent::sap_from_v4mapped(sin_any), torrent::internal_error); | ||
| 6878 | + CPPUNIT_ASSERT_THROW(torrent::sap_from_v4mapped(sin_bc), torrent::internal_error); | ||
| 6879 | + CPPUNIT_ASSERT_THROW(torrent::sap_from_v4mapped(sin_1), torrent::internal_error); | ||
| 6880 | +} | ||
| 6881 | + | ||
| 6882 | +void | ||
| 6883 | +test_socket_address::test_sa_to_v4mapped() { | ||
| 6884 | + TEST_DEFAULT_SA; | ||
| 6885 | + | ||
| 6886 | + CPPUNIT_ASSERT(torrent::sap_equal_addr(torrent::sap_to_v4mapped(sin_any), sin6_v4_any)); | ||
| 6887 | + CPPUNIT_ASSERT(torrent::sap_is_v4mapped(torrent::sap_to_v4mapped(sin_any))); | ||
| 6888 | + CPPUNIT_ASSERT(torrent::sap_is_port_any(torrent::sap_to_v4mapped(sin_any))); | ||
| 6889 | + | ||
| 6890 | + CPPUNIT_ASSERT(torrent::sap_equal_addr(torrent::sap_to_v4mapped(sin_bc), sin6_v4_bc)); | ||
| 6891 | + CPPUNIT_ASSERT(torrent::sap_is_v4mapped(torrent::sap_to_v4mapped(sin_bc))); | ||
| 6892 | + CPPUNIT_ASSERT(torrent::sap_is_port_any(torrent::sap_to_v4mapped(sin_bc))); | ||
| 6893 | + | ||
| 6894 | + CPPUNIT_ASSERT(torrent::sap_equal_addr(torrent::sap_to_v4mapped(sin_1), sin6_v4_1)); | ||
| 6895 | + CPPUNIT_ASSERT(torrent::sap_is_v4mapped(torrent::sap_to_v4mapped(sin_1))); | ||
| 6896 | + CPPUNIT_ASSERT(torrent::sap_is_port_any(torrent::sap_to_v4mapped(sin_1))); | ||
| 6897 | + | ||
| 6898 | + CPPUNIT_ASSERT_THROW(torrent::sap_to_v4mapped(torrent::sa_make_unspec()), torrent::internal_error); | ||
| 6899 | + CPPUNIT_ASSERT_THROW(torrent::sap_to_v4mapped(torrent::sa_make_inet6()), torrent::internal_error); | ||
| 6900 | + CPPUNIT_ASSERT_THROW(torrent::sap_to_v4mapped(torrent::sa_make_unix("")), torrent::internal_error); | ||
| 6901 | + CPPUNIT_ASSERT_THROW(torrent::sap_to_v4mapped(sin6_any), torrent::internal_error); | ||
| 6902 | + CPPUNIT_ASSERT_THROW(torrent::sap_to_v4mapped(sin6_1), torrent::internal_error); | ||
| 6903 | + CPPUNIT_ASSERT_THROW(torrent::sap_to_v4mapped(sin6_v4_any), torrent::internal_error); | ||
| 6904 | + CPPUNIT_ASSERT_THROW(torrent::sap_to_v4mapped(sin6_v4_bc), torrent::internal_error); | ||
| 6905 | + CPPUNIT_ASSERT_THROW(torrent::sap_to_v4mapped(sin6_v4_1), torrent::internal_error); | ||
| 6906 | +} | ||
| 6907 | diff --git a/test/torrent/net/test_socket_address.h b/test/torrent/net/test_socket_address.h | ||
| 6908 | new file mode 100644 | ||
| 6909 | index 00000000..6157f366 | ||
| 6910 | --- /dev/null | ||
| 6911 | +++ b/test/torrent/net/test_socket_address.h | ||
| 6912 | @@ -0,0 +1,43 @@ | ||
| 6913 | +#include <cppunit/extensions/HelperMacros.h> | ||
| 6914 | + | ||
| 6915 | +class test_socket_address : public CppUnit::TestFixture { | ||
| 6916 | + CPPUNIT_TEST_SUITE(test_socket_address); | ||
| 6917 | + | ||
| 6918 | + CPPUNIT_TEST(test_sa_is_any); | ||
| 6919 | + CPPUNIT_TEST(test_sa_is_broadcast); | ||
| 6920 | + | ||
| 6921 | + CPPUNIT_TEST(test_make); | ||
| 6922 | + | ||
| 6923 | + CPPUNIT_TEST(test_sin_from_sa); | ||
| 6924 | + CPPUNIT_TEST(test_sin6_from_sa); | ||
| 6925 | + | ||
| 6926 | + CPPUNIT_TEST(test_sa_equal); | ||
| 6927 | + CPPUNIT_TEST(test_sa_equal_addr); | ||
| 6928 | + CPPUNIT_TEST(test_sa_copy); | ||
| 6929 | + CPPUNIT_TEST(test_sa_copy_addr); | ||
| 6930 | + | ||
| 6931 | + CPPUNIT_TEST(test_sa_from_v4mapped); | ||
| 6932 | + CPPUNIT_TEST(test_sa_to_v4mapped); | ||
| 6933 | + | ||
| 6934 | + CPPUNIT_TEST_SUITE_END(); | ||
| 6935 | + | ||
| 6936 | +public: | ||
| 6937 | + void setUp() {} | ||
| 6938 | + void tearDown() {} | ||
| 6939 | + | ||
| 6940 | + void test_sa_is_any(); | ||
| 6941 | + void test_sa_is_broadcast(); | ||
| 6942 | + | ||
| 6943 | + void test_make(); | ||
| 6944 | + | ||
| 6945 | + void test_sin_from_sa(); | ||
| 6946 | + void test_sin6_from_sa(); | ||
| 6947 | + | ||
| 6948 | + void test_sa_equal(); | ||
| 6949 | + void test_sa_equal_addr(); | ||
| 6950 | + void test_sa_copy(); | ||
| 6951 | + void test_sa_copy_addr(); | ||
| 6952 | + | ||
| 6953 | + void test_sa_from_v4mapped(); | ||
| 6954 | + void test_sa_to_v4mapped(); | ||
| 6955 | +}; | ||
| 6956 | diff --git a/test/torrent/net/test_socket_address_key.cc b/test/torrent/net/test_socket_address_key.cc | ||
| 6957 | deleted file mode 100644 | ||
| 6958 | index 7892e730..00000000 | ||
| 6959 | --- a/test/torrent/net/test_socket_address_key.cc | ||
| 6960 | +++ /dev/null | ||
| 6961 | @@ -1,87 +0,0 @@ | ||
| 6962 | -#include "config.h" | ||
| 6963 | - | ||
| 6964 | -#include lt_tr1_functional | ||
| 6965 | -#include <sys/types.h> | ||
| 6966 | -#include <sys/socket.h> | ||
| 6967 | - | ||
| 6968 | -#include "test_socket_address_key.h" | ||
| 6969 | - | ||
| 6970 | -#include "torrent/utils/net.h" | ||
| 6971 | -#include "torrent/net/socket_address_key.h" | ||
| 6972 | - | ||
| 6973 | -CPPUNIT_TEST_SUITE_REGISTRATION(test_socket_address_key); | ||
| 6974 | - | ||
| 6975 | -// TODO: Move into a test utilities header: | ||
| 6976 | - | ||
| 6977 | -typedef std::function<struct addrinfo* ()> addrinfo_ftor; | ||
| 6978 | - | ||
| 6979 | -static torrent::socket_address_key | ||
| 6980 | -test_create_valid(const char* hostname, addrinfo_ftor ftor) { | ||
| 6981 | - struct addrinfo* addr_info; | ||
| 6982 | - | ||
| 6983 | - try { | ||
| 6984 | - addr_info = ftor(); | ||
| 6985 | - } catch (torrent::address_info_error& e) { | ||
| 6986 | - CPPUNIT_ASSERT_MESSAGE("Caught address_info_error for '" + std::string(hostname) + "'", false); | ||
| 6987 | - } | ||
| 6988 | - | ||
| 6989 | - CPPUNIT_ASSERT_MESSAGE("test_create_valid could not find '" + std::string(hostname) + "'", | ||
| 6990 | - addr_info != NULL); | ||
| 6991 | - | ||
| 6992 | - torrent::socket_address_key sock_key = torrent::socket_address_key::from_sockaddr(addr_info->ai_addr); | ||
| 6993 | - | ||
| 6994 | - CPPUNIT_ASSERT_MESSAGE("test_create_valid failed to create valid socket_address_key for '" + std::string(hostname) + "'", | ||
| 6995 | - sock_key.is_valid()); | ||
| 6996 | - | ||
| 6997 | - return sock_key; | ||
| 6998 | -} | ||
| 6999 | - | ||
| 7000 | -static bool | ||
| 7001 | -test_create_throws(const char* hostname, addrinfo_ftor ftor) { | ||
| 7002 | - try { | ||
| 7003 | - ftor(); | ||
| 7004 | - | ||
| 7005 | - return false; | ||
| 7006 | - } catch (torrent::address_info_error& e) { | ||
| 7007 | - return true; | ||
| 7008 | - } | ||
| 7009 | -} | ||
| 7010 | - | ||
| 7011 | -static torrent::socket_address_key | ||
| 7012 | -test_create_inet(const char* hostname) { | ||
| 7013 | - return test_create_valid(hostname, std::bind(&torrent::address_info_lookup, hostname, AF_INET, 0)); | ||
| 7014 | -} | ||
| 7015 | - | ||
| 7016 | -static bool | ||
| 7017 | -test_create_inet_throws(const char* hostname) { | ||
| 7018 | - return test_create_throws(hostname, std::bind(&torrent::address_info_lookup, hostname, AF_INET, 0)); | ||
| 7019 | -} | ||
| 7020 | - | ||
| 7021 | -static torrent::socket_address_key | ||
| 7022 | -test_create_inet6(const char* hostname) { | ||
| 7023 | - return test_create_valid(hostname, std::bind(&torrent::address_info_lookup, hostname, AF_INET6, 0)); | ||
| 7024 | -} | ||
| 7025 | - | ||
| 7026 | -static bool | ||
| 7027 | -test_create_inet6_throws(const char* hostname) { | ||
| 7028 | - return test_create_throws(hostname, std::bind(&torrent::address_info_lookup, hostname, AF_INET6, 0)); | ||
| 7029 | -} | ||
| 7030 | - | ||
| 7031 | -// | ||
| 7032 | -// Basic tests: | ||
| 7033 | -// | ||
| 7034 | - | ||
| 7035 | -void | ||
| 7036 | -test_socket_address_key::test_basic() { | ||
| 7037 | - CPPUNIT_ASSERT(test_create_inet("1.1.1.1").is_valid()); | ||
| 7038 | - CPPUNIT_ASSERT(test_create_inet_throws("1.1.1.300")); | ||
| 7039 | - | ||
| 7040 | - CPPUNIT_ASSERT(test_create_inet6("ff01::1").is_valid()); | ||
| 7041 | - CPPUNIT_ASSERT(test_create_inet6("2001:0db8:85a3:0000:0000:8a2e:0370:7334").is_valid()); | ||
| 7042 | - CPPUNIT_ASSERT(test_create_inet6("2001:db8:a::123").is_valid()); | ||
| 7043 | - | ||
| 7044 | - CPPUNIT_ASSERT(test_create_inet6_throws("2001:db8:a::22123")); | ||
| 7045 | -} | ||
| 7046 | - | ||
| 7047 | - | ||
| 7048 | -// Test lexical comparison: | ||
| 7049 | diff --git a/test/torrent/object_stream_test.cc b/test/torrent/object_stream_test.cc | ||
| 7050 | index c8a17049..5ad0c23e 100644 | ||
| 7051 | --- a/test/torrent/object_stream_test.cc | ||
| 7052 | +++ b/test/torrent/object_stream_test.cc | ||
| 7053 | @@ -1,10 +1,8 @@ | ||
| 7054 | #include "config.h" | ||
| 7055 | |||
| 7056 | -#define __STDC_CONSTANT_MACROS | ||
| 7057 | - | ||
| 7058 | #include <iostream> | ||
| 7059 | #include <sstream> | ||
| 7060 | -#include <inttypes.h> | ||
| 7061 | +#include <cinttypes> | ||
| 7062 | #include <torrent/object.h> | ||
| 7063 | |||
| 7064 | #include "object_stream_test.h" | ||
| 7065 | diff --git a/test/torrent/tracker_controller_features.cc b/test/torrent/tracker_controller_features.cc | ||
| 7066 | index 63f163f5..0a6a57d6 100644 | ||
| 7067 | --- a/test/torrent/tracker_controller_features.cc | ||
| 7068 | +++ b/test/torrent/tracker_controller_features.cc | ||
| 7069 | @@ -1,7 +1,7 @@ | ||
| 7070 | #include "config.h" | ||
| 7071 | |||
| 7072 | +#include <functional> | ||
| 7073 | #include <iostream> | ||
| 7074 | -#include lt_tr1_functional | ||
| 7075 | |||
| 7076 | #include "rak/priority_queue_default.h" | ||
| 7077 | |||
| 7078 | diff --git a/test/torrent/tracker_controller_requesting.cc b/test/torrent/tracker_controller_requesting.cc | ||
| 7079 | index 5bc25169..92e664b3 100644 | ||
| 7080 | --- a/test/torrent/tracker_controller_requesting.cc | ||
| 7081 | +++ b/test/torrent/tracker_controller_requesting.cc | ||
| 7082 | @@ -1,7 +1,7 @@ | ||
| 7083 | #include "config.h" | ||
| 7084 | |||
| 7085 | +#include <functional> | ||
| 7086 | #include <iostream> | ||
| 7087 | -#include lt_tr1_functional | ||
| 7088 | |||
| 7089 | #include "rak/priority_queue_default.h" | ||
| 7090 | |||
| 7091 | diff --git a/test/torrent/tracker_controller_test.cc b/test/torrent/tracker_controller_test.cc | ||
| 7092 | index 823a9d34..9406c99e 100644 | ||
| 7093 | --- a/test/torrent/tracker_controller_test.cc | ||
| 7094 | +++ b/test/torrent/tracker_controller_test.cc | ||
| 7095 | @@ -1,7 +1,7 @@ | ||
| 7096 | #include "config.h" | ||
| 7097 | |||
| 7098 | +#include <functional> | ||
| 7099 | #include <iostream> | ||
| 7100 | -#include lt_tr1_functional | ||
| 7101 | |||
| 7102 | #include "rak/priority_queue_default.h" | ||
| 7103 | |||
| 7104 | diff --git a/test/torrent/tracker_list_features_test.cc b/test/torrent/tracker_list_features_test.cc | ||
| 7105 | index 57c05f40..5257b1a7 100644 | ||
| 7106 | --- a/test/torrent/tracker_list_features_test.cc | ||
| 7107 | +++ b/test/torrent/tracker_list_features_test.cc | ||
| 7108 | @@ -1,6 +1,6 @@ | ||
| 7109 | #include "config.h" | ||
| 7110 | |||
| 7111 | -#include lt_tr1_functional | ||
| 7112 | +#include <functional> | ||
| 7113 | |||
| 7114 | #include "torrent/http.h" | ||
| 7115 | #include "net/address_list.h" | ||
| 7116 | diff --git a/test/torrent/utils/directory_events_test.cc b/test/torrent/utils/directory_events_test.cc | ||
| 7117 | index 2cea5ab5..b97fd1d4 100644 | ||
| 7118 | --- a/test/torrent/utils/directory_events_test.cc | ||
| 7119 | +++ b/test/torrent/utils/directory_events_test.cc | ||
| 7120 | @@ -1,6 +1,6 @@ | ||
| 7121 | #include "config.h" | ||
| 7122 | |||
| 7123 | -#include <tr1/functional> | ||
| 7124 | +#include <functional> | ||
| 7125 | #include <torrent/exceptions.h> | ||
| 7126 | #include <torrent/utils/directory_events.h> | ||
| 7127 | |||
| 7128 | @@ -8,8 +8,6 @@ | ||
| 7129 | |||
| 7130 | CPPUNIT_TEST_SUITE_REGISTRATION(utils_directory_events_test); | ||
| 7131 | |||
| 7132 | -namespace tr1 { using namespace std::tr1; } | ||
| 7133 | - | ||
| 7134 | void | ||
| 7135 | utils_directory_events_test::setUp() { | ||
| 7136 | } | ||
| 7137 | diff --git a/test/torrent/utils/log_buffer_test.h b/test/torrent/utils/log_buffer_test.h | ||
| 7138 | deleted file mode 100644 | ||
| 7139 | index f2824594..00000000 | ||
| 7140 | --- a/test/torrent/utils/log_buffer_test.h | ||
| 7141 | +++ /dev/null | ||
| 7142 | @@ -1,17 +0,0 @@ | ||
| 7143 | -#include <cppunit/extensions/HelperMacros.h> | ||
| 7144 | - | ||
| 7145 | -#include "torrent/utils/log_buffer.h" | ||
| 7146 | - | ||
| 7147 | -class utils_log_buffer_test : public CppUnit::TestFixture { | ||
| 7148 | - CPPUNIT_TEST_SUITE(utils_log_buffer_test); | ||
| 7149 | - CPPUNIT_TEST(test_basic); | ||
| 7150 | - CPPUNIT_TEST(test_timestamps); | ||
| 7151 | - CPPUNIT_TEST_SUITE_END(); | ||
| 7152 | - | ||
| 7153 | -public: | ||
| 7154 | - void setUp(); | ||
| 7155 | - void tearDown(); | ||
| 7156 | - | ||
| 7157 | - void test_basic(); | ||
| 7158 | - void test_timestamps(); | ||
| 7159 | -}; | ||
| 7160 | diff --git a/test/torrent/utils/log_test.cc b/test/torrent/utils/log_test.cc | ||
| 7161 | index 9f975636..8cc00ef8 100644 | ||
| 7162 | --- a/test/torrent/utils/log_test.cc | ||
| 7163 | +++ b/test/torrent/utils/log_test.cc | ||
| 7164 | @@ -3,8 +3,9 @@ | ||
| 7165 | #include <algorithm> | ||
| 7166 | #include <cstring> | ||
| 7167 | #include <fstream> | ||
| 7168 | +#include <functional> | ||
| 7169 | #include <iostream> | ||
| 7170 | -#include lt_tr1_functional | ||
| 7171 | + | ||
| 7172 | #include <torrent/exceptions.h> | ||
| 7173 | #include <torrent/utils/log.h> | ||
| 7174 | |||
| 7175 | @@ -37,6 +38,7 @@ void | ||
| 7176 | utils_log_test::setUp() { | ||
| 7177 | // Don't initialize since this creates the group->child connections. | ||
| 7178 | // torrent::log_initialize(); | ||
| 7179 | + torrent::log_cleanup(); | ||
| 7180 | } | ||
| 7181 | |||
| 7182 | void | ||
| 7183 | diff --git a/test/torrent/utils/net_test.cc b/test/torrent/utils/net_test.cc | ||
| 7184 | deleted file mode 100644 | ||
| 7185 | index d136e869..00000000 | ||
| 7186 | --- a/test/torrent/utils/net_test.cc | ||
| 7187 | +++ /dev/null | ||
| 7188 | @@ -1,32 +0,0 @@ | ||
| 7189 | -#include "config.h" | ||
| 7190 | - | ||
| 7191 | -#include <torrent/exceptions.h> | ||
| 7192 | -#include <torrent/utils/net.h> | ||
| 7193 | - | ||
| 7194 | -#include "net_test.h" | ||
| 7195 | - | ||
| 7196 | -CPPUNIT_TEST_SUITE_REGISTRATION(utils_net_test); | ||
| 7197 | - | ||
| 7198 | -static void inc_value(int* value) { (*value)++; } | ||
| 7199 | - | ||
| 7200 | -#define LTUNIT_AI_CALL(lt_ai, lt_flags) { \ | ||
| 7201 | - int test_value = 0; \ | ||
| 7202 | - CPPUNIT_ASSERT(torrent::address_info_call(ai, 0, std::bind(&inc_value, &test_value))); \ | ||
| 7203 | - CPPUNIT_ASSERT(test_value); } \ | ||
| 7204 | - | ||
| 7205 | -void | ||
| 7206 | -utils_net_test::setUp() { | ||
| 7207 | -} | ||
| 7208 | - | ||
| 7209 | -void | ||
| 7210 | -utils_net_test::tearDown() { | ||
| 7211 | -} | ||
| 7212 | - | ||
| 7213 | -void | ||
| 7214 | -utils_net_test::test_basic() { | ||
| 7215 | - addrinfo* ai = torrent::address_info_lookup("localhost", AF_INET, SOCK_STREAM); | ||
| 7216 | - | ||
| 7217 | - LTUNIT_AI_CALL(ai, 0); | ||
| 7218 | - | ||
| 7219 | - torrent::address_info_free(ai); | ||
| 7220 | -} | ||
| 7221 | diff --git a/test/torrent/utils/net_test.h b/test/torrent/utils/net_test.h | ||
| 7222 | deleted file mode 100644 | ||
| 7223 | index e538ab39..00000000 | ||
| 7224 | --- a/test/torrent/utils/net_test.h | ||
| 7225 | +++ /dev/null | ||
| 7226 | @@ -1,15 +0,0 @@ | ||
| 7227 | -#include <cppunit/extensions/HelperMacros.h> | ||
| 7228 | - | ||
| 7229 | -#include "torrent/utils/net.h" | ||
| 7230 | - | ||
| 7231 | -class utils_net_test : public CppUnit::TestFixture { | ||
| 7232 | - CPPUNIT_TEST_SUITE(utils_net_test); | ||
| 7233 | - CPPUNIT_TEST(test_basic); | ||
| 7234 | - CPPUNIT_TEST_SUITE_END(); | ||
| 7235 | - | ||
| 7236 | -public: | ||
| 7237 | - void setUp(); | ||
| 7238 | - void tearDown(); | ||
| 7239 | - | ||
| 7240 | - void test_basic(); | ||
| 7241 | -}; | ||
| 7242 | diff --git a/test/torrent/utils/option_strings_test.cc b/test/torrent/utils/option_strings_test.cc | ||
| 7243 | index c6302f98..a9bdcc89 100644 | ||
| 7244 | --- a/test/torrent/utils/option_strings_test.cc | ||
| 7245 | +++ b/test/torrent/utils/option_strings_test.cc | ||
| 7246 | @@ -1,8 +1,9 @@ | ||
| 7247 | #include "config.h" | ||
| 7248 | |||
| 7249 | #include <fstream> | ||
| 7250 | +#include <functional> | ||
| 7251 | #include <iostream> | ||
| 7252 | -#include lt_tr1_functional | ||
| 7253 | + | ||
| 7254 | #include <torrent/exceptions.h> | ||
| 7255 | #include <torrent/utils/option_strings.h> | ||
| 7256 | |||
| 7257 | diff --git a/test/torrent/utils/test_extents.cc b/test/torrent/utils/test_extents.cc | ||
| 7258 | index d6b8d11d..87424d62 100644 | ||
| 7259 | --- a/test/torrent/utils/test_extents.cc | ||
| 7260 | +++ b/test/torrent/utils/test_extents.cc | ||
| 7261 | @@ -2,7 +2,7 @@ | ||
| 7262 | |||
| 7263 | #include "test_extents.h" | ||
| 7264 | |||
| 7265 | -#include <inttypes.h> | ||
| 7266 | +#include <cinttypes> | ||
| 7267 | #include <iostream> | ||
| 7268 | #include <torrent/utils/extents.h> | ||
| 7269 | |||
| 7270 | diff --git a/test/torrent/utils/log_buffer_test.cc b/test/torrent/utils/test_log_buffer.cc | ||
| 7271 | similarity index 86% | ||
| 7272 | rename from test/torrent/utils/log_buffer_test.cc | ||
| 7273 | rename to test/torrent/utils/test_log_buffer.cc | ||
| 7274 | index a0ede0a0..a56a5365 100644 | ||
| 7275 | --- a/test/torrent/utils/log_buffer_test.cc | ||
| 7276 | +++ b/test/torrent/utils/test_log_buffer.cc | ||
| 7277 | @@ -1,23 +1,23 @@ | ||
| 7278 | #include "config.h" | ||
| 7279 | |||
| 7280 | -#include <torrent/utils/log_buffer.h> | ||
| 7281 | +#include "test_log_buffer.h" | ||
| 7282 | |||
| 7283 | #include "globals.h" | ||
| 7284 | -#include "log_buffer_test.h" | ||
| 7285 | +#include <torrent/utils/log_buffer.h> | ||
| 7286 | |||
| 7287 | -CPPUNIT_TEST_SUITE_REGISTRATION(utils_log_buffer_test); | ||
| 7288 | +CPPUNIT_TEST_SUITE_NAMED_REGISTRATION(test_log_buffer, "torrent/utils"); | ||
| 7289 | |||
| 7290 | void | ||
| 7291 | -utils_log_buffer_test::setUp() { | ||
| 7292 | +test_log_buffer::setUp() { | ||
| 7293 | torrent::cachedTime = rak::timer::from_seconds(1000); | ||
| 7294 | } | ||
| 7295 | |||
| 7296 | void | ||
| 7297 | -utils_log_buffer_test::tearDown() { | ||
| 7298 | +test_log_buffer::tearDown() { | ||
| 7299 | } | ||
| 7300 | |||
| 7301 | void | ||
| 7302 | -utils_log_buffer_test::test_basic() { | ||
| 7303 | +test_log_buffer::test_basic() { | ||
| 7304 | torrent::log_buffer log; | ||
| 7305 | |||
| 7306 | log.lock(); | ||
| 7307 | @@ -44,7 +44,7 @@ utils_log_buffer_test::test_basic() { | ||
| 7308 | } | ||
| 7309 | |||
| 7310 | void | ||
| 7311 | -utils_log_buffer_test::test_timestamps() { | ||
| 7312 | +test_log_buffer::test_timestamps() { | ||
| 7313 | torrent::log_buffer log; | ||
| 7314 | |||
| 7315 | log.lock_and_push_log("foobar", 6, 0); | ||
| 7316 | diff --git a/test/torrent/utils/test_log_buffer.h b/test/torrent/utils/test_log_buffer.h | ||
| 7317 | new file mode 100644 | ||
| 7318 | index 00000000..290df4c1 | ||
| 7319 | --- /dev/null | ||
| 7320 | +++ b/test/torrent/utils/test_log_buffer.h | ||
| 7321 | @@ -0,0 +1,17 @@ | ||
| 7322 | +#include "helpers/test_fixture.h" | ||
| 7323 | + | ||
| 7324 | +class test_log_buffer : public test_fixture { | ||
| 7325 | + CPPUNIT_TEST_SUITE(test_log_buffer); | ||
| 7326 | + | ||
| 7327 | + CPPUNIT_TEST(test_basic); | ||
| 7328 | + CPPUNIT_TEST(test_timestamps); | ||
| 7329 | + | ||
| 7330 | + CPPUNIT_TEST_SUITE_END(); | ||
| 7331 | + | ||
| 7332 | +public: | ||
| 7333 | + void setUp(); | ||
| 7334 | + void tearDown(); | ||
| 7335 | + | ||
| 7336 | + void test_basic(); | ||
| 7337 | + void test_timestamps(); | ||
| 7338 | +}; | ||
| 7339 | diff --git a/test/torrent/utils/test_uri_parser.cc b/test/torrent/utils/test_uri_parser.cc | ||
| 7340 | index c3b46eef..1f4bebe8 100644 | ||
| 7341 | --- a/test/torrent/utils/test_uri_parser.cc | ||
| 7342 | +++ b/test/torrent/utils/test_uri_parser.cc | ||
| 7343 | @@ -2,7 +2,7 @@ | ||
| 7344 | |||
| 7345 | #include "test_uri_parser.h" | ||
| 7346 | |||
| 7347 | -#include <inttypes.h> | ||
| 7348 | +#include <cinttypes> | ||
| 7349 | #include <iostream> | ||
| 7350 | #include <torrent/utils/uri_parser.h> | ||
| 7351 | |||
| 7352 | diff --git a/test/torrent/utils/thread_base_test.cc b/test/torrent/utils/thread_base_test.cc | ||
| 7353 | index 5cb7553f..8366c9ba 100644 | ||
| 7354 | --- a/test/torrent/utils/thread_base_test.cc | ||
| 7355 | +++ b/test/torrent/utils/thread_base_test.cc | ||
| 7356 | @@ -1,7 +1,8 @@ | ||
| 7357 | #include "config.h" | ||
| 7358 | |||
| 7359 | +#include <functional> | ||
| 7360 | #include <unistd.h> | ||
| 7361 | -#include lt_tr1_functional | ||
| 7362 | + | ||
| 7363 | #include <torrent/exceptions.h> | ||
| 7364 | #include <torrent/poll_select.h> | ||
| 7365 | #include <torrent/utils/thread_base.h> | ||
diff --git a/meta-oe/recipes-connectivity/libtorrent/libtorrent/0028-libtorrent.pc.in-add-Libs.Private-202.patch b/meta-oe/recipes-connectivity/libtorrent/libtorrent/0028-libtorrent.pc.in-add-Libs.Private-202.patch new file mode 100644 index 0000000000..d81548ceb7 --- /dev/null +++ b/meta-oe/recipes-connectivity/libtorrent/libtorrent/0028-libtorrent.pc.in-add-Libs.Private-202.patch | |||
| @@ -0,0 +1,26 @@ | |||
| 1 | From b656a77864bd322d69522f1f9d922404066e5a7c Mon Sep 17 00:00:00 2001 | ||
| 2 | From: Fabrice Fontaine <fontaine.fabrice@gmail.com> | ||
| 3 | Date: Mon, 21 Oct 2019 09:32:15 +0200 | ||
| 4 | Subject: [PATCH] libtorrent.pc.in: add Libs.Private (#202) | ||
| 5 | |||
| 6 | Add Libs.Private: -lz so applications that want to link statically with | ||
| 7 | libtorrent (such as rtorrent) will know that they must link with -lz | ||
| 8 | |||
| 9 | Fixes: | ||
| 10 | - http://autobuild.buildroot.org/results/075598e1699c2ac20a4dfbcb5695bbb7343f9a86 | ||
| 11 | |||
| 12 | Signed-off-by: Fabrice Fontaine <fontaine.fabrice@gmail.com> | ||
| 13 | --- | ||
| 14 | libtorrent.pc.in | 1 + | ||
| 15 | 1 file changed, 1 insertion(+) | ||
| 16 | |||
| 17 | diff --git a/libtorrent.pc.in b/libtorrent.pc.in | ||
| 18 | index cf6612bc..6108f7e9 100644 | ||
| 19 | --- a/libtorrent.pc.in | ||
| 20 | +++ b/libtorrent.pc.in | ||
| 21 | @@ -7,4 +7,5 @@ Name: libtorrent | ||
| 22 | Description: A BitTorrent library | ||
| 23 | Version: @VERSION@ | ||
| 24 | Libs: -L${libdir} -ltorrent | ||
| 25 | +Libs.Private: -lz | ||
| 26 | Cflags: -I${includedir} | ||
diff --git a/meta-oe/recipes-connectivity/libtorrent/libtorrent/0029-Fix-for-inotify-missing-quickly-renamed-files-203.patch b/meta-oe/recipes-connectivity/libtorrent/libtorrent/0029-Fix-for-inotify-missing-quickly-renamed-files-203.patch new file mode 100644 index 0000000000..59cf76cad4 --- /dev/null +++ b/meta-oe/recipes-connectivity/libtorrent/libtorrent/0029-Fix-for-inotify-missing-quickly-renamed-files-203.patch | |||
| @@ -0,0 +1,27 @@ | |||
| 1 | From 7c80dc3e3a47dd996ca0554fce4f69d16761a9c9 Mon Sep 17 00:00:00 2001 | ||
| 2 | From: Tadej Obrstar <tadej.obrstar@gmail.com> | ||
| 3 | Date: Sun, 1 Dec 2019 06:59:25 +0100 | ||
| 4 | Subject: [PATCH] Fix for inotify missing quickly renamed files (#203) | ||
| 5 | |||
| 6 | --- | ||
| 7 | src/torrent/utils/directory_events.cc | 7 +++++-- | ||
| 8 | 1 file changed, 5 insertions(+), 2 deletions(-) | ||
| 9 | |||
| 10 | diff --git a/src/torrent/utils/directory_events.cc b/src/torrent/utils/directory_events.cc | ||
| 11 | index 5d789f4e..8dcc2a61 100644 | ||
| 12 | --- a/src/torrent/utils/directory_events.cc | ||
| 13 | +++ b/src/torrent/utils/directory_events.cc | ||
| 14 | @@ -154,8 +154,11 @@ directory_events::event_read() { | ||
| 15 | wd_list::const_iterator itr = std::find_if(m_wd_list.begin(), m_wd_list.end(), | ||
| 16 | std::bind(&watch_descriptor::compare_desc, std::placeholders::_1, event->wd)); | ||
| 17 | |||
| 18 | - if (itr != m_wd_list.end()) | ||
| 19 | - itr->slot(itr->path + event->name); | ||
| 20 | + if (itr != m_wd_list.end()) { | ||
| 21 | + std::string sname(event->name); | ||
| 22 | + if((sname.substr(sname.find_last_of(".") ) == ".torrent")) | ||
| 23 | + itr->slot(itr->path + event->name); | ||
| 24 | + } | ||
| 25 | |||
| 26 | event = (struct inotify_event*)(next_event); | ||
| 27 | } | ||
diff --git a/meta-oe/recipes-connectivity/libtorrent/libtorrent/0030-Fix-compiler-warnings.-204.patch b/meta-oe/recipes-connectivity/libtorrent/libtorrent/0030-Fix-compiler-warnings.-204.patch new file mode 100644 index 0000000000..5b26f959fa --- /dev/null +++ b/meta-oe/recipes-connectivity/libtorrent/libtorrent/0030-Fix-compiler-warnings.-204.patch | |||
| @@ -0,0 +1,470 @@ | |||
| 1 | From 81897862edea81e9620493c473f488d1820bcf93 Mon Sep 17 00:00:00 2001 | ||
| 2 | From: Jari Sundell <sundell.software@gmail.com> | ||
| 3 | Date: Tue, 3 Dec 2019 21:53:48 +0900 | ||
| 4 | Subject: [PATCH] Fix compiler warnings. (#204) | ||
| 5 | |||
| 6 | --- | ||
| 7 | configure.ac | 6 ++- | ||
| 8 | scripts/ax_execinfo.m4 | 67 +++++++++++++++++++++++++++++++ | ||
| 9 | scripts/common.m4 | 15 ------- | ||
| 10 | scripts/rak_execinfo.m4 | 11 +++++ | ||
| 11 | src/torrent/exceptions.cc | 4 +- | ||
| 12 | test/Makefile.am | 15 ++----- | ||
| 13 | test/helpers/expect_fd.h | 8 ++-- | ||
| 14 | test/helpers/mock_compare.h | 6 +-- | ||
| 15 | test/helpers/progress_listener.cc | 3 +- | ||
| 16 | test/main.cc | 4 +- | ||
| 17 | test/net/Makefile.am | 40 ++++++++++++++++++ | ||
| 18 | test/torrent/net/Makefile.am | 44 ++++++++++++++++++++ | ||
| 19 | test/torrent/net/test_fd.cc | 48 +++++++++++----------- | ||
| 20 | 13 files changed, 207 insertions(+), 64 deletions(-) | ||
| 21 | create mode 100644 scripts/ax_execinfo.m4 | ||
| 22 | create mode 100644 scripts/rak_execinfo.m4 | ||
| 23 | create mode 100644 test/net/Makefile.am | ||
| 24 | create mode 100644 test/torrent/net/Makefile.am | ||
| 25 | |||
| 26 | diff --git a/configure.ac b/configure.ac | ||
| 27 | index 620ca552..b6708366 100644 | ||
| 28 | --- a/configure.ac | ||
| 29 | +++ b/configure.ac | ||
| 30 | @@ -33,6 +33,7 @@ RAK_CHECK_CXXFLAGS | ||
| 31 | RAK_ENABLE_DEBUG | ||
| 32 | RAK_ENABLE_EXTRA_DEBUG | ||
| 33 | RAK_ENABLE_WERROR | ||
| 34 | +RAK_DISABLE_BACKTRACE | ||
| 35 | |||
| 36 | RAK_CHECK_CXX11 | ||
| 37 | |||
| 38 | @@ -57,8 +58,8 @@ TORRENT_WITH_INOTIFY | ||
| 39 | |||
| 40 | CC_ATTRIBUTE_VISIBILITY | ||
| 41 | |||
| 42 | -AX_PTHREAD | ||
| 43 | AX_CHECK_ZLIB | ||
| 44 | +AX_PTHREAD | ||
| 45 | |||
| 46 | PKG_CHECK_MODULES([CPPUNIT], [cppunit],, [no_cppunit="yes"]) | ||
| 47 | |||
| 48 | @@ -74,7 +75,6 @@ AC_CHECK_FUNCS(posix_memalign) | ||
| 49 | TORRENT_CHECK_MADVISE() | ||
| 50 | TORRENT_CHECK_CACHELINE() | ||
| 51 | TORRENT_CHECK_POPCOUNT() | ||
| 52 | -TORRENT_CHECK_EXECINFO() | ||
| 53 | TORRENT_CHECK_PTHREAD_SETNAME_NP() | ||
| 54 | TORRENT_MINCORE() | ||
| 55 | |||
| 56 | @@ -111,4 +111,6 @@ AC_OUTPUT([ | ||
| 57 | src/tracker/Makefile | ||
| 58 | src/utils/Makefile | ||
| 59 | test/Makefile | ||
| 60 | + test/torrent/net/Makefile | ||
| 61 | + test/net/Makefile | ||
| 62 | ]) | ||
| 63 | diff --git a/scripts/ax_execinfo.m4 b/scripts/ax_execinfo.m4 | ||
| 64 | new file mode 100644 | ||
| 65 | index 00000000..0ff5fc0e | ||
| 66 | --- /dev/null | ||
| 67 | +++ b/scripts/ax_execinfo.m4 | ||
| 68 | @@ -0,0 +1,67 @@ | ||
| 69 | +# =========================================================================== | ||
| 70 | +# https://www.gnu.org/software/autoconf-archive/ax_execinfo.html | ||
| 71 | +# =========================================================================== | ||
| 72 | +# | ||
| 73 | +# SYNOPSIS | ||
| 74 | +# | ||
| 75 | +# AX_EXECINFO([ACTION-IF-EXECINFO-H-IS-FOUND], [ACTION-IF-EXECINFO-H-IS-NOT-FOUND], [ADDITIONAL-TYPES-LIST]) | ||
| 76 | +# | ||
| 77 | +# DESCRIPTION | ||
| 78 | +# | ||
| 79 | +# Checks for execinfo.h header and if the len parameter/return type can be | ||
| 80 | +# found from a list, also define backtrace_size_t to that type. | ||
| 81 | +# | ||
| 82 | +# By default the list of types to try contains int and size_t, but should | ||
| 83 | +# some yet undiscovered system use e.g. unsigned, the 3rd argument can be | ||
| 84 | +# used for extensions. I'd like to hear of further suggestions. | ||
| 85 | +# | ||
| 86 | +# Executes ACTION-IF-EXECINFO-H-IS-FOUND when present and the execinfo.h | ||
| 87 | +# header is found or ACTION-IF-EXECINFO-H-IS-NOT-FOUND in case the header | ||
| 88 | +# seems unavailable. | ||
| 89 | +# | ||
| 90 | +# Also adds -lexecinfo to LIBS on BSD if needed. | ||
| 91 | +# | ||
| 92 | +# LICENSE | ||
| 93 | +# | ||
| 94 | +# Copyright (c) 2014 Thomas Jahns <jahns@dkrz.de> | ||
| 95 | +# | ||
| 96 | +# Copying and distribution of this file, with or without modification, are | ||
| 97 | +# permitted in any medium without royalty provided the copyright notice | ||
| 98 | +# and this notice are preserved. This file is offered as-is, without any | ||
| 99 | +# warranty. | ||
| 100 | + | ||
| 101 | +#serial 2 | ||
| 102 | + | ||
| 103 | +AC_DEFUN([AX_EXECINFO], | ||
| 104 | + [AC_CHECK_HEADERS([execinfo.h]) | ||
| 105 | + AS_IF([test x"$ac_cv_header_execinfo_h" = xyes], | ||
| 106 | + [AC_CACHE_CHECK([size parameter type for backtrace()], | ||
| 107 | + [ax_cv_proto_backtrace_type], | ||
| 108 | + [AC_LANG_PUSH([C]) | ||
| 109 | + for ax_cv_proto_backtrace_type in size_t int m4_ifnblank([$3],[$3 ])none; do | ||
| 110 | + AS_IF([test "${ax_cv_proto_backtrace_type}" = none], | ||
| 111 | + [ax_cv_proto_backtrace_type= ; break]) | ||
| 112 | + AC_COMPILE_IFELSE([AC_LANG_PROGRAM([ | ||
| 113 | +#include <execinfo.h> | ||
| 114 | +extern | ||
| 115 | +${ax_cv_proto_backtrace_type} backtrace(void **addrlist, ${ax_cv_proto_backtrace_type} len); | ||
| 116 | +char **backtrace_symbols(void *const *buffer, ${ax_cv_proto_backtrace_type} size); | ||
| 117 | +])], | ||
| 118 | + [break]) | ||
| 119 | + done | ||
| 120 | + AC_LANG_POP([C])])]) | ||
| 121 | + AS_IF([test x${ax_cv_proto_backtrace_type} != x], | ||
| 122 | + [AC_DEFINE_UNQUOTED([backtrace_size_t], [$ax_cv_proto_backtrace_type], | ||
| 123 | + [Defined to return type of backtrace().])]) | ||
| 124 | + AC_SEARCH_LIBS([backtrace],[execinfo]) | ||
| 125 | + AS_IF([test x"${ax_cv_proto_backtrace_type}" != x -a x"$ac_cv_header_execinfo_h" = xyes -a x"$ac_cv_search_backtrace" != xno], | ||
| 126 | + [AC_DEFINE([HAVE_BACKTRACE],[1], | ||
| 127 | + [Defined if backtrace() could be fully identified.]) | ||
| 128 | + ]m4_ifnblank([$1],[$1 | ||
| 129 | +]),m4_ifnblank([$2],[$2 | ||
| 130 | +]))]) | ||
| 131 | +dnl | ||
| 132 | +dnl Local Variables: | ||
| 133 | +dnl mode: autoconf | ||
| 134 | +dnl End: | ||
| 135 | +dnl | ||
| 136 | diff --git a/scripts/common.m4 b/scripts/common.m4 | ||
| 137 | index b6d051f5..55e8d66e 100644 | ||
| 138 | --- a/scripts/common.m4 | ||
| 139 | +++ b/scripts/common.m4 | ||
| 140 | @@ -150,21 +150,6 @@ dnl Need to fix this so that it uses the stuff defined by the system. | ||
| 141 | ]) | ||
| 142 | ]) | ||
| 143 | |||
| 144 | -AC_DEFUN([TORRENT_CHECK_EXECINFO], [ | ||
| 145 | - AC_MSG_CHECKING(for execinfo.h) | ||
| 146 | - | ||
| 147 | - AC_COMPILE_IFELSE([AC_LANG_SOURCE([ | ||
| 148 | - #include <execinfo.h> | ||
| 149 | - int main() { backtrace((void**)0, 0); backtrace_symbols((char**)0, 0); return 0;} | ||
| 150 | - ])], | ||
| 151 | - [ | ||
| 152 | - AC_MSG_RESULT(yes) | ||
| 153 | - AC_DEFINE(USE_EXECINFO, 1, Use execinfo.h) | ||
| 154 | - ], [ | ||
| 155 | - AC_MSG_RESULT(no) | ||
| 156 | - ]) | ||
| 157 | -]) | ||
| 158 | - | ||
| 159 | AC_DEFUN([TORRENT_CHECK_ALIGNED], [ | ||
| 160 | AC_MSG_CHECKING(the byte alignment) | ||
| 161 | |||
| 162 | diff --git a/scripts/rak_execinfo.m4 b/scripts/rak_execinfo.m4 | ||
| 163 | new file mode 100644 | ||
| 164 | index 00000000..c1d9b2f8 | ||
| 165 | --- /dev/null | ||
| 166 | +++ b/scripts/rak_execinfo.m4 | ||
| 167 | @@ -0,0 +1,11 @@ | ||
| 168 | +AC_DEFUN([RAK_DISABLE_BACKTRACE], [ | ||
| 169 | + AC_ARG_ENABLE(backtrace, | ||
| 170 | + AC_HELP_STRING([--disable-backtrace], [disable backtrace information [[default=no]]]), | ||
| 171 | + [ | ||
| 172 | + if test "$enableval" = "yes"; then | ||
| 173 | + AX_EXECINFO | ||
| 174 | + fi | ||
| 175 | + ],[ | ||
| 176 | + AX_EXECINFO | ||
| 177 | + ]) | ||
| 178 | +]) | ||
| 179 | diff --git a/src/torrent/exceptions.cc b/src/torrent/exceptions.cc | ||
| 180 | index 2aeca1d7..f834f9fa 100644 | ||
| 181 | --- a/src/torrent/exceptions.cc | ||
| 182 | +++ b/src/torrent/exceptions.cc | ||
| 183 | @@ -42,7 +42,7 @@ | ||
| 184 | #include <sstream> | ||
| 185 | #include <unistd.h> | ||
| 186 | |||
| 187 | -#ifdef USE_EXECINFO | ||
| 188 | +#ifdef HAVE_BACKTRACE | ||
| 189 | #include <execinfo.h> | ||
| 190 | #endif | ||
| 191 | |||
| 192 | @@ -75,7 +75,7 @@ internal_error::initialize(const std::string& msg) { | ||
| 193 | |||
| 194 | std::stringstream output; | ||
| 195 | |||
| 196 | -#ifdef USE_EXECINFO | ||
| 197 | +#ifdef HAVE_BACKTRACE | ||
| 198 | void* stackPtrs[20]; | ||
| 199 | |||
| 200 | // Print the stack and exit. | ||
| 201 | diff --git a/test/Makefile.am b/test/Makefile.am | ||
| 202 | index b60a86a6..23b260e4 100644 | ||
| 203 | --- a/test/Makefile.am | ||
| 204 | +++ b/test/Makefile.am | ||
| 205 | @@ -1,3 +1,5 @@ | ||
| 206 | +SUBDIRS = torrent/net net | ||
| 207 | + | ||
| 208 | TESTS = LibTorrentTest | ||
| 209 | AUTOMAKE_OPTIONS = subdir-objects | ||
| 210 | |||
| 211 | @@ -43,19 +45,9 @@ LibTorrentTest_SOURCES = \ | ||
| 212 | data/hash_queue_test.cc \ | ||
| 213 | data/hash_queue_test.h \ | ||
| 214 | \ | ||
| 215 | - net/test_socket_listen.cc \ | ||
| 216 | - net/test_socket_listen.h \ | ||
| 217 | - \ | ||
| 218 | protocol/test_request_list.cc \ | ||
| 219 | protocol/test_request_list.h \ | ||
| 220 | \ | ||
| 221 | - torrent/net/test_address_info.cc \ | ||
| 222 | - torrent/net/test_address_info.h \ | ||
| 223 | - torrent/net/test_fd.cc \ | ||
| 224 | - torrent/net/test_fd.h \ | ||
| 225 | - torrent/net/test_socket_address.cc \ | ||
| 226 | - torrent/net/test_socket_address.h \ | ||
| 227 | - \ | ||
| 228 | torrent/utils/log_test.cc \ | ||
| 229 | torrent/utils/log_test.h \ | ||
| 230 | torrent/utils/option_strings_test.cc \ | ||
| 231 | @@ -97,9 +89,10 @@ LibTorrentTest_SOURCES = \ | ||
| 232 | torrent/tracker_timeout_test.h \ | ||
| 233 | tracker/tracker_http_test.cc \ | ||
| 234 | tracker/tracker_http_test.h \ | ||
| 235 | + \ | ||
| 236 | main.cc | ||
| 237 | |||
| 238 | LibTorrentTest_CXXFLAGS = $(CPPUNIT_CFLAGS) | ||
| 239 | -LibTorrentTest_LDFLAGS = $(CPPUNIT_LIBS) -ldl | ||
| 240 | +LibTorrentTest_LDFLAGS = $(CPPUNIT_LIBS) -ldl | ||
| 241 | |||
| 242 | AM_CPPFLAGS = -I$(srcdir) -I$(top_srcdir) -I$(top_srcdir)/src | ||
| 243 | diff --git a/test/helpers/expect_fd.h b/test/helpers/expect_fd.h | ||
| 244 | index 178cbabc..cc77c34a 100644 | ||
| 245 | --- a/test/helpers/expect_fd.h | ||
| 246 | +++ b/test/helpers/expect_fd.h | ||
| 247 | @@ -18,15 +18,15 @@ sap_cache_copy_addr_c_ptr(sap_cache_type& sap_cache, const torrent::c_sa_unique_ | ||
| 248 | |||
| 249 | inline void | ||
| 250 | expect_event_open_re(int idx) { | ||
| 251 | - mock_expect(&torrent::poll_event_open, mock_compare_map<torrent::Event>::begin_pointer + idx); | ||
| 252 | - mock_expect(&torrent::poll_event_insert_read, mock_compare_map<torrent::Event>::begin_pointer + idx); | ||
| 253 | - mock_expect(&torrent::poll_event_insert_error, mock_compare_map<torrent::Event>::begin_pointer + idx); | ||
| 254 | + mock_expect(&torrent::poll_event_open, mock_compare_map<torrent::Event>::begin_pointer() + idx); | ||
| 255 | + mock_expect(&torrent::poll_event_insert_read, mock_compare_map<torrent::Event>::begin_pointer() + idx); | ||
| 256 | + mock_expect(&torrent::poll_event_insert_error, mock_compare_map<torrent::Event>::begin_pointer() + idx); | ||
| 257 | } | ||
| 258 | |||
| 259 | inline void | ||
| 260 | expect_event_closed_fd(int idx, int fd) { | ||
| 261 | mock_expect(&torrent::fd__close, 0, fd); | ||
| 262 | - mock_expect(&torrent::poll_event_closed, mock_compare_map<torrent::Event>::begin_pointer + idx); | ||
| 263 | + mock_expect(&torrent::poll_event_closed, mock_compare_map<torrent::Event>::begin_pointer() + idx); | ||
| 264 | } | ||
| 265 | |||
| 266 | inline void | ||
| 267 | diff --git a/test/helpers/mock_compare.h b/test/helpers/mock_compare.h | ||
| 268 | index 3ea90305..3cc8d075 100644 | ||
| 269 | --- a/test/helpers/mock_compare.h | ||
| 270 | +++ b/test/helpers/mock_compare.h | ||
| 271 | @@ -34,11 +34,11 @@ template <typename T> | ||
| 272 | struct mock_compare_map { | ||
| 273 | typedef std::map<const T*, const T*> values_type; | ||
| 274 | |||
| 275 | - constexpr static T* begin_pointer = reinterpret_cast<T*>(0x1000); | ||
| 276 | - constexpr static T* end_pointer = reinterpret_cast<T*>(0x2000); | ||
| 277 | + static T* begin_pointer() { return reinterpret_cast<T*>(0x1000); } | ||
| 278 | + static T* end_pointer() { return reinterpret_cast<T*>(0x2000); } | ||
| 279 | |||
| 280 | static bool is_key(const T* k) { | ||
| 281 | - return k >= begin_pointer && k < end_pointer; | ||
| 282 | + return k >= begin_pointer() && k < end_pointer(); | ||
| 283 | } | ||
| 284 | |||
| 285 | static bool has_key(const T* k) { | ||
| 286 | diff --git a/test/helpers/progress_listener.cc b/test/helpers/progress_listener.cc | ||
| 287 | index 02803ffc..c2b60bcd 100644 | ||
| 288 | --- a/test/helpers/progress_listener.cc | ||
| 289 | +++ b/test/helpers/progress_listener.cc | ||
| 290 | @@ -54,7 +54,8 @@ void | ||
| 291 | progress_listener::startSuite(CppUnit::Test *suite) { | ||
| 292 | m_test_path.push_back(suite); | ||
| 293 | |||
| 294 | - std::cout << std::endl << get_test_path(m_test_path) << suite->getName() << ":" << std::endl; | ||
| 295 | + if (suite->countTestCases() > 0) | ||
| 296 | + std::cout << std::endl << get_test_path(m_test_path) << suite->getName() << ":" << std::endl; | ||
| 297 | } | ||
| 298 | |||
| 299 | void | ||
| 300 | diff --git a/test/main.cc b/test/main.cc | ||
| 301 | index da93fead..e8a00e1f 100644 | ||
| 302 | --- a/test/main.cc | ||
| 303 | +++ b/test/main.cc | ||
| 304 | @@ -12,7 +12,7 @@ | ||
| 305 | #include <cppunit/extensions/TestFactoryRegistry.h> | ||
| 306 | #include <cppunit/ui/text/TestRunner.h> | ||
| 307 | |||
| 308 | -#ifdef USE_EXECINFO | ||
| 309 | +#ifdef HAVE_BACKTRACE | ||
| 310 | #include <execinfo.h> | ||
| 311 | #endif | ||
| 312 | |||
| 313 | @@ -29,7 +29,7 @@ do_test_panic(int signum) { | ||
| 314 | |||
| 315 | std::cout << std::endl << std::endl << "Caught " << strsignal(signum) << ", dumping stack:" << std::endl << std::endl; | ||
| 316 | |||
| 317 | -#ifdef USE_EXECINFO | ||
| 318 | +#ifdef HAVE_BACKTRACE | ||
| 319 | void* stackPtrs[20]; | ||
| 320 | |||
| 321 | // Print the stack and exit. | ||
| 322 | diff --git a/test/net/Makefile.am b/test/net/Makefile.am | ||
| 323 | new file mode 100644 | ||
| 324 | index 00000000..bb951814 | ||
| 325 | --- /dev/null | ||
| 326 | +++ b/test/net/Makefile.am | ||
| 327 | @@ -0,0 +1,40 @@ | ||
| 328 | +TESTS = LibTorrentTestNet | ||
| 329 | +AUTOMAKE_OPTIONS = subdir-objects | ||
| 330 | + | ||
| 331 | +check_PROGRAMS = $(TESTS) | ||
| 332 | +LibTorrentTestNet_LDADD = \ | ||
| 333 | + ../../src/libtorrent.la \ | ||
| 334 | + ../../src/torrent/libsub_torrent.la \ | ||
| 335 | + ../../src/torrent/data/libsub_torrentdata.la \ | ||
| 336 | + ../../src/torrent/download/libsub_torrentdownload.la \ | ||
| 337 | + ../../src/torrent/peer/libsub_torrentpeer.la \ | ||
| 338 | + ../../src/data/libsub_data.la \ | ||
| 339 | + ../../src/dht/libsub_dht.la \ | ||
| 340 | + ../../src/net/libsub_net.la \ | ||
| 341 | + ../../src/protocol/libsub_protocol.la \ | ||
| 342 | + ../../src/download/libsub_download.la \ | ||
| 343 | + ../../src/tracker/libsub_tracker.la \ | ||
| 344 | + ../../src/utils/libsub_utils.la \ | ||
| 345 | + ../../src/torrent/utils/libsub_torrentutils.la | ||
| 346 | + | ||
| 347 | +LibTorrentTestNet_SOURCES = \ | ||
| 348 | + ../helpers/expect_fd.h \ | ||
| 349 | + ../helpers/expect_utils.h \ | ||
| 350 | + ../helpers/mock_compare.h \ | ||
| 351 | + ../helpers/mock_function.cc \ | ||
| 352 | + ../helpers/mock_function.h \ | ||
| 353 | + ../helpers/network.h \ | ||
| 354 | + ../helpers/progress_listener.cc \ | ||
| 355 | + ../helpers/progress_listener.h \ | ||
| 356 | + ../helpers/test_fixture.cc \ | ||
| 357 | + ../helpers/test_fixture.h \ | ||
| 358 | + \ | ||
| 359 | + test_socket_listen.cc \ | ||
| 360 | + test_socket_listen.h \ | ||
| 361 | + \ | ||
| 362 | + ../main.cc | ||
| 363 | + | ||
| 364 | +LibTorrentTestNet_CXXFLAGS = $(CPPUNIT_CFLAGS) | ||
| 365 | +LibTorrentTestNet_LDFLAGS = $(CPPUNIT_LIBS) -ldl | ||
| 366 | + | ||
| 367 | +AM_CPPFLAGS = -I$(top_srcdir) -I$(top_srcdir)/src -I$(top_srcdir)/test | ||
| 368 | diff --git a/test/torrent/net/Makefile.am b/test/torrent/net/Makefile.am | ||
| 369 | new file mode 100644 | ||
| 370 | index 00000000..8a531cc1 | ||
| 371 | --- /dev/null | ||
| 372 | +++ b/test/torrent/net/Makefile.am | ||
| 373 | @@ -0,0 +1,44 @@ | ||
| 374 | +TESTS = LibTorrentTestTorrentNet | ||
| 375 | +AUTOMAKE_OPTIONS = subdir-objects | ||
| 376 | + | ||
| 377 | +check_PROGRAMS = $(TESTS) | ||
| 378 | +LibTorrentTestTorrentNet_LDADD = \ | ||
| 379 | + ../../../src/libtorrent.la \ | ||
| 380 | + ../../../src/torrent/libsub_torrent.la \ | ||
| 381 | + ../../../src/torrent/data/libsub_torrentdata.la \ | ||
| 382 | + ../../../src/torrent/download/libsub_torrentdownload.la \ | ||
| 383 | + ../../../src/torrent/peer/libsub_torrentpeer.la \ | ||
| 384 | + ../../../src/data/libsub_data.la \ | ||
| 385 | + ../../../src/dht/libsub_dht.la \ | ||
| 386 | + ../../../src/net/libsub_net.la \ | ||
| 387 | + ../../../src/protocol/libsub_protocol.la \ | ||
| 388 | + ../../../src/download/libsub_download.la \ | ||
| 389 | + ../../../src/tracker/libsub_tracker.la \ | ||
| 390 | + ../../../src/utils/libsub_utils.la \ | ||
| 391 | + ../../../src/torrent/utils/libsub_torrentutils.la | ||
| 392 | + | ||
| 393 | +LibTorrentTestTorrentNet_SOURCES = \ | ||
| 394 | + ../../helpers/expect_fd.h \ | ||
| 395 | + ../../helpers/expect_utils.h \ | ||
| 396 | + ../../helpers/mock_compare.h \ | ||
| 397 | + ../../helpers/mock_function.cc \ | ||
| 398 | + ../../helpers/mock_function.h \ | ||
| 399 | + ../../helpers/network.h \ | ||
| 400 | + ../../helpers/progress_listener.cc \ | ||
| 401 | + ../../helpers/progress_listener.h \ | ||
| 402 | + ../../helpers/test_fixture.cc \ | ||
| 403 | + ../../helpers/test_fixture.h \ | ||
| 404 | + \ | ||
| 405 | + test_address_info.cc \ | ||
| 406 | + test_address_info.h \ | ||
| 407 | + test_fd.cc \ | ||
| 408 | + test_fd.h \ | ||
| 409 | + test_socket_address.cc \ | ||
| 410 | + test_socket_address.h \ | ||
| 411 | + \ | ||
| 412 | + ../../main.cc | ||
| 413 | + | ||
| 414 | +LibTorrentTestTorrentNet_CXXFLAGS = $(CPPUNIT_CFLAGS) | ||
| 415 | +LibTorrentTestTorrentNet_LDFLAGS = $(CPPUNIT_LIBS) -ldl | ||
| 416 | + | ||
| 417 | +AM_CPPFLAGS = -I$(top_srcdir) -I$(top_srcdir)/src -I$(top_srcdir)/test | ||
| 418 | diff --git a/test/torrent/net/test_fd.cc b/test/torrent/net/test_fd.cc | ||
| 419 | index 3cab0c5e..5e56f0f3 100644 | ||
| 420 | --- a/test/torrent/net/test_fd.cc | ||
| 421 | +++ b/test/torrent/net/test_fd.cc | ||
| 422 | @@ -1,24 +1,24 @@ | ||
| 423 | -#include "config.h" | ||
| 424 | - | ||
| 425 | -#include "test_fd.h" | ||
| 426 | - | ||
| 427 | -#include <torrent/net/fd.h> | ||
| 428 | - | ||
| 429 | -CPPUNIT_TEST_SUITE_NAMED_REGISTRATION(test_fd, "torrent/net"); | ||
| 430 | - | ||
| 431 | -void | ||
| 432 | -test_fd::test_valid_flags() { | ||
| 433 | - CPPUNIT_ASSERT(torrent::fd_valid_flags(torrent::fd_flag_stream)); | ||
| 434 | - CPPUNIT_ASSERT(torrent::fd_valid_flags(torrent::fd_flag_stream | torrent::fd_flag_nonblock)); | ||
| 435 | - CPPUNIT_ASSERT(torrent::fd_valid_flags(torrent::fd_flag_stream | torrent::fd_flag_reuse_address)); | ||
| 436 | - CPPUNIT_ASSERT(torrent::fd_valid_flags(torrent::fd_flag_stream | torrent::fd_flag_v4only)); | ||
| 437 | - CPPUNIT_ASSERT(torrent::fd_valid_flags(torrent::fd_flag_stream | torrent::fd_flag_v6only)); | ||
| 438 | - | ||
| 439 | - CPPUNIT_ASSERT(!torrent::fd_valid_flags(torrent::fd_flag_v4only | torrent::fd_flag_v6only)); | ||
| 440 | - CPPUNIT_ASSERT(!torrent::fd_valid_flags(torrent::fd_flag_stream | torrent::fd_flag_v4only | torrent::fd_flag_v6only)); | ||
| 441 | - | ||
| 442 | - CPPUNIT_ASSERT(!torrent::fd_valid_flags(torrent::fd_flags())); | ||
| 443 | - CPPUNIT_ASSERT(!torrent::fd_valid_flags(torrent::fd_flags(~torrent::fd_flag_all))); | ||
| 444 | - CPPUNIT_ASSERT(!torrent::fd_valid_flags(torrent::fd_flags(torrent::fd_flag_stream | ~torrent::fd_flag_all))); | ||
| 445 | - CPPUNIT_ASSERT(!torrent::fd_valid_flags(torrent::fd_flags(0x3245132))); | ||
| 446 | -} | ||
| 447 | +#include "config.h" | ||
| 448 | + | ||
| 449 | +#include "test_fd.h" | ||
| 450 | + | ||
| 451 | +#include <torrent/net/fd.h> | ||
| 452 | + | ||
| 453 | +CPPUNIT_TEST_SUITE_NAMED_REGISTRATION(test_fd, "torrent/net"); | ||
| 454 | + | ||
| 455 | +void | ||
| 456 | +test_fd::test_valid_flags() { | ||
| 457 | + CPPUNIT_ASSERT(torrent::fd_valid_flags(torrent::fd_flag_stream)); | ||
| 458 | + CPPUNIT_ASSERT(torrent::fd_valid_flags(torrent::fd_flag_stream | torrent::fd_flag_nonblock)); | ||
| 459 | + CPPUNIT_ASSERT(torrent::fd_valid_flags(torrent::fd_flag_stream | torrent::fd_flag_reuse_address)); | ||
| 460 | + CPPUNIT_ASSERT(torrent::fd_valid_flags(torrent::fd_flag_stream | torrent::fd_flag_v4only)); | ||
| 461 | + CPPUNIT_ASSERT(torrent::fd_valid_flags(torrent::fd_flag_stream | torrent::fd_flag_v6only)); | ||
| 462 | + | ||
| 463 | + CPPUNIT_ASSERT(!torrent::fd_valid_flags(torrent::fd_flag_v4only | torrent::fd_flag_v6only)); | ||
| 464 | + CPPUNIT_ASSERT(!torrent::fd_valid_flags(torrent::fd_flag_stream | torrent::fd_flag_v4only | torrent::fd_flag_v6only)); | ||
| 465 | + | ||
| 466 | + CPPUNIT_ASSERT(!torrent::fd_valid_flags(torrent::fd_flags())); | ||
| 467 | + CPPUNIT_ASSERT(!torrent::fd_valid_flags(torrent::fd_flags(~torrent::fd_flag_all))); | ||
| 468 | + CPPUNIT_ASSERT(!torrent::fd_valid_flags(torrent::fd_flags(torrent::fd_flag_stream | ~torrent::fd_flag_all))); | ||
| 469 | + CPPUNIT_ASSERT(!torrent::fd_valid_flags(torrent::fd_flags(0x3245132))); | ||
| 470 | +} | ||
diff --git a/meta-oe/recipes-connectivity/libtorrent/libtorrent/0031-Fix-log-format-so-GCC-can-check-it.-205.patch b/meta-oe/recipes-connectivity/libtorrent/libtorrent/0031-Fix-log-format-so-GCC-can-check-it.-205.patch new file mode 100644 index 0000000000..0ecc0cfe5c --- /dev/null +++ b/meta-oe/recipes-connectivity/libtorrent/libtorrent/0031-Fix-log-format-so-GCC-can-check-it.-205.patch | |||
| @@ -0,0 +1,33 @@ | |||
| 1 | From e813c344b1e4aa89288febb2f59109972083f1bb Mon Sep 17 00:00:00 2001 | ||
| 2 | From: Rosen Penev <rosenp@gmail.com> | ||
| 3 | Date: Thu, 5 Dec 2019 01:55:53 -0800 | ||
| 4 | Subject: [PATCH] Fix log format so GCC can check it. (#205) | ||
| 5 | |||
| 6 | --- | ||
| 7 | src/torrent/utils/log.cc | 6 +++--- | ||
| 8 | 1 file changed, 3 insertions(+), 3 deletions(-) | ||
| 9 | |||
| 10 | diff --git a/src/torrent/utils/log.cc b/src/torrent/utils/log.cc | ||
| 11 | index b855a2c6..24932996 100644 | ||
| 12 | --- a/src/torrent/utils/log.cc | ||
| 13 | +++ b/src/torrent/utils/log.cc | ||
| 14 | @@ -16,6 +16,8 @@ | ||
| 15 | #include <functional> | ||
| 16 | #include <memory> | ||
| 17 | |||
| 18 | +#define GROUPFMT (group >= LOG_NON_CASCADING) ? ("%" PRIi32 " ") : ("%" PRIi32 " %c ") | ||
| 19 | + | ||
| 20 | namespace torrent { | ||
| 21 | |||
| 22 | struct log_cache_entry { | ||
| 23 | @@ -356,9 +358,7 @@ log_gz_file_write(std::shared_ptr<log_gz_output>& outfile, const char* data, siz | ||
| 24 | |||
| 25 | // Normal groups are nul-terminated strings. | ||
| 26 | if (group >= 0) { | ||
| 27 | - const char* fmt = (group >= LOG_NON_CASCADING) ? ("%" PRIi32 " ") : ("%" PRIi32 " %c "); | ||
| 28 | - | ||
| 29 | - int buffer_length = snprintf(buffer, 64, fmt, | ||
| 30 | + int buffer_length = snprintf(buffer, 64, GROUPFMT, | ||
| 31 | cachedTime.seconds(), | ||
| 32 | log_level_char[group % 6]); | ||
| 33 | |||
diff --git a/meta-oe/recipes-connectivity/libtorrent/libtorrent/0032-Consolidate-make-script-to-optimize-build.-206.patch b/meta-oe/recipes-connectivity/libtorrent/libtorrent/0032-Consolidate-make-script-to-optimize-build.-206.patch new file mode 100644 index 0000000000..fa5cb294c2 --- /dev/null +++ b/meta-oe/recipes-connectivity/libtorrent/libtorrent/0032-Consolidate-make-script-to-optimize-build.-206.patch | |||
| @@ -0,0 +1,843 @@ | |||
| 1 | From 7b85e112ac2f59a39afa344148a946553c776142 Mon Sep 17 00:00:00 2001 | ||
| 2 | From: Jari Sundell <sundell.software@gmail.com> | ||
| 3 | Date: Fri, 6 Dec 2019 00:35:21 +0900 | ||
| 4 | Subject: [PATCH] Consolidate make script to optimize build. (#206) | ||
| 5 | |||
| 6 | --- | ||
| 7 | configure.ac | 14 +-- | ||
| 8 | src/Makefile.am | 147 ++++++++++++++++++++++++----- | ||
| 9 | src/data/Makefile.am | 28 ------ | ||
| 10 | src/dht/Makefile.am | 18 ---- | ||
| 11 | src/download/Makefile.am | 19 ---- | ||
| 12 | src/net/Makefile.am | 30 ------ | ||
| 13 | src/protocol/Makefile.am | 28 ------ | ||
| 14 | src/torrent/Makefile.am | 154 ++++++++++++++++++++++++++++--- | ||
| 15 | src/torrent/download/Makefile.am | 22 ----- | ||
| 16 | src/torrent/net/Makefile.am | 25 ----- | ||
| 17 | src/torrent/peer/Makefile.am | 28 ------ | ||
| 18 | src/torrent/utils/Makefile.am | 41 -------- | ||
| 19 | src/tracker/Makefile.am | 11 --- | ||
| 20 | src/utils/Makefile.am | 14 --- | ||
| 21 | test/Makefile.am | 92 +++++++++++++----- | ||
| 22 | 15 files changed, 338 insertions(+), 333 deletions(-) | ||
| 23 | delete mode 100644 src/data/Makefile.am | ||
| 24 | delete mode 100644 src/dht/Makefile.am | ||
| 25 | delete mode 100644 src/download/Makefile.am | ||
| 26 | delete mode 100644 src/net/Makefile.am | ||
| 27 | delete mode 100644 src/protocol/Makefile.am | ||
| 28 | delete mode 100644 src/torrent/download/Makefile.am | ||
| 29 | delete mode 100644 src/torrent/net/Makefile.am | ||
| 30 | delete mode 100644 src/torrent/peer/Makefile.am | ||
| 31 | delete mode 100644 src/torrent/utils/Makefile.am | ||
| 32 | delete mode 100644 src/tracker/Makefile.am | ||
| 33 | delete mode 100644 src/utils/Makefile.am | ||
| 34 | |||
| 35 | diff --git a/configure.ac b/configure.ac | ||
| 36 | index b6708366..e83710cc 100644 | ||
| 37 | --- a/configure.ac | ||
| 38 | +++ b/configure.ac | ||
| 39 | @@ -17,7 +17,7 @@ AC_SUBST(LIBTORRENT_CURRENT) | ||
| 40 | AC_SUBST(LIBTORRENT_INTERFACE_VERSION_INFO) | ||
| 41 | AC_SUBST(LIBTORRENT_INTERFACE_VERSION_NO) | ||
| 42 | |||
| 43 | -AM_INIT_AUTOMAKE([serial-tests]) | ||
| 44 | +AM_INIT_AUTOMAKE([serial-tests subdir-objects]) | ||
| 45 | AC_CONFIG_HEADERS(config.h) | ||
| 46 | |||
| 47 | AC_PROG_CXX | ||
| 48 | @@ -98,18 +98,6 @@ AC_OUTPUT([ | ||
| 49 | Makefile | ||
| 50 | src/Makefile | ||
| 51 | src/torrent/Makefile | ||
| 52 | - src/torrent/data/Makefile | ||
| 53 | - src/torrent/download/Makefile | ||
| 54 | - src/torrent/net/Makefile | ||
| 55 | - src/torrent/peer/Makefile | ||
| 56 | - src/torrent/utils/Makefile | ||
| 57 | - src/data/Makefile | ||
| 58 | - src/dht/Makefile | ||
| 59 | - src/download/Makefile | ||
| 60 | - src/net/Makefile | ||
| 61 | - src/protocol/Makefile | ||
| 62 | - src/tracker/Makefile | ||
| 63 | - src/utils/Makefile | ||
| 64 | test/Makefile | ||
| 65 | test/torrent/net/Makefile | ||
| 66 | test/net/Makefile | ||
| 67 | diff --git a/src/Makefile.am b/src/Makefile.am | ||
| 68 | index 99aaace0..e96bd74b 100644 | ||
| 69 | --- a/src/Makefile.am | ||
| 70 | +++ b/src/Makefile.am | ||
| 71 | @@ -1,30 +1,12 @@ | ||
| 72 | -SUBDIRS = \ | ||
| 73 | - torrent \ | ||
| 74 | - data \ | ||
| 75 | - dht \ | ||
| 76 | - download \ | ||
| 77 | - net \ | ||
| 78 | - protocol \ | ||
| 79 | - tracker \ | ||
| 80 | - utils | ||
| 81 | +SUBDIRS = torrent | ||
| 82 | |||
| 83 | lib_LTLIBRARIES = libtorrent.la | ||
| 84 | +noinst_LTLIBRARIES = libtorrent_other.la | ||
| 85 | |||
| 86 | libtorrent_la_LDFLAGS = -version-info $(LIBTORRENT_INTERFACE_VERSION_INFO) | ||
| 87 | libtorrent_la_LIBADD = \ | ||
| 88 | - torrent/libsub_torrent.la \ | ||
| 89 | - torrent/data/libsub_torrentdata.la \ | ||
| 90 | - torrent/download/libsub_torrentdownload.la \ | ||
| 91 | - torrent/net/libsub_torrentnet.la \ | ||
| 92 | - torrent/peer/libsub_torrentpeer.la \ | ||
| 93 | - torrent/utils/libsub_torrentutils.la \ | ||
| 94 | - data/libsub_data.la \ | ||
| 95 | - dht/libsub_dht.la \ | ||
| 96 | - download/libsub_download.la \ | ||
| 97 | - net/libsub_net.la \ | ||
| 98 | - protocol/libsub_protocol.la \ | ||
| 99 | - tracker/libsub_tracker.la \ | ||
| 100 | - utils/libsub_utils.la | ||
| 101 | + torrent/libtorrent_torrent.la \ | ||
| 102 | + libtorrent_other.la | ||
| 103 | |||
| 104 | libtorrent_la_SOURCES = \ | ||
| 105 | globals.cc \ | ||
| 106 | @@ -36,4 +18,125 @@ libtorrent_la_SOURCES = \ | ||
| 107 | thread_main.cc \ | ||
| 108 | thread_main.h | ||
| 109 | |||
| 110 | +libtorrent_other_la_SOURCES = \ | ||
| 111 | + data/chunk.cc \ | ||
| 112 | + data/chunk.h \ | ||
| 113 | + data/chunk_handle.h \ | ||
| 114 | + data/chunk_iterator.h \ | ||
| 115 | + data/chunk_list.cc \ | ||
| 116 | + data/chunk_list.h \ | ||
| 117 | + data/chunk_list_node.h \ | ||
| 118 | + data/chunk_part.cc \ | ||
| 119 | + data/chunk_part.h \ | ||
| 120 | + data/hash_check_queue.cc \ | ||
| 121 | + data/hash_check_queue.h \ | ||
| 122 | + data/hash_chunk.cc \ | ||
| 123 | + data/hash_chunk.h \ | ||
| 124 | + data/hash_queue.cc \ | ||
| 125 | + data/hash_queue.h \ | ||
| 126 | + data/hash_queue_node.cc \ | ||
| 127 | + data/hash_queue_node.h \ | ||
| 128 | + data/hash_torrent.cc \ | ||
| 129 | + data/hash_torrent.h \ | ||
| 130 | + data/memory_chunk.cc \ | ||
| 131 | + data/memory_chunk.h \ | ||
| 132 | + data/socket_file.cc \ | ||
| 133 | + data/socket_file.h \ | ||
| 134 | + \ | ||
| 135 | + dht/dht_bucket.cc \ | ||
| 136 | + dht/dht_bucket.h \ | ||
| 137 | + dht/dht_hash_map.h \ | ||
| 138 | + dht/dht_node.cc \ | ||
| 139 | + dht/dht_node.h \ | ||
| 140 | + dht/dht_router.cc \ | ||
| 141 | + dht/dht_router.h \ | ||
| 142 | + dht/dht_server.cc \ | ||
| 143 | + dht/dht_server.h \ | ||
| 144 | + dht/dht_tracker.cc \ | ||
| 145 | + dht/dht_tracker.h \ | ||
| 146 | + dht/dht_transaction.cc \ | ||
| 147 | + dht/dht_transaction.h \ | ||
| 148 | + \ | ||
| 149 | + download/available_list.cc \ | ||
| 150 | + download/available_list.h \ | ||
| 151 | + download/chunk_selector.cc \ | ||
| 152 | + download/chunk_selector.h \ | ||
| 153 | + download/chunk_statistics.cc \ | ||
| 154 | + download/chunk_statistics.h \ | ||
| 155 | + download/delegator.cc \ | ||
| 156 | + download/delegator.h \ | ||
| 157 | + download/download_constructor.cc \ | ||
| 158 | + download/download_constructor.h \ | ||
| 159 | + download/download_main.cc \ | ||
| 160 | + download/download_main.h \ | ||
| 161 | + download/download_wrapper.cc \ | ||
| 162 | + download/download_wrapper.h \ | ||
| 163 | + \ | ||
| 164 | + net/address_list.cc \ | ||
| 165 | + net/address_list.h \ | ||
| 166 | + net/data_buffer.h \ | ||
| 167 | + net/local_addr.cc \ | ||
| 168 | + net/local_addr.h \ | ||
| 169 | + net/listen.cc \ | ||
| 170 | + net/listen.h \ | ||
| 171 | + net/protocol_buffer.h \ | ||
| 172 | + net/socket_base.cc \ | ||
| 173 | + net/socket_base.h \ | ||
| 174 | + net/socket_datagram.cc \ | ||
| 175 | + net/socket_datagram.h \ | ||
| 176 | + net/socket_fd.cc \ | ||
| 177 | + net/socket_fd.h \ | ||
| 178 | + net/socket_listen.cc \ | ||
| 179 | + net/socket_listen.h \ | ||
| 180 | + net/socket_set.cc \ | ||
| 181 | + net/socket_set.h \ | ||
| 182 | + net/socket_stream.cc \ | ||
| 183 | + net/socket_stream.h \ | ||
| 184 | + net/throttle_internal.cc \ | ||
| 185 | + net/throttle_internal.h \ | ||
| 186 | + net/throttle_list.cc \ | ||
| 187 | + net/throttle_list.h \ | ||
| 188 | + net/throttle_node.h \ | ||
| 189 | + \ | ||
| 190 | + protocol/encryption_info.h \ | ||
| 191 | + protocol/extensions.cc \ | ||
| 192 | + protocol/extensions.h \ | ||
| 193 | + protocol/handshake.cc \ | ||
| 194 | + protocol/handshake.h \ | ||
| 195 | + protocol/handshake_encryption.cc \ | ||
| 196 | + protocol/handshake_encryption.h \ | ||
| 197 | + protocol/handshake_manager.cc \ | ||
| 198 | + protocol/handshake_manager.h \ | ||
| 199 | + protocol/initial_seed.cc \ | ||
| 200 | + protocol/initial_seed.h \ | ||
| 201 | + protocol/peer_chunks.h \ | ||
| 202 | + protocol/peer_connection_base.cc \ | ||
| 203 | + protocol/peer_connection_base.h \ | ||
| 204 | + protocol/peer_connection_leech.cc \ | ||
| 205 | + protocol/peer_connection_leech.h \ | ||
| 206 | + protocol/peer_connection_metadata.cc \ | ||
| 207 | + protocol/peer_connection_metadata.h \ | ||
| 208 | + protocol/peer_factory.cc \ | ||
| 209 | + protocol/peer_factory.h \ | ||
| 210 | + protocol/protocol_base.h \ | ||
| 211 | + protocol/request_list.cc \ | ||
| 212 | + protocol/request_list.h \ | ||
| 213 | + \ | ||
| 214 | + tracker/tracker_dht.cc \ | ||
| 215 | + tracker/tracker_dht.h \ | ||
| 216 | + tracker/tracker_http.cc \ | ||
| 217 | + tracker/tracker_http.h \ | ||
| 218 | + tracker/tracker_udp.cc \ | ||
| 219 | + tracker/tracker_udp.h \ | ||
| 220 | + \ | ||
| 221 | + utils/diffie_hellman.cc \ | ||
| 222 | + utils/diffie_hellman.h \ | ||
| 223 | + utils/instrumentation.cc \ | ||
| 224 | + utils/instrumentation.h \ | ||
| 225 | + utils/rc4.h \ | ||
| 226 | + utils/sha1.h \ | ||
| 227 | + utils/sha_fast.cc \ | ||
| 228 | + utils/sha_fast.h \ | ||
| 229 | + utils/queue_buckets.h | ||
| 230 | + | ||
| 231 | AM_CPPFLAGS = -I$(srcdir) -I$(top_srcdir) | ||
| 232 | diff --git a/src/data/Makefile.am b/src/data/Makefile.am | ||
| 233 | deleted file mode 100644 | ||
| 234 | index ef41c9bd..00000000 | ||
| 235 | --- a/src/data/Makefile.am | ||
| 236 | +++ /dev/null | ||
| 237 | @@ -1,28 +0,0 @@ | ||
| 238 | -noinst_LTLIBRARIES = libsub_data.la | ||
| 239 | - | ||
| 240 | -libsub_data_la_SOURCES = \ | ||
| 241 | - chunk.cc \ | ||
| 242 | - chunk.h \ | ||
| 243 | - chunk_handle.h \ | ||
| 244 | - chunk_iterator.h \ | ||
| 245 | - chunk_list.cc \ | ||
| 246 | - chunk_list.h \ | ||
| 247 | - chunk_list_node.h \ | ||
| 248 | - chunk_part.cc \ | ||
| 249 | - chunk_part.h \ | ||
| 250 | - hash_check_queue.cc \ | ||
| 251 | - hash_check_queue.h \ | ||
| 252 | - hash_chunk.cc \ | ||
| 253 | - hash_chunk.h \ | ||
| 254 | - hash_queue.cc \ | ||
| 255 | - hash_queue.h \ | ||
| 256 | - hash_queue_node.cc \ | ||
| 257 | - hash_queue_node.h \ | ||
| 258 | - hash_torrent.cc \ | ||
| 259 | - hash_torrent.h \ | ||
| 260 | - memory_chunk.cc \ | ||
| 261 | - memory_chunk.h \ | ||
| 262 | - socket_file.cc \ | ||
| 263 | - socket_file.h | ||
| 264 | - | ||
| 265 | -AM_CPPFLAGS = -I$(srcdir) -I$(srcdir)/.. -I$(top_srcdir) | ||
| 266 | diff --git a/src/dht/Makefile.am b/src/dht/Makefile.am | ||
| 267 | deleted file mode 100644 | ||
| 268 | index a87c57bc..00000000 | ||
| 269 | --- a/src/dht/Makefile.am | ||
| 270 | +++ /dev/null | ||
| 271 | @@ -1,18 +0,0 @@ | ||
| 272 | -noinst_LTLIBRARIES = libsub_dht.la | ||
| 273 | - | ||
| 274 | -libsub_dht_la_SOURCES = \ | ||
| 275 | - dht_bucket.cc \ | ||
| 276 | - dht_bucket.h \ | ||
| 277 | - dht_hash_map.h \ | ||
| 278 | - dht_node.cc \ | ||
| 279 | - dht_node.h \ | ||
| 280 | - dht_router.cc \ | ||
| 281 | - dht_router.h \ | ||
| 282 | - dht_server.cc \ | ||
| 283 | - dht_server.h \ | ||
| 284 | - dht_tracker.cc \ | ||
| 285 | - dht_tracker.h \ | ||
| 286 | - dht_transaction.cc \ | ||
| 287 | - dht_transaction.h | ||
| 288 | - | ||
| 289 | -AM_CPPFLAGS = -I$(srcdir) -I$(srcdir)/.. -I$(top_srcdir) | ||
| 290 | diff --git a/src/download/Makefile.am b/src/download/Makefile.am | ||
| 291 | deleted file mode 100644 | ||
| 292 | index 65ceaf97..00000000 | ||
| 293 | --- a/src/download/Makefile.am | ||
| 294 | +++ /dev/null | ||
| 295 | @@ -1,19 +0,0 @@ | ||
| 296 | -noinst_LTLIBRARIES = libsub_download.la | ||
| 297 | - | ||
| 298 | -libsub_download_la_SOURCES = \ | ||
| 299 | - available_list.cc \ | ||
| 300 | - available_list.h \ | ||
| 301 | - chunk_selector.cc \ | ||
| 302 | - chunk_selector.h \ | ||
| 303 | - chunk_statistics.cc \ | ||
| 304 | - chunk_statistics.h \ | ||
| 305 | - delegator.cc \ | ||
| 306 | - delegator.h \ | ||
| 307 | - download_constructor.cc \ | ||
| 308 | - download_constructor.h \ | ||
| 309 | - download_main.cc \ | ||
| 310 | - download_main.h \ | ||
| 311 | - download_wrapper.cc \ | ||
| 312 | - download_wrapper.h | ||
| 313 | - | ||
| 314 | -AM_CPPFLAGS = -I$(srcdir) -I$(srcdir)/.. -I$(top_srcdir) | ||
| 315 | diff --git a/src/net/Makefile.am b/src/net/Makefile.am | ||
| 316 | deleted file mode 100644 | ||
| 317 | index e3a8c7e1..00000000 | ||
| 318 | --- a/src/net/Makefile.am | ||
| 319 | +++ /dev/null | ||
| 320 | @@ -1,30 +0,0 @@ | ||
| 321 | -noinst_LTLIBRARIES = libsub_net.la | ||
| 322 | - | ||
| 323 | -libsub_net_la_SOURCES = \ | ||
| 324 | - address_list.cc \ | ||
| 325 | - address_list.h \ | ||
| 326 | - data_buffer.h \ | ||
| 327 | - local_addr.cc \ | ||
| 328 | - local_addr.h \ | ||
| 329 | - listen.cc \ | ||
| 330 | - listen.h \ | ||
| 331 | - protocol_buffer.h \ | ||
| 332 | - socket_base.cc \ | ||
| 333 | - socket_base.h \ | ||
| 334 | - socket_datagram.cc \ | ||
| 335 | - socket_datagram.h \ | ||
| 336 | - socket_fd.cc \ | ||
| 337 | - socket_fd.h \ | ||
| 338 | - socket_listen.cc \ | ||
| 339 | - socket_listen.h \ | ||
| 340 | - socket_set.cc \ | ||
| 341 | - socket_set.h \ | ||
| 342 | - socket_stream.cc \ | ||
| 343 | - socket_stream.h \ | ||
| 344 | - throttle_internal.cc \ | ||
| 345 | - throttle_internal.h \ | ||
| 346 | - throttle_list.cc \ | ||
| 347 | - throttle_list.h \ | ||
| 348 | - throttle_node.h | ||
| 349 | - | ||
| 350 | -AM_CPPFLAGS = -I$(srcdir) -I$(srcdir)/.. -I$(top_srcdir) | ||
| 351 | diff --git a/src/protocol/Makefile.am b/src/protocol/Makefile.am | ||
| 352 | deleted file mode 100644 | ||
| 353 | index 2e9aba7a..00000000 | ||
| 354 | --- a/src/protocol/Makefile.am | ||
| 355 | +++ /dev/null | ||
| 356 | @@ -1,28 +0,0 @@ | ||
| 357 | -noinst_LTLIBRARIES = libsub_protocol.la | ||
| 358 | - | ||
| 359 | -libsub_protocol_la_SOURCES = \ | ||
| 360 | - encryption_info.h \ | ||
| 361 | - extensions.cc \ | ||
| 362 | - extensions.h \ | ||
| 363 | - handshake.cc \ | ||
| 364 | - handshake.h \ | ||
| 365 | - handshake_encryption.cc \ | ||
| 366 | - handshake_encryption.h \ | ||
| 367 | - handshake_manager.cc \ | ||
| 368 | - handshake_manager.h \ | ||
| 369 | - initial_seed.cc \ | ||
| 370 | - initial_seed.h \ | ||
| 371 | - peer_chunks.h \ | ||
| 372 | - peer_connection_base.cc \ | ||
| 373 | - peer_connection_base.h \ | ||
| 374 | - peer_connection_leech.cc \ | ||
| 375 | - peer_connection_leech.h \ | ||
| 376 | - peer_connection_metadata.cc \ | ||
| 377 | - peer_connection_metadata.h \ | ||
| 378 | - peer_factory.cc \ | ||
| 379 | - peer_factory.h \ | ||
| 380 | - protocol_base.h \ | ||
| 381 | - request_list.cc \ | ||
| 382 | - request_list.h | ||
| 383 | - | ||
| 384 | -AM_CPPFLAGS = -I$(srcdir) -I$(srcdir)/.. -I$(top_srcdir) | ||
| 385 | diff --git a/src/torrent/Makefile.am b/src/torrent/Makefile.am | ||
| 386 | index 8cd26ce7..30157b95 100644 | ||
| 387 | --- a/src/torrent/Makefile.am | ||
| 388 | +++ b/src/torrent/Makefile.am | ||
| 389 | @@ -1,13 +1,89 @@ | ||
| 390 | -SUBDIRS = \ | ||
| 391 | - data \ | ||
| 392 | - download \ | ||
| 393 | - net \ | ||
| 394 | - peer \ | ||
| 395 | - utils | ||
| 396 | +noinst_LTLIBRARIES = libtorrent_torrent.la | ||
| 397 | |||
| 398 | -noinst_LTLIBRARIES = libsub_torrent.la | ||
| 399 | - | ||
| 400 | -libsub_torrent_la_SOURCES = \ | ||
| 401 | +libtorrent_torrent_la_SOURCES = \ | ||
| 402 | + data/block.cc \ | ||
| 403 | + data/block.h \ | ||
| 404 | + data/block_failed.h \ | ||
| 405 | + data/block_list.cc \ | ||
| 406 | + data/block_list.h \ | ||
| 407 | + data/block_transfer.h \ | ||
| 408 | + data/chunk_utils.cc \ | ||
| 409 | + data/chunk_utils.h \ | ||
| 410 | + data/download_data.cc \ | ||
| 411 | + data/download_data.h \ | ||
| 412 | + data/file.cc \ | ||
| 413 | + data/file.h \ | ||
| 414 | + data/file_list.cc \ | ||
| 415 | + data/file_list.h \ | ||
| 416 | + data/file_list_iterator.cc \ | ||
| 417 | + data/file_list_iterator.h \ | ||
| 418 | + data/file_manager.cc \ | ||
| 419 | + data/file_manager.h \ | ||
| 420 | + data/file_utils.cc \ | ||
| 421 | + data/file_utils.h \ | ||
| 422 | + data/piece.h \ | ||
| 423 | + data/transfer_list.cc \ | ||
| 424 | + data/transfer_list.h \ | ||
| 425 | +\ | ||
| 426 | + download/choke_group.cc \ | ||
| 427 | + download/choke_group.h \ | ||
| 428 | + download/choke_queue.cc \ | ||
| 429 | + download/choke_queue.h \ | ||
| 430 | + download/download_manager.cc \ | ||
| 431 | + download/download_manager.h \ | ||
| 432 | + download/group_entry.h \ | ||
| 433 | + download/resource_manager.cc \ | ||
| 434 | + download/resource_manager.h \ | ||
| 435 | +\ | ||
| 436 | + net/address_info.cc \ | ||
| 437 | + net/address_info.h \ | ||
| 438 | + net/fd.cc \ | ||
| 439 | + net/fd.h \ | ||
| 440 | + net/socket_address.cc \ | ||
| 441 | + net/socket_address.h \ | ||
| 442 | + net/socket_address_key.cc \ | ||
| 443 | + net/socket_address_key.h \ | ||
| 444 | + net/socket_event.cc \ | ||
| 445 | + net/socket_event.h \ | ||
| 446 | + net/types.h \ | ||
| 447 | +\ | ||
| 448 | + peer/choke_status.h \ | ||
| 449 | + peer/client_info.cc \ | ||
| 450 | + peer/client_info.h \ | ||
| 451 | + peer/client_list.cc \ | ||
| 452 | + peer/client_list.h \ | ||
| 453 | + peer/connection_list.cc \ | ||
| 454 | + peer/connection_list.h \ | ||
| 455 | + peer/peer.cc \ | ||
| 456 | + peer/peer.h \ | ||
| 457 | + peer/peer_info.cc \ | ||
| 458 | + peer/peer_info.h \ | ||
| 459 | + peer/peer_list.cc \ | ||
| 460 | + peer/peer_list.h \ | ||
| 461 | +\ | ||
| 462 | + utils/directory_events.cc \ | ||
| 463 | + utils/directory_events.h \ | ||
| 464 | + utils/extents.h \ | ||
| 465 | + utils/log.cc \ | ||
| 466 | + utils/log.h \ | ||
| 467 | + utils/log_buffer.cc \ | ||
| 468 | + utils/log_buffer.h \ | ||
| 469 | + utils/option_strings.cc \ | ||
| 470 | + utils/option_strings.h \ | ||
| 471 | + utils/random.cc \ | ||
| 472 | + utils/random.h \ | ||
| 473 | + utils/ranges.h \ | ||
| 474 | + utils/resume.cc \ | ||
| 475 | + utils/resume.h \ | ||
| 476 | + utils/signal_bitfield.cc \ | ||
| 477 | + utils/signal_bitfield.h \ | ||
| 478 | + utils/thread_base.cc \ | ||
| 479 | + utils/thread_base.h \ | ||
| 480 | + utils/thread_interrupt.cc \ | ||
| 481 | + utils/thread_interrupt.h \ | ||
| 482 | + utils/uri_parser.cc \ | ||
| 483 | + utils/uri_parser.h \ | ||
| 484 | +\ | ||
| 485 | bitfield.cc \ | ||
| 486 | bitfield.h \ | ||
| 487 | chunk_manager.cc \ | ||
| 488 | @@ -61,8 +137,64 @@ libsub_torrent_la_SOURCES = \ | ||
| 489 | |||
| 490 | AM_CPPFLAGS = -I$(srcdir) -I$(srcdir)/.. -I$(top_srcdir) | ||
| 491 | |||
| 492 | -libtorrentincludedir = $(includedir)/torrent | ||
| 493 | -libtorrentinclude_HEADERS = \ | ||
| 494 | +libtorrent_torrent_data_includedir = $(includedir)/torrent/data | ||
| 495 | +libtorrent_torrent_data_include_HEADERS = \ | ||
| 496 | + data/block.h \ | ||
| 497 | + data/block_list.h \ | ||
| 498 | + data/block_transfer.h \ | ||
| 499 | + data/chunk_utils.h \ | ||
| 500 | + data/download_data.h \ | ||
| 501 | + data/file.h \ | ||
| 502 | + data/file_list.h \ | ||
| 503 | + data/file_list_iterator.h \ | ||
| 504 | + data/file_manager.h \ | ||
| 505 | + data/file_utils.h \ | ||
| 506 | + data/piece.h \ | ||
| 507 | + data/transfer_list.h | ||
| 508 | + | ||
| 509 | +libtorrent_torrent_download_includedir = $(includedir)/torrent/download | ||
| 510 | +libtorrent_torrent_download_include_HEADERS = \ | ||
| 511 | + download/choke_group.h \ | ||
| 512 | + download/choke_queue.h \ | ||
| 513 | + download/download_manager.h \ | ||
| 514 | + download/group_entry.h \ | ||
| 515 | + download/resource_manager.h | ||
| 516 | + | ||
| 517 | +libtorrent_torrent_net_includedir = $(includedir)/torrent/net | ||
| 518 | +libtorrent_torrent_net_include_HEADERS = \ | ||
| 519 | + net/address_info.h \ | ||
| 520 | + net/fd.h \ | ||
| 521 | + net/socket_address.h \ | ||
| 522 | + net/socket_address_key.h \ | ||
| 523 | + net/socket_event.h \ | ||
| 524 | + net/types.h | ||
| 525 | + | ||
| 526 | +libtorrent_torrent_peer_includedir = $(includedir)/torrent/peer | ||
| 527 | +libtorrent_torrent_peer_include_HEADERS = \ | ||
| 528 | + peer/choke_status.h \ | ||
| 529 | + peer/client_info.h \ | ||
| 530 | + peer/client_list.h \ | ||
| 531 | + peer/connection_list.h \ | ||
| 532 | + peer/peer.h \ | ||
| 533 | + peer/peer_info.h \ | ||
| 534 | + peer/peer_list.h | ||
| 535 | + | ||
| 536 | +libtorrent_torrent_utils_includedir = $(includedir)/torrent/utils | ||
| 537 | +libtorrent_torrent_utils_include_HEADERS = \ | ||
| 538 | + utils/directory_events.h \ | ||
| 539 | + utils/extents.h \ | ||
| 540 | + utils/log.h \ | ||
| 541 | + utils/log_buffer.h \ | ||
| 542 | + utils/option_strings.h \ | ||
| 543 | + utils/ranges.h \ | ||
| 544 | + utils/resume.h \ | ||
| 545 | + utils/signal_bitfield.h \ | ||
| 546 | + utils/thread_base.h \ | ||
| 547 | + utils/thread_interrupt.h \ | ||
| 548 | + utils/uri_parser.h | ||
| 549 | + | ||
| 550 | +libtorrent_torrent_includedir = $(includedir)/torrent | ||
| 551 | +libtorrent_torrent_include_HEADERS = \ | ||
| 552 | bitfield.h \ | ||
| 553 | chunk_manager.h \ | ||
| 554 | common.h \ | ||
| 555 | diff --git a/src/torrent/download/Makefile.am b/src/torrent/download/Makefile.am | ||
| 556 | deleted file mode 100644 | ||
| 557 | index f92c7aa4..00000000 | ||
| 558 | --- a/src/torrent/download/Makefile.am | ||
| 559 | +++ /dev/null | ||
| 560 | @@ -1,22 +0,0 @@ | ||
| 561 | -noinst_LTLIBRARIES = libsub_torrentdownload.la | ||
| 562 | - | ||
| 563 | -libsub_torrentdownload_la_SOURCES = \ | ||
| 564 | - choke_group.cc \ | ||
| 565 | - choke_group.h \ | ||
| 566 | - choke_queue.cc \ | ||
| 567 | - choke_queue.h \ | ||
| 568 | - download_manager.cc \ | ||
| 569 | - download_manager.h \ | ||
| 570 | - group_entry.h \ | ||
| 571 | - resource_manager.cc \ | ||
| 572 | - resource_manager.h | ||
| 573 | - | ||
| 574 | -AM_CPPFLAGS = -I$(srcdir) -I$(srcdir)/.. -I$(srcdir)/../.. -I$(top_srcdir) | ||
| 575 | - | ||
| 576 | -libtorrentincludedir = $(includedir)/torrent/download | ||
| 577 | -libtorrentinclude_HEADERS = \ | ||
| 578 | - choke_group.h \ | ||
| 579 | - choke_queue.h \ | ||
| 580 | - download_manager.h \ | ||
| 581 | - group_entry.h \ | ||
| 582 | - resource_manager.h | ||
| 583 | diff --git a/src/torrent/net/Makefile.am b/src/torrent/net/Makefile.am | ||
| 584 | deleted file mode 100644 | ||
| 585 | index 35dd4774..00000000 | ||
| 586 | --- a/src/torrent/net/Makefile.am | ||
| 587 | +++ /dev/null | ||
| 588 | @@ -1,25 +0,0 @@ | ||
| 589 | -noinst_LTLIBRARIES = libsub_torrentnet.la | ||
| 590 | - | ||
| 591 | -libsub_torrentnet_la_SOURCES = \ | ||
| 592 | - address_info.cc \ | ||
| 593 | - address_info.h \ | ||
| 594 | - fd.cc \ | ||
| 595 | - fd.h \ | ||
| 596 | - socket_address.cc \ | ||
| 597 | - socket_address.h \ | ||
| 598 | - socket_address_key.cc \ | ||
| 599 | - socket_address_key.h \ | ||
| 600 | - socket_event.cc \ | ||
| 601 | - socket_event.h \ | ||
| 602 | - types.h | ||
| 603 | - | ||
| 604 | -AM_CPPFLAGS = -I$(srcdir) -I$(srcdir)/.. -I$(srcdir)/../.. -I$(top_srcdir) | ||
| 605 | - | ||
| 606 | -libtorrentincludedir = $(includedir)/torrent/net | ||
| 607 | -libtorrentinclude_HEADERS = \ | ||
| 608 | - address_info.h \ | ||
| 609 | - fd.h \ | ||
| 610 | - socket_address.h \ | ||
| 611 | - socket_address_key.h \ | ||
| 612 | - socket_event.h \ | ||
| 613 | - types.h | ||
| 614 | diff --git a/src/torrent/peer/Makefile.am b/src/torrent/peer/Makefile.am | ||
| 615 | deleted file mode 100644 | ||
| 616 | index 1324e88a..00000000 | ||
| 617 | --- a/src/torrent/peer/Makefile.am | ||
| 618 | +++ /dev/null | ||
| 619 | @@ -1,28 +0,0 @@ | ||
| 620 | -noinst_LTLIBRARIES = libsub_torrentpeer.la | ||
| 621 | - | ||
| 622 | -libsub_torrentpeer_la_SOURCES = \ | ||
| 623 | - choke_status.h \ | ||
| 624 | - client_info.cc \ | ||
| 625 | - client_info.h \ | ||
| 626 | - client_list.cc \ | ||
| 627 | - client_list.h \ | ||
| 628 | - connection_list.cc \ | ||
| 629 | - connection_list.h \ | ||
| 630 | - peer.cc \ | ||
| 631 | - peer.h \ | ||
| 632 | - peer_info.cc \ | ||
| 633 | - peer_info.h \ | ||
| 634 | - peer_list.cc \ | ||
| 635 | - peer_list.h | ||
| 636 | - | ||
| 637 | -AM_CPPFLAGS = -I$(srcdir) -I$(srcdir)/.. -I$(srcdir)/../.. -I$(top_srcdir) | ||
| 638 | - | ||
| 639 | -libtorrentincludedir = $(includedir)/torrent/peer | ||
| 640 | -libtorrentinclude_HEADERS = \ | ||
| 641 | - choke_status.h \ | ||
| 642 | - client_info.h \ | ||
| 643 | - client_list.h \ | ||
| 644 | - connection_list.h \ | ||
| 645 | - peer.h \ | ||
| 646 | - peer_info.h \ | ||
| 647 | - peer_list.h | ||
| 648 | diff --git a/src/torrent/utils/Makefile.am b/src/torrent/utils/Makefile.am | ||
| 649 | deleted file mode 100644 | ||
| 650 | index a48786c6..00000000 | ||
| 651 | --- a/src/torrent/utils/Makefile.am | ||
| 652 | +++ /dev/null | ||
| 653 | @@ -1,41 +0,0 @@ | ||
| 654 | -noinst_LTLIBRARIES = libsub_torrentutils.la | ||
| 655 | - | ||
| 656 | -libsub_torrentutils_la_SOURCES = \ | ||
| 657 | - directory_events.cc \ | ||
| 658 | - directory_events.h \ | ||
| 659 | - extents.h \ | ||
| 660 | - log.cc \ | ||
| 661 | - log.h \ | ||
| 662 | - log_buffer.cc \ | ||
| 663 | - log_buffer.h \ | ||
| 664 | - option_strings.cc \ | ||
| 665 | - option_strings.h \ | ||
| 666 | - random.cc \ | ||
| 667 | - random.h \ | ||
| 668 | - ranges.h \ | ||
| 669 | - resume.cc \ | ||
| 670 | - resume.h \ | ||
| 671 | - signal_bitfield.cc \ | ||
| 672 | - signal_bitfield.h \ | ||
| 673 | - thread_base.cc \ | ||
| 674 | - thread_base.h \ | ||
| 675 | - thread_interrupt.cc \ | ||
| 676 | - thread_interrupt.h \ | ||
| 677 | - uri_parser.cc \ | ||
| 678 | - uri_parser.h | ||
| 679 | - | ||
| 680 | -AM_CPPFLAGS = -I$(srcdir) -I$(srcdir)/.. -I$(srcdir)/../.. -I$(top_srcdir) | ||
| 681 | - | ||
| 682 | -libtorrentincludedir = $(includedir)/torrent/utils | ||
| 683 | -libtorrentinclude_HEADERS = \ | ||
| 684 | - directory_events.h \ | ||
| 685 | - extents.h \ | ||
| 686 | - log.h \ | ||
| 687 | - log_buffer.h \ | ||
| 688 | - option_strings.h \ | ||
| 689 | - ranges.h \ | ||
| 690 | - resume.h \ | ||
| 691 | - signal_bitfield.h \ | ||
| 692 | - thread_base.h \ | ||
| 693 | - thread_interrupt.h \ | ||
| 694 | - uri_parser.h | ||
| 695 | diff --git a/src/tracker/Makefile.am b/src/tracker/Makefile.am | ||
| 696 | deleted file mode 100644 | ||
| 697 | index 2f1ae5cf..00000000 | ||
| 698 | --- a/src/tracker/Makefile.am | ||
| 699 | +++ /dev/null | ||
| 700 | @@ -1,11 +0,0 @@ | ||
| 701 | -noinst_LTLIBRARIES = libsub_tracker.la | ||
| 702 | - | ||
| 703 | -libsub_tracker_la_SOURCES = \ | ||
| 704 | - tracker_dht.cc \ | ||
| 705 | - tracker_dht.h \ | ||
| 706 | - tracker_http.cc \ | ||
| 707 | - tracker_http.h \ | ||
| 708 | - tracker_udp.cc \ | ||
| 709 | - tracker_udp.h | ||
| 710 | - | ||
| 711 | -AM_CPPFLAGS = -I$(srcdir) -I$(srcdir)/.. -I$(top_srcdir) | ||
| 712 | diff --git a/src/utils/Makefile.am b/src/utils/Makefile.am | ||
| 713 | deleted file mode 100644 | ||
| 714 | index 27ce359b..00000000 | ||
| 715 | --- a/src/utils/Makefile.am | ||
| 716 | +++ /dev/null | ||
| 717 | @@ -1,14 +0,0 @@ | ||
| 718 | -noinst_LTLIBRARIES = libsub_utils.la | ||
| 719 | - | ||
| 720 | -libsub_utils_la_SOURCES = \ | ||
| 721 | - diffie_hellman.cc \ | ||
| 722 | - diffie_hellman.h \ | ||
| 723 | - instrumentation.cc \ | ||
| 724 | - instrumentation.h \ | ||
| 725 | - rc4.h \ | ||
| 726 | - sha1.h \ | ||
| 727 | - sha_fast.cc \ | ||
| 728 | - sha_fast.h \ | ||
| 729 | - queue_buckets.h | ||
| 730 | - | ||
| 731 | -AM_CPPFLAGS = -I$(srcdir) -I$(srcdir)/.. -I$(top_srcdir) | ||
| 732 | diff --git a/test/Makefile.am b/test/Makefile.am | ||
| 733 | index 23b260e4..8b0291bb 100644 | ||
| 734 | --- a/test/Makefile.am | ||
| 735 | +++ b/test/Makefile.am | ||
| 736 | @@ -1,25 +1,68 @@ | ||
| 737 | -SUBDIRS = torrent/net net | ||
| 738 | - | ||
| 739 | -TESTS = LibTorrentTest | ||
| 740 | -AUTOMAKE_OPTIONS = subdir-objects | ||
| 741 | +TESTS = \ | ||
| 742 | + LibTorrent_Test_Torrent_Net \ | ||
| 743 | + LibTorrent_Test_Net \ | ||
| 744 | + LibTorrent_Test | ||
| 745 | |||
| 746 | check_PROGRAMS = $(TESTS) | ||
| 747 | -LibTorrentTest_LDADD = \ | ||
| 748 | + | ||
| 749 | +LibTorrent_Test_LDADD = \ | ||
| 750 | ../src/libtorrent.la \ | ||
| 751 | - ../src/torrent/libsub_torrent.la \ | ||
| 752 | - ../src/torrent/data/libsub_torrentdata.la \ | ||
| 753 | - ../src/torrent/download/libsub_torrentdownload.la \ | ||
| 754 | - ../src/torrent/peer/libsub_torrentpeer.la \ | ||
| 755 | - ../src/data/libsub_data.la \ | ||
| 756 | - ../src/dht/libsub_dht.la \ | ||
| 757 | - ../src/net/libsub_net.la \ | ||
| 758 | - ../src/protocol/libsub_protocol.la \ | ||
| 759 | - ../src/download/libsub_download.la \ | ||
| 760 | - ../src/tracker/libsub_tracker.la \ | ||
| 761 | - ../src/utils/libsub_utils.la \ | ||
| 762 | - ../src/torrent/utils/libsub_torrentutils.la | ||
| 763 | + ../src/libtorrent_other.la \ | ||
| 764 | + ../src/torrent/libtorrent_torrent.la | ||
| 765 | + | ||
| 766 | +LibTorrent_Test_Net_LDADD = $(LibTorrent_Test_LDADD) | ||
| 767 | +LibTorrent_Test_Torrent_Net_LDADD = $(LibTorrent_Test_LDADD) | ||
| 768 | + | ||
| 769 | +# LibTorrent_Test_SOURCES = \ | ||
| 770 | +# helpers/expect_fd.h \ | ||
| 771 | +# helpers/expect_utils.h \ | ||
| 772 | +# helpers/mock_compare.h \ | ||
| 773 | +# helpers/mock_function.cc \ | ||
| 774 | +# helpers/mock_function.h \ | ||
| 775 | +# helpers/network.h \ | ||
| 776 | +# helpers/progress_listener.cc \ | ||
| 777 | +# helpers/progress_listener.h \ | ||
| 778 | +# helpers/test_fixture.cc \ | ||
| 779 | +# helpers/test_fixture.h | ||
| 780 | + | ||
| 781 | +LibTorrent_Test_Torrent_Net_SOURCES = \ | ||
| 782 | + main.cc \ | ||
| 783 | + helpers/expect_fd.h \ | ||
| 784 | + helpers/expect_utils.h \ | ||
| 785 | + helpers/mock_compare.h \ | ||
| 786 | + helpers/mock_function.cc \ | ||
| 787 | + helpers/mock_function.h \ | ||
| 788 | + helpers/network.h \ | ||
| 789 | + helpers/progress_listener.cc \ | ||
| 790 | + helpers/progress_listener.h \ | ||
| 791 | + helpers/test_fixture.cc \ | ||
| 792 | + helpers/test_fixture.h \ | ||
| 793 | + \ | ||
| 794 | + torrent/net/test_address_info.cc \ | ||
| 795 | + torrent/net/test_address_info.h \ | ||
| 796 | + torrent/net/test_fd.cc \ | ||
| 797 | + torrent/net/test_fd.h \ | ||
| 798 | + torrent/net/test_socket_address.cc \ | ||
| 799 | + torrent/net/test_socket_address.h | ||
| 800 | |||
| 801 | -LibTorrentTest_SOURCES = \ | ||
| 802 | +LibTorrent_Test_Net_SOURCES = \ | ||
| 803 | + main.cc \ | ||
| 804 | + helpers/expect_fd.h \ | ||
| 805 | + helpers/expect_utils.h \ | ||
| 806 | + helpers/mock_compare.h \ | ||
| 807 | + helpers/mock_function.cc \ | ||
| 808 | + helpers/mock_function.h \ | ||
| 809 | + helpers/network.h \ | ||
| 810 | + helpers/progress_listener.cc \ | ||
| 811 | + helpers/progress_listener.h \ | ||
| 812 | + helpers/test_fixture.cc \ | ||
| 813 | + helpers/test_fixture.h \ | ||
| 814 | + \ | ||
| 815 | + net/test_socket_listen.cc \ | ||
| 816 | + net/test_socket_listen.h | ||
| 817 | + | ||
| 818 | +LibTorrent_Test_SOURCES = \ | ||
| 819 | + main.cc \ | ||
| 820 | helpers/expect_fd.h \ | ||
| 821 | helpers/expect_utils.h \ | ||
| 822 | helpers/mock_compare.h \ | ||
| 823 | @@ -87,12 +130,15 @@ LibTorrentTest_SOURCES = \ | ||
| 824 | torrent/tracker_list_features_test.h \ | ||
| 825 | torrent/tracker_timeout_test.cc \ | ||
| 826 | torrent/tracker_timeout_test.h \ | ||
| 827 | - tracker/tracker_http_test.cc \ | ||
| 828 | - tracker/tracker_http_test.h \ | ||
| 829 | \ | ||
| 830 | - main.cc | ||
| 831 | + tracker/tracker_http_test.cc \ | ||
| 832 | + tracker/tracker_http_test.h | ||
| 833 | |||
| 834 | -LibTorrentTest_CXXFLAGS = $(CPPUNIT_CFLAGS) | ||
| 835 | -LibTorrentTest_LDFLAGS = $(CPPUNIT_LIBS) -ldl | ||
| 836 | +LibTorrent_Test_Torrent_Net_CXXFLAGS = $(CPPUNIT_CFLAGS) | ||
| 837 | +LibTorrent_Test_Torrent_Net_LDFLAGS = $(CPPUNIT_LIBS) -ldl | ||
| 838 | +LibTorrent_Test_Net_CXXFLAGS = $(CPPUNIT_CFLAGS) | ||
| 839 | +LibTorrent_Test_Net_LDFLAGS = $(CPPUNIT_LIBS) -ldl | ||
| 840 | +LibTorrent_Test_CXXFLAGS = $(CPPUNIT_CFLAGS) | ||
| 841 | +LibTorrent_Test_LDFLAGS = $(CPPUNIT_LIBS) -ldl | ||
| 842 | |||
| 843 | AM_CPPFLAGS = -I$(srcdir) -I$(top_srcdir) -I$(top_srcdir)/src | ||
diff --git a/meta-oe/recipes-connectivity/libtorrent/libtorrent/0033-Refactor-make-process.-207.patch b/meta-oe/recipes-connectivity/libtorrent/libtorrent/0033-Refactor-make-process.-207.patch new file mode 100644 index 0000000000..4c7a2038fb --- /dev/null +++ b/meta-oe/recipes-connectivity/libtorrent/libtorrent/0033-Refactor-make-process.-207.patch | |||
| @@ -0,0 +1,2710 @@ | |||
| 1 | From 9cdb950c0db2bad1a4d85b48f06419e2920aa114 Mon Sep 17 00:00:00 2001 | ||
| 2 | From: Jari Sundell <sundell.software@gmail.com> | ||
| 3 | Date: Fri, 20 Dec 2019 00:37:38 +0900 | ||
| 4 | Subject: [PATCH] Refactor make process. (#207) | ||
| 5 | |||
| 6 | --- | ||
| 7 | configure.ac | 3 +- | ||
| 8 | src/Makefile.am | 3 +- | ||
| 9 | src/manager.h | 36 --- | ||
| 10 | src/thread_disk.h | 51 +--- | ||
| 11 | src/torrent/utils/thread_base.cc | 36 --- | ||
| 12 | src/torrent/utils/thread_base.h | 48 +--- | ||
| 13 | test/Makefile.am | 140 +++++------ | ||
| 14 | ...{chunk_list_test.cc => test_chunk_list.cc} | 16 +- | ||
| 15 | .../{chunk_list_test.h => test_chunk_list.h} | 13 +- | ||
| 16 | ...queue_test.cc => test_hash_check_queue.cc} | 33 ++- | ||
| 17 | ...k_queue_test.h => test_hash_check_queue.h} | 22 +- | ||
| 18 | ...{hash_queue_test.cc => test_hash_queue.cc} | 66 +++--- | ||
| 19 | .../{hash_queue_test.h => test_hash_queue.h} | 11 +- | ||
| 20 | test/helpers/progress_listener.cc | 4 +- | ||
| 21 | test/helpers/test_fixture.h | 28 +-- | ||
| 22 | test/helpers/test_thread.cc | 71 ++++++ | ||
| 23 | test/helpers/test_thread.h | 59 +++++ | ||
| 24 | test/helpers/test_utils.h | 16 ++ | ||
| 25 | test/helpers/utils.h | 120 +++++----- | ||
| 26 | test/main.cc | 4 +- | ||
| 27 | test/torrent/{http_test.cc => test_http.cc} | 17 +- | ||
| 28 | test/torrent/{http_test.h => test_http.h} | 11 +- | ||
| 29 | test/torrent/utils/option_strings_test.h | 17 -- | ||
| 30 | test/torrent/utils/signal_bitfield_test.h | 23 -- | ||
| 31 | test/torrent/utils/test_extents.cc | 63 ++--- | ||
| 32 | test/torrent/utils/test_extents.h | 9 +- | ||
| 33 | .../utils/{log_test.cc => test_log.cc} | 26 +- | ||
| 34 | test/torrent/utils/{log_test.h => test_log.h} | 8 +- | ||
| 35 | test/torrent/utils/test_log_buffer.cc | 11 +- | ||
| 36 | test/torrent/utils/test_log_buffer.h | 5 - | ||
| 37 | ...strings_test.cc => test_option_strings.cc} | 29 +-- | ||
| 38 | test/torrent/utils/test_option_strings.h | 10 + | ||
| 39 | test/torrent/utils/test_queue_buckets.cc | 12 +- | ||
| 40 | test/torrent/utils/test_queue_buckets.h | 11 +- | ||
| 41 | ...tfield_test.cc => test_signal_bitfield.cc} | 31 ++- | ||
| 42 | test/torrent/utils/test_signal_bitfield.h | 22 ++ | ||
| 43 | test/torrent/utils/test_thread_base.cc | 169 +++++++++++++ | ||
| 44 | test/torrent/utils/test_thread_base.h | 25 ++ | ||
| 45 | test/torrent/utils/test_uri_parser.cc | 31 +-- | ||
| 46 | test/torrent/utils/test_uri_parser.h | 11 +- | ||
| 47 | test/torrent/utils/thread_base_test.cc | 224 ------------------ | ||
| 48 | test/torrent/utils/thread_base_test.h | 86 ------- | ||
| 49 | test/tracker/test_tracker_http.cc | 11 + | ||
| 50 | test/tracker/test_tracker_http.h | 12 + | ||
| 51 | test/tracker/tracker_http_test.cc | 17 -- | ||
| 52 | test/tracker/tracker_http_test.h | 18 -- | ||
| 53 | 46 files changed, 735 insertions(+), 954 deletions(-) | ||
| 54 | rename test/data/{chunk_list_test.cc => test_chunk_list.cc} (93%) | ||
| 55 | rename test/data/{chunk_list_test.h => test_chunk_list.h} (88%) | ||
| 56 | rename test/data/{hash_check_queue_test.cc => test_hash_check_queue.cc} (92%) | ||
| 57 | rename test/data/{hash_check_queue_test.h => test_hash_check_queue.h} (63%) | ||
| 58 | rename test/data/{hash_queue_test.cc => test_hash_queue.cc} (82%) | ||
| 59 | rename test/data/{hash_queue_test.h => test_hash_queue.h} (58%) | ||
| 60 | create mode 100755 test/helpers/test_thread.cc | ||
| 61 | create mode 100755 test/helpers/test_thread.h | ||
| 62 | create mode 100644 test/helpers/test_utils.h | ||
| 63 | rename test/torrent/{http_test.cc => test_http.cc} (94%) | ||
| 64 | rename test/torrent/{http_test.h => test_http.h} (63%) | ||
| 65 | delete mode 100644 test/torrent/utils/option_strings_test.h | ||
| 66 | delete mode 100644 test/torrent/utils/signal_bitfield_test.h | ||
| 67 | rename test/torrent/utils/{log_test.cc => test_log.cc} (92%) | ||
| 68 | rename test/torrent/utils/{log_test.h => test_log.h} (71%) | ||
| 69 | rename test/torrent/utils/{option_strings_test.cc => test_option_strings.cc} (65%) | ||
| 70 | create mode 100644 test/torrent/utils/test_option_strings.h | ||
| 71 | rename test/torrent/utils/{signal_bitfield_test.cc => test_signal_bitfield.cc} (85%) | ||
| 72 | create mode 100644 test/torrent/utils/test_signal_bitfield.h | ||
| 73 | create mode 100644 test/torrent/utils/test_thread_base.cc | ||
| 74 | create mode 100644 test/torrent/utils/test_thread_base.h | ||
| 75 | delete mode 100644 test/torrent/utils/thread_base_test.cc | ||
| 76 | delete mode 100644 test/torrent/utils/thread_base_test.h | ||
| 77 | create mode 100644 test/tracker/test_tracker_http.cc | ||
| 78 | create mode 100644 test/tracker/test_tracker_http.h | ||
| 79 | delete mode 100644 test/tracker/tracker_http_test.cc | ||
| 80 | delete mode 100644 test/tracker/tracker_http_test.h | ||
| 81 | |||
| 82 | diff --git a/configure.ac b/configure.ac | ||
| 83 | index e83710cc..88a46edd 100644 | ||
| 84 | --- a/configure.ac | ||
| 85 | +++ b/configure.ac | ||
| 86 | @@ -21,6 +21,7 @@ AM_INIT_AUTOMAKE([serial-tests subdir-objects]) | ||
| 87 | AC_CONFIG_HEADERS(config.h) | ||
| 88 | |||
| 89 | AC_PROG_CXX | ||
| 90 | +AC_SYS_LARGEFILE | ||
| 91 | |||
| 92 | AC_C_BIGENDIAN( | ||
| 93 | AC_DEFINE(IS_BIG_ENDIAN, 1, Big endian), | ||
| 94 | @@ -37,8 +38,6 @@ RAK_DISABLE_BACKTRACE | ||
| 95 | |||
| 96 | RAK_CHECK_CXX11 | ||
| 97 | |||
| 98 | -AC_SYS_LARGEFILE | ||
| 99 | - | ||
| 100 | TORRENT_ENABLE_ALIGNED | ||
| 101 | TORRENT_ENABLE_INTERRUPT_SOCKET | ||
| 102 | |||
| 103 | diff --git a/src/Makefile.am b/src/Makefile.am | ||
| 104 | index e96bd74b..95e6a7ae 100644 | ||
| 105 | --- a/src/Makefile.am | ||
| 106 | +++ b/src/Makefile.am | ||
| 107 | @@ -1,7 +1,8 @@ | ||
| 108 | SUBDIRS = torrent | ||
| 109 | |||
| 110 | lib_LTLIBRARIES = libtorrent.la | ||
| 111 | -noinst_LTLIBRARIES = libtorrent_other.la | ||
| 112 | +noinst_LTLIBRARIES = \ | ||
| 113 | + libtorrent_other.la | ||
| 114 | |||
| 115 | libtorrent_la_LDFLAGS = -version-info $(LIBTORRENT_INTERFACE_VERSION_INFO) | ||
| 116 | libtorrent_la_LIBADD = \ | ||
| 117 | diff --git a/src/manager.h b/src/manager.h | ||
| 118 | index 1db81e9b..1ada9567 100644 | ||
| 119 | --- a/src/manager.h | ||
| 120 | +++ b/src/manager.h | ||
| 121 | @@ -1,39 +1,3 @@ | ||
| 122 | -// libTorrent - BitTorrent library | ||
| 123 | -// Copyright (C) 2005-2011, Jari Sundell | ||
| 124 | -// | ||
| 125 | -// This program is free software; you can redistribute it and/or modify | ||
| 126 | -// it under the terms of the GNU General Public License as published by | ||
| 127 | -// the Free Software Foundation; either version 2 of the License, or | ||
| 128 | -// (at your option) any later version. | ||
| 129 | -// | ||
| 130 | -// This program is distributed in the hope that it will be useful, | ||
| 131 | -// but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
| 132 | -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
| 133 | -// GNU General Public License for more details. | ||
| 134 | -// | ||
| 135 | -// You should have received a copy of the GNU General Public License | ||
| 136 | -// along with this program; if not, write to the Free Software | ||
| 137 | -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | ||
| 138 | -// | ||
| 139 | -// In addition, as a special exception, the copyright holders give | ||
| 140 | -// permission to link the code of portions of this program with the | ||
| 141 | -// OpenSSL library under certain conditions as described in each | ||
| 142 | -// individual source file, and distribute linked combinations | ||
| 143 | -// including the two. | ||
| 144 | -// | ||
| 145 | -// You must obey the GNU General Public License in all respects for | ||
| 146 | -// all of the code used other than OpenSSL. If you modify file(s) | ||
| 147 | -// with this exception, you may extend this exception to your version | ||
| 148 | -// of the file(s), but you are not obligated to do so. If you do not | ||
| 149 | -// wish to do so, delete this exception statement from your version. | ||
| 150 | -// If you delete this exception statement from all source files in the | ||
| 151 | -// program, then also delete it here. | ||
| 152 | -// | ||
| 153 | -// Contact: Jari Sundell <jaris@ifi.uio.no> | ||
| 154 | -// | ||
| 155 | -// Skomakerveien 33 | ||
| 156 | -// 3185 Skoppum, NORWAY | ||
| 157 | - | ||
| 158 | #ifndef LIBTORRENT_MANAGER_H | ||
| 159 | #define LIBTORRENT_MANAGER_H | ||
| 160 | |||
| 161 | diff --git a/src/thread_disk.h b/src/thread_disk.h | ||
| 162 | index fa1fcb7e..7b378915 100644 | ||
| 163 | --- a/src/thread_disk.h | ||
| 164 | +++ b/src/thread_disk.h | ||
| 165 | @@ -1,39 +1,3 @@ | ||
| 166 | -// libTorrent - BitTorrent library | ||
| 167 | -// Copyright (C) 2005-2011, Jari Sundell | ||
| 168 | -// | ||
| 169 | -// This program is free software; you can redistribute it and/or modify | ||
| 170 | -// it under the terms of the GNU General Public License as published by | ||
| 171 | -// the Free Software Foundation; either version 2 of the License, or | ||
| 172 | -// (at your option) any later version. | ||
| 173 | -// | ||
| 174 | -// This program is distributed in the hope that it will be useful, | ||
| 175 | -// but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
| 176 | -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
| 177 | -// GNU General Public License for more details. | ||
| 178 | -// | ||
| 179 | -// You should have received a copy of the GNU General Public License | ||
| 180 | -// along with this program; if not, write to the Free Software | ||
| 181 | -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | ||
| 182 | -// | ||
| 183 | -// In addition, as a special exception, the copyright holders give | ||
| 184 | -// permission to link the code of portions of this program with the | ||
| 185 | -// OpenSSL library under certain conditions as described in each | ||
| 186 | -// individual source file, and distribute linked combinations | ||
| 187 | -// including the two. | ||
| 188 | -// | ||
| 189 | -// You must obey the GNU General Public License in all respects for | ||
| 190 | -// all of the code used other than OpenSSL. If you modify file(s) | ||
| 191 | -// with this exception, you may extend this exception to your version | ||
| 192 | -// of the file(s), but you are not obligated to do so. If you do not | ||
| 193 | -// wish to do so, delete this exception statement from your version. | ||
| 194 | -// If you delete this exception statement from all source files in the | ||
| 195 | -// program, then also delete it here. | ||
| 196 | -// | ||
| 197 | -// Contact: Jari Sundell <jaris@ifi.uio.no> | ||
| 198 | -// | ||
| 199 | -// Skomakerveien 33 | ||
| 200 | -// 3185 Skoppum, NORWAY | ||
| 201 | - | ||
| 202 | #ifndef LIBTORRENT_THREAD_DISK_H | ||
| 203 | #define LIBTORRENT_THREAD_DISK_H | ||
| 204 | |||
| 205 | @@ -42,19 +6,18 @@ | ||
| 206 | |||
| 207 | namespace torrent { | ||
| 208 | |||
| 209 | -class thread_disk : public thread_base { | ||
| 210 | +class LIBTORRENT_EXPORT thread_disk : public thread_base { | ||
| 211 | public: | ||
| 212 | - const char* name() const { return "rtorrent disk"; } | ||
| 213 | - | ||
| 214 | - virtual void init_thread(); | ||
| 215 | + const char* name() const { return "rtorrent disk"; } | ||
| 216 | + HashCheckQueue* hash_queue() { return &m_hash_queue; } | ||
| 217 | |||
| 218 | - HashCheckQueue* hash_queue() { return &m_hash_queue; } | ||
| 219 | + virtual void init_thread(); | ||
| 220 | |||
| 221 | protected: | ||
| 222 | - virtual void call_events(); | ||
| 223 | - virtual int64_t next_timeout_usec(); | ||
| 224 | + virtual void call_events(); | ||
| 225 | + virtual int64_t next_timeout_usec(); | ||
| 226 | |||
| 227 | - HashCheckQueue m_hash_queue; | ||
| 228 | + HashCheckQueue m_hash_queue; | ||
| 229 | }; | ||
| 230 | |||
| 231 | } | ||
| 232 | diff --git a/src/torrent/utils/thread_base.cc b/src/torrent/utils/thread_base.cc | ||
| 233 | index 778e4c38..99d6355d 100644 | ||
| 234 | --- a/src/torrent/utils/thread_base.cc | ||
| 235 | +++ b/src/torrent/utils/thread_base.cc | ||
| 236 | @@ -1,39 +1,3 @@ | ||
| 237 | -// libTorrent - BitTorrent library | ||
| 238 | -// Copyright (C) 2005-2011, Jari Sundell | ||
| 239 | -// | ||
| 240 | -// This program is free software; you can redistribute it and/or modify | ||
| 241 | -// it under the terms of the GNU General Public License as published by | ||
| 242 | -// the Free Software Foundation; either version 2 of the License, or | ||
| 243 | -// (at your option) any later version. | ||
| 244 | -// | ||
| 245 | -// This program is distributed in the hope that it will be useful, | ||
| 246 | -// but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
| 247 | -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
| 248 | -// GNU General Public License for more details. | ||
| 249 | -// | ||
| 250 | -// You should have received a copy of the GNU General Public License | ||
| 251 | -// along with this program; if not, write to the Free Software | ||
| 252 | -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | ||
| 253 | -// | ||
| 254 | -// In addition, as a special exception, the copyright holders give | ||
| 255 | -// permission to link the code of portions of this program with the | ||
| 256 | -// OpenSSL library under certain conditions as described in each | ||
| 257 | -// individual source file, and distribute linked combinations | ||
| 258 | -// including the two. | ||
| 259 | -// | ||
| 260 | -// You must obey the GNU General Public License in all respects for | ||
| 261 | -// all of the code used other than OpenSSL. If you modify file(s) | ||
| 262 | -// with this exception, you may extend this exception to your version | ||
| 263 | -// of the file(s), but you are not obligated to do so. If you do not | ||
| 264 | -// wish to do so, delete this exception statement from your version. | ||
| 265 | -// If you delete this exception statement from all source files in the | ||
| 266 | -// program, then also delete it here. | ||
| 267 | -// | ||
| 268 | -// Contact: Jari Sundell <jaris@ifi.uio.no> | ||
| 269 | -// | ||
| 270 | -// Skomakerveien 33 | ||
| 271 | -// 3185 Skoppum, NORWAY | ||
| 272 | - | ||
| 273 | #include "config.h" | ||
| 274 | |||
| 275 | #include <cstring> | ||
| 276 | diff --git a/src/torrent/utils/thread_base.h b/src/torrent/utils/thread_base.h | ||
| 277 | index b92a98ba..bead9659 100644 | ||
| 278 | --- a/src/torrent/utils/thread_base.h | ||
| 279 | +++ b/src/torrent/utils/thread_base.h | ||
| 280 | @@ -1,48 +1,12 @@ | ||
| 281 | -// libTorrent - BitTorrent library | ||
| 282 | -// Copyright (C) 2005-2011, Jari Sundell | ||
| 283 | -// | ||
| 284 | -// This program is free software; you can redistribute it and/or modify | ||
| 285 | -// it under the terms of the GNU General Public License as published by | ||
| 286 | -// the Free Software Foundation; either version 2 of the License, or | ||
| 287 | -// (at your option) any later version. | ||
| 288 | -// | ||
| 289 | -// This program is distributed in the hope that it will be useful, | ||
| 290 | -// but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
| 291 | -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
| 292 | -// GNU General Public License for more details. | ||
| 293 | -// | ||
| 294 | -// You should have received a copy of the GNU General Public License | ||
| 295 | -// along with this program; if not, write to the Free Software | ||
| 296 | -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | ||
| 297 | -// | ||
| 298 | -// In addition, as a special exception, the copyright holders give | ||
| 299 | -// permission to link the code of portions of this program with the | ||
| 300 | -// OpenSSL library under certain conditions as described in each | ||
| 301 | -// individual source file, and distribute linked combinations | ||
| 302 | -// including the two. | ||
| 303 | -// | ||
| 304 | -// You must obey the GNU General Public License in all respects for | ||
| 305 | -// all of the code used other than OpenSSL. If you modify file(s) | ||
| 306 | -// with this exception, you may extend this exception to your version | ||
| 307 | -// of the file(s), but you are not obligated to do so. If you do not | ||
| 308 | -// wish to do so, delete this exception statement from your version. | ||
| 309 | -// If you delete this exception statement from all source files in the | ||
| 310 | -// program, then also delete it here. | ||
| 311 | -// | ||
| 312 | -// Contact: Jari Sundell <jaris@ifi.uio.no> | ||
| 313 | -// | ||
| 314 | -// Skomakerveien 33 | ||
| 315 | -// 3185 Skoppum, NORWAY | ||
| 316 | - | ||
| 317 | #ifndef LIBTORRENT_UTILS_THREAD_BASE_H | ||
| 318 | #define LIBTORRENT_UTILS_THREAD_BASE_H | ||
| 319 | |||
| 320 | -#include <functional> | ||
| 321 | -#include <pthread.h> | ||
| 322 | -#include <sys/types.h> | ||
| 323 | +#import <functional> | ||
| 324 | +#import <pthread.h> | ||
| 325 | +#import <sys/types.h> | ||
| 326 | |||
| 327 | -#include <torrent/common.h> | ||
| 328 | -#include <torrent/utils/signal_bitfield.h> | ||
| 329 | +#import <torrent/common.h> | ||
| 330 | +#import <torrent/utils/signal_bitfield.h> | ||
| 331 | |||
| 332 | namespace torrent { | ||
| 333 | |||
| 334 | @@ -54,7 +18,7 @@ public: | ||
| 335 | typedef void* (*pthread_func)(void*); | ||
| 336 | typedef std::function<void ()> slot_void; | ||
| 337 | typedef std::function<uint64_t ()> slot_timer; | ||
| 338 | - typedef class signal_bitfield signal_type; | ||
| 339 | + typedef class signal_bitfield signal_type; | ||
| 340 | |||
| 341 | enum state_type { | ||
| 342 | STATE_UNKNOWN, | ||
| 343 | diff --git a/test/Makefile.am b/test/Makefile.am | ||
| 344 | index 8b0291bb..cb00dce3 100644 | ||
| 345 | --- a/test/Makefile.am | ||
| 346 | +++ b/test/Makefile.am | ||
| 347 | @@ -1,6 +1,10 @@ | ||
| 348 | TESTS = \ | ||
| 349 | LibTorrent_Test_Torrent_Net \ | ||
| 350 | + LibTorrent_Test_Torrent_Utils \ | ||
| 351 | + LibTorrent_Test_Torrent \ | ||
| 352 | + LibTorrent_Test_Data \ | ||
| 353 | LibTorrent_Test_Net \ | ||
| 354 | + LibTorrent_Test_Tracker \ | ||
| 355 | LibTorrent_Test | ||
| 356 | |||
| 357 | check_PROGRAMS = $(TESTS) | ||
| 358 | @@ -10,22 +14,14 @@ LibTorrent_Test_LDADD = \ | ||
| 359 | ../src/libtorrent_other.la \ | ||
| 360 | ../src/torrent/libtorrent_torrent.la | ||
| 361 | |||
| 362 | -LibTorrent_Test_Net_LDADD = $(LibTorrent_Test_LDADD) | ||
| 363 | LibTorrent_Test_Torrent_Net_LDADD = $(LibTorrent_Test_LDADD) | ||
| 364 | +LibTorrent_Test_Torrent_Utils_LDADD = $(LibTorrent_Test_LDADD) | ||
| 365 | +LibTorrent_Test_Torrent_LDADD = $(LibTorrent_Test_LDADD) | ||
| 366 | +LibTorrent_Test_Data_LDADD = $(LibTorrent_Test_LDADD) | ||
| 367 | +LibTorrent_Test_Net_LDADD = $(LibTorrent_Test_LDADD) | ||
| 368 | +LibTorrent_Test_Tracker_LDADD = $(LibTorrent_Test_LDADD) | ||
| 369 | |||
| 370 | -# LibTorrent_Test_SOURCES = \ | ||
| 371 | -# helpers/expect_fd.h \ | ||
| 372 | -# helpers/expect_utils.h \ | ||
| 373 | -# helpers/mock_compare.h \ | ||
| 374 | -# helpers/mock_function.cc \ | ||
| 375 | -# helpers/mock_function.h \ | ||
| 376 | -# helpers/network.h \ | ||
| 377 | -# helpers/progress_listener.cc \ | ||
| 378 | -# helpers/progress_listener.h \ | ||
| 379 | -# helpers/test_fixture.cc \ | ||
| 380 | -# helpers/test_fixture.h | ||
| 381 | - | ||
| 382 | -LibTorrent_Test_Torrent_Net_SOURCES = \ | ||
| 383 | +LibTorrent_Test_Common = \ | ||
| 384 | main.cc \ | ||
| 385 | helpers/expect_fd.h \ | ||
| 386 | helpers/expect_utils.h \ | ||
| 387 | @@ -37,7 +33,10 @@ LibTorrent_Test_Torrent_Net_SOURCES = \ | ||
| 388 | helpers/progress_listener.h \ | ||
| 389 | helpers/test_fixture.cc \ | ||
| 390 | helpers/test_fixture.h \ | ||
| 391 | - \ | ||
| 392 | + helpers/test_thread.cc \ | ||
| 393 | + helpers/test_thread.h | ||
| 394 | + | ||
| 395 | +LibTorrent_Test_Torrent_Net_SOURCES = $(LibTorrent_Test_Common) \ | ||
| 396 | torrent/net/test_address_info.cc \ | ||
| 397 | torrent/net/test_address_info.h \ | ||
| 398 | torrent/net/test_fd.cc \ | ||
| 399 | @@ -45,71 +44,28 @@ LibTorrent_Test_Torrent_Net_SOURCES = \ | ||
| 400 | torrent/net/test_socket_address.cc \ | ||
| 401 | torrent/net/test_socket_address.h | ||
| 402 | |||
| 403 | -LibTorrent_Test_Net_SOURCES = \ | ||
| 404 | - main.cc \ | ||
| 405 | - helpers/expect_fd.h \ | ||
| 406 | - helpers/expect_utils.h \ | ||
| 407 | - helpers/mock_compare.h \ | ||
| 408 | - helpers/mock_function.cc \ | ||
| 409 | - helpers/mock_function.h \ | ||
| 410 | - helpers/network.h \ | ||
| 411 | - helpers/progress_listener.cc \ | ||
| 412 | - helpers/progress_listener.h \ | ||
| 413 | - helpers/test_fixture.cc \ | ||
| 414 | - helpers/test_fixture.h \ | ||
| 415 | - \ | ||
| 416 | - net/test_socket_listen.cc \ | ||
| 417 | - net/test_socket_listen.h | ||
| 418 | - | ||
| 419 | -LibTorrent_Test_SOURCES = \ | ||
| 420 | - main.cc \ | ||
| 421 | - helpers/expect_fd.h \ | ||
| 422 | - helpers/expect_utils.h \ | ||
| 423 | - helpers/mock_compare.h \ | ||
| 424 | - helpers/mock_function.cc \ | ||
| 425 | - helpers/mock_function.h \ | ||
| 426 | - helpers/network.h \ | ||
| 427 | - helpers/progress_listener.cc \ | ||
| 428 | - helpers/progress_listener.h \ | ||
| 429 | - helpers/test_fixture.cc \ | ||
| 430 | - helpers/test_fixture.h \ | ||
| 431 | - \ | ||
| 432 | - ../src/thread_disk.cc \ | ||
| 433 | - ../src/thread_disk.h \ | ||
| 434 | - \ | ||
| 435 | - rak/allocators_test.cc \ | ||
| 436 | - rak/allocators_test.h \ | ||
| 437 | - rak/ranges_test.cc \ | ||
| 438 | - rak/ranges_test.h \ | ||
| 439 | - data/chunk_list_test.cc \ | ||
| 440 | - data/chunk_list_test.h \ | ||
| 441 | - data/hash_check_queue_test.cc \ | ||
| 442 | - data/hash_check_queue_test.h \ | ||
| 443 | - data/hash_queue_test.cc \ | ||
| 444 | - data/hash_queue_test.h \ | ||
| 445 | - \ | ||
| 446 | - protocol/test_request_list.cc \ | ||
| 447 | - protocol/test_request_list.h \ | ||
| 448 | - \ | ||
| 449 | - torrent/utils/log_test.cc \ | ||
| 450 | - torrent/utils/log_test.h \ | ||
| 451 | - torrent/utils/option_strings_test.cc \ | ||
| 452 | - torrent/utils/option_strings_test.h \ | ||
| 453 | +LibTorrent_Test_Torrent_Utils_SOURCES = $(LibTorrent_Test_Common) \ | ||
| 454 | torrent/utils/test_extents.cc \ | ||
| 455 | torrent/utils/test_extents.h \ | ||
| 456 | + torrent/utils/test_log.cc \ | ||
| 457 | + torrent/utils/test_log.h \ | ||
| 458 | torrent/utils/test_log_buffer.cc \ | ||
| 459 | torrent/utils/test_log_buffer.h \ | ||
| 460 | + torrent/utils/test_option_strings.cc \ | ||
| 461 | + torrent/utils/test_option_strings.h \ | ||
| 462 | torrent/utils/test_queue_buckets.cc \ | ||
| 463 | torrent/utils/test_queue_buckets.h \ | ||
| 464 | + torrent/utils/test_signal_bitfield.cc \ | ||
| 465 | + torrent/utils/test_signal_bitfield.h \ | ||
| 466 | + torrent/utils/test_thread_base.cc \ | ||
| 467 | + torrent/utils/test_thread_base.h \ | ||
| 468 | torrent/utils/test_uri_parser.cc \ | ||
| 469 | - torrent/utils/test_uri_parser.h \ | ||
| 470 | - torrent/utils/signal_bitfield_test.cc \ | ||
| 471 | - torrent/utils/signal_bitfield_test.h \ | ||
| 472 | - torrent/utils/thread_base_test.cc \ | ||
| 473 | - torrent/utils/thread_base_test.h \ | ||
| 474 | + torrent/utils/test_uri_parser.h | ||
| 475 | + | ||
| 476 | +LibTorrent_Test_Torrent_SOURCES = $(LibTorrent_Test_Common) \ | ||
| 477 | + torrent/test_http.cc \ | ||
| 478 | + torrent/test_http.h \ | ||
| 479 | \ | ||
| 480 | - torrent/http_test.cc \ | ||
| 481 | - torrent/http_test.h \ | ||
| 482 | torrent/object_test.cc \ | ||
| 483 | torrent/object_test.h \ | ||
| 484 | torrent/object_test_utils.cc \ | ||
| 485 | @@ -129,15 +85,49 @@ LibTorrent_Test_SOURCES = \ | ||
| 486 | torrent/tracker_list_features_test.cc \ | ||
| 487 | torrent/tracker_list_features_test.h \ | ||
| 488 | torrent/tracker_timeout_test.cc \ | ||
| 489 | - torrent/tracker_timeout_test.h \ | ||
| 490 | + torrent/tracker_timeout_test.h | ||
| 491 | + | ||
| 492 | +LibTorrent_Test_Data_SOURCES = $(LibTorrent_Test_Common) \ | ||
| 493 | + data/test_chunk_list.cc \ | ||
| 494 | + data/test_chunk_list.h \ | ||
| 495 | + data/test_hash_check_queue.cc \ | ||
| 496 | + data/test_hash_check_queue.h \ | ||
| 497 | + data/test_hash_queue.cc \ | ||
| 498 | + data/test_hash_queue.h | ||
| 499 | + | ||
| 500 | +LibTorrent_Test_Net_SOURCES = $(LibTorrent_Test_Common) \ | ||
| 501 | + net/test_socket_listen.cc \ | ||
| 502 | + net/test_socket_listen.h | ||
| 503 | + | ||
| 504 | +LibTorrent_Test_Tracker_SOURCES = $(LibTorrent_Test_Common) \ | ||
| 505 | + tracker/test_tracker_http.cc \ | ||
| 506 | + tracker/test_tracker_http.h | ||
| 507 | + | ||
| 508 | +LibTorrent_Test_SOURCES = $(LibTorrent_Test_Common) \ | ||
| 509 | + \ | ||
| 510 | + ../src/thread_disk.cc \ | ||
| 511 | + ../src/thread_disk.h \ | ||
| 512 | \ | ||
| 513 | - tracker/tracker_http_test.cc \ | ||
| 514 | - tracker/tracker_http_test.h | ||
| 515 | + rak/allocators_test.cc \ | ||
| 516 | + rak/allocators_test.h \ | ||
| 517 | + rak/ranges_test.cc \ | ||
| 518 | + rak/ranges_test.h \ | ||
| 519 | + \ | ||
| 520 | + protocol/test_request_list.cc \ | ||
| 521 | + protocol/test_request_list.h | ||
| 522 | |||
| 523 | LibTorrent_Test_Torrent_Net_CXXFLAGS = $(CPPUNIT_CFLAGS) | ||
| 524 | LibTorrent_Test_Torrent_Net_LDFLAGS = $(CPPUNIT_LIBS) -ldl | ||
| 525 | +LibTorrent_Test_Torrent_Utils_CXXFLAGS = $(CPPUNIT_CFLAGS) | ||
| 526 | +LibTorrent_Test_Torrent_Utils_LDFLAGS = $(CPPUNIT_LIBS) -ldl | ||
| 527 | +LibTorrent_Test_Torrent_CXXFLAGS = $(CPPUNIT_CFLAGS) | ||
| 528 | +LibTorrent_Test_Torrent_LDFLAGS = $(CPPUNIT_LIBS) -ldl | ||
| 529 | +LibTorrent_Test_Data_CXXFLAGS = $(CPPUNIT_CFLAGS) | ||
| 530 | +LibTorrent_Test_Data_LDFLAGS = $(CPPUNIT_LIBS) -ldl | ||
| 531 | LibTorrent_Test_Net_CXXFLAGS = $(CPPUNIT_CFLAGS) | ||
| 532 | LibTorrent_Test_Net_LDFLAGS = $(CPPUNIT_LIBS) -ldl | ||
| 533 | +LibTorrent_Test_Tracker_CXXFLAGS = $(CPPUNIT_CFLAGS) | ||
| 534 | +LibTorrent_Test_Tracker_LDFLAGS = $(CPPUNIT_LIBS) -ldl | ||
| 535 | LibTorrent_Test_CXXFLAGS = $(CPPUNIT_CFLAGS) | ||
| 536 | LibTorrent_Test_LDFLAGS = $(CPPUNIT_LIBS) -ldl | ||
| 537 | |||
| 538 | diff --git a/test/data/chunk_list_test.cc b/test/data/test_chunk_list.cc | ||
| 539 | similarity index 93% | ||
| 540 | rename from test/data/chunk_list_test.cc | ||
| 541 | rename to test/data/test_chunk_list.cc | ||
| 542 | index 28647db2..18de597e 100644 | ||
| 543 | --- a/test/data/chunk_list_test.cc | ||
| 544 | +++ b/test/data/test_chunk_list.cc | ||
| 545 | @@ -1,11 +1,11 @@ | ||
| 546 | -#include "config.h" | ||
| 547 | +#import "config.h" | ||
| 548 | |||
| 549 | -#include "chunk_list_test.h" | ||
| 550 | +#import "test_chunk_list.h" | ||
| 551 | |||
| 552 | -#include "torrent/chunk_manager.h" | ||
| 553 | -#include "torrent/exceptions.h" | ||
| 554 | +#import "torrent/chunk_manager.h" | ||
| 555 | +#import "torrent/exceptions.h" | ||
| 556 | |||
| 557 | -CPPUNIT_TEST_SUITE_REGISTRATION(ChunkListTest); | ||
| 558 | +CPPUNIT_TEST_SUITE_NAMED_REGISTRATION(test_chunk_list, "data"); | ||
| 559 | |||
| 560 | torrent::Chunk* | ||
| 561 | func_create_chunk(uint32_t index, int prot_flags) { | ||
| 562 | @@ -36,7 +36,7 @@ func_storage_error(torrent::ChunkList* chunk_list, const std::string& message) { | ||
| 563 | } | ||
| 564 | |||
| 565 | void | ||
| 566 | -ChunkListTest::test_basic() { | ||
| 567 | +test_chunk_list::test_basic() { | ||
| 568 | torrent::ChunkManager chunk_manager; | ||
| 569 | torrent::ChunkList chunk_list; | ||
| 570 | |||
| 571 | @@ -55,7 +55,7 @@ ChunkListTest::test_basic() { | ||
| 572 | } | ||
| 573 | |||
| 574 | void | ||
| 575 | -ChunkListTest::test_get_release() { | ||
| 576 | +test_chunk_list::test_get_release() { | ||
| 577 | SETUP_CHUNK_LIST(); | ||
| 578 | |||
| 579 | CPPUNIT_ASSERT(!(*chunk_list)[0].is_valid()); | ||
| 580 | @@ -112,7 +112,7 @@ ChunkListTest::test_get_release() { | ||
| 581 | |||
| 582 | // Make sure we can't go into writable when blocking, etc. | ||
| 583 | void | ||
| 584 | -ChunkListTest::test_blocking() { | ||
| 585 | +test_chunk_list::test_blocking() { | ||
| 586 | SETUP_CHUNK_LIST(); | ||
| 587 | |||
| 588 | torrent::ChunkHandle handle_0_ro = chunk_list->get(0, torrent::ChunkList::get_blocking); | ||
| 589 | diff --git a/test/data/chunk_list_test.h b/test/data/test_chunk_list.h | ||
| 590 | similarity index 88% | ||
| 591 | rename from test/data/chunk_list_test.h | ||
| 592 | rename to test/data/test_chunk_list.h | ||
| 593 | index 3979982f..85d1f77b 100644 | ||
| 594 | --- a/test/data/chunk_list_test.h | ||
| 595 | +++ b/test/data/test_chunk_list.h | ||
| 596 | @@ -1,23 +1,22 @@ | ||
| 597 | -#include <cppunit/extensions/HelperMacros.h> | ||
| 598 | +#import "helpers/test_fixture.h" | ||
| 599 | |||
| 600 | -#include "data/chunk_list.h" | ||
| 601 | +class test_chunk_list : public test_fixture { | ||
| 602 | + CPPUNIT_TEST_SUITE(test_chunk_list); | ||
| 603 | |||
| 604 | -class ChunkListTest : public CppUnit::TestFixture { | ||
| 605 | - CPPUNIT_TEST_SUITE(ChunkListTest); | ||
| 606 | CPPUNIT_TEST(test_basic); | ||
| 607 | CPPUNIT_TEST(test_get_release); | ||
| 608 | CPPUNIT_TEST(test_blocking); | ||
| 609 | + | ||
| 610 | CPPUNIT_TEST_SUITE_END(); | ||
| 611 | |||
| 612 | public: | ||
| 613 | - void setUp() {} | ||
| 614 | - void tearDown() {} | ||
| 615 | - | ||
| 616 | void test_basic(); | ||
| 617 | void test_get_release(); | ||
| 618 | void test_blocking(); | ||
| 619 | }; | ||
| 620 | |||
| 621 | +#include "data/chunk_list.h" | ||
| 622 | + | ||
| 623 | torrent::Chunk* func_create_chunk(uint32_t index, int prot_flags); | ||
| 624 | uint64_t func_free_diskspace(torrent::ChunkList* chunk_list); | ||
| 625 | void func_storage_error(torrent::ChunkList* chunk_list, const std::string& message); | ||
| 626 | diff --git a/test/data/hash_check_queue_test.cc b/test/data/test_hash_check_queue.cc | ||
| 627 | similarity index 92% | ||
| 628 | rename from test/data/hash_check_queue_test.cc | ||
| 629 | rename to test/data/test_hash_check_queue.cc | ||
| 630 | index 4b15245e..65931273 100644 | ||
| 631 | --- a/test/data/hash_check_queue_test.cc | ||
| 632 | +++ b/test/data/test_hash_check_queue.cc | ||
| 633 | @@ -1,20 +1,23 @@ | ||
| 634 | #include "config.h" | ||
| 635 | |||
| 636 | +#include "test_hash_check_queue.h" | ||
| 637 | + | ||
| 638 | +#include "helpers/test_thread.h" | ||
| 639 | +#include "helpers/test_utils.h" | ||
| 640 | + | ||
| 641 | #include <functional> | ||
| 642 | #include <signal.h> | ||
| 643 | |||
| 644 | -#include "data/hash_queue_node.h" | ||
| 645 | +#include "data/chunk_handle.h" | ||
| 646 | #include "utils/sha1.h" | ||
| 647 | #include "torrent/chunk_manager.h" | ||
| 648 | #include "torrent/exceptions.h" | ||
| 649 | #include "torrent/poll_select.h" | ||
| 650 | -#include "torrent/utils/thread_base_test.h" | ||
| 651 | #include "thread_disk.h" | ||
| 652 | |||
| 653 | -#include "chunk_list_test.h" | ||
| 654 | -#include "hash_check_queue_test.h" | ||
| 655 | +#include "test_chunk_list.h" | ||
| 656 | |||
| 657 | -CPPUNIT_TEST_SUITE_REGISTRATION(HashCheckQueueTest); | ||
| 658 | +CPPUNIT_TEST_SUITE_NAMED_REGISTRATION(test_hash_check_queue, "data"); | ||
| 659 | |||
| 660 | pthread_mutex_t done_chunks_lock = PTHREAD_MUTEX_INITIALIZER; | ||
| 661 | |||
| 662 | @@ -68,22 +71,16 @@ static torrent::Poll* create_select_poll() { return torrent::PollSelect::create( | ||
| 663 | static void do_nothing() {} | ||
| 664 | |||
| 665 | void | ||
| 666 | -HashCheckQueueTest::setUp() { | ||
| 667 | +test_hash_check_queue::setUp() { | ||
| 668 | + test_fixture::setUp(); | ||
| 669 | + | ||
| 670 | torrent::Poll::slot_create_poll() = std::bind(&create_select_poll); | ||
| 671 | |||
| 672 | signal(SIGUSR1, (sig_t)&do_nothing); | ||
| 673 | } | ||
| 674 | |||
| 675 | void | ||
| 676 | -HashCheckQueueTest::tearDown() { | ||
| 677 | -} | ||
| 678 | - | ||
| 679 | -void | ||
| 680 | -HashCheckQueueTest::test_basic() { | ||
| 681 | -} | ||
| 682 | - | ||
| 683 | -void | ||
| 684 | -HashCheckQueueTest::test_single() { | ||
| 685 | +test_hash_check_queue::test_single() { | ||
| 686 | SETUP_CHUNK_LIST(); | ||
| 687 | torrent::HashCheckQueue hash_queue; | ||
| 688 | |||
| 689 | @@ -110,7 +107,7 @@ HashCheckQueueTest::test_single() { | ||
| 690 | } | ||
| 691 | |||
| 692 | void | ||
| 693 | -HashCheckQueueTest::test_multiple() { | ||
| 694 | +test_hash_check_queue::test_multiple() { | ||
| 695 | SETUP_CHUNK_LIST(); | ||
| 696 | torrent::HashCheckQueue hash_queue; | ||
| 697 | |||
| 698 | @@ -143,7 +140,7 @@ HashCheckQueueTest::test_multiple() { | ||
| 699 | } | ||
| 700 | |||
| 701 | void | ||
| 702 | -HashCheckQueueTest::test_erase() { | ||
| 703 | +test_hash_check_queue::test_erase() { | ||
| 704 | // SETUP_CHUNK_LIST(); | ||
| 705 | // torrent::HashCheckQueue hash_queue; | ||
| 706 | |||
| 707 | @@ -176,7 +173,7 @@ HashCheckQueueTest::test_erase() { | ||
| 708 | } | ||
| 709 | |||
| 710 | void | ||
| 711 | -HashCheckQueueTest::test_thread() { | ||
| 712 | +test_hash_check_queue::test_thread() { | ||
| 713 | SETUP_CHUNK_LIST(); | ||
| 714 | SETUP_THREAD(); | ||
| 715 | thread_disk->start_thread(); | ||
| 716 | diff --git a/test/data/hash_check_queue_test.h b/test/data/test_hash_check_queue.h | ||
| 717 | similarity index 63% | ||
| 718 | rename from test/data/hash_check_queue_test.h | ||
| 719 | rename to test/data/test_hash_check_queue.h | ||
| 720 | index 5398a50d..d2d271bb 100644 | ||
| 721 | --- a/test/data/hash_check_queue_test.h | ||
| 722 | +++ b/test/data/test_hash_check_queue.h | ||
| 723 | @@ -1,26 +1,19 @@ | ||
| 724 | -#include <map> | ||
| 725 | -#include <vector> | ||
| 726 | -#include <cppunit/extensions/HelperMacros.h> | ||
| 727 | +#import "helpers/test_fixture.h" | ||
| 728 | |||
| 729 | -#include "data/hash_check_queue.h" | ||
| 730 | -#include "torrent/hash_string.h" | ||
| 731 | +class test_hash_check_queue : public test_fixture { | ||
| 732 | + CPPUNIT_TEST_SUITE(test_hash_check_queue); | ||
| 733 | |||
| 734 | - | ||
| 735 | -class HashCheckQueueTest : public CppUnit::TestFixture { | ||
| 736 | - CPPUNIT_TEST_SUITE(HashCheckQueueTest); | ||
| 737 | - CPPUNIT_TEST(test_basic); | ||
| 738 | CPPUNIT_TEST(test_single); | ||
| 739 | CPPUNIT_TEST(test_multiple); | ||
| 740 | CPPUNIT_TEST(test_erase); | ||
| 741 | |||
| 742 | CPPUNIT_TEST(test_thread); | ||
| 743 | + | ||
| 744 | CPPUNIT_TEST_SUITE_END(); | ||
| 745 | |||
| 746 | public: | ||
| 747 | void setUp(); | ||
| 748 | - void tearDown(); | ||
| 749 | |||
| 750 | - void test_basic(); | ||
| 751 | void test_single(); | ||
| 752 | void test_multiple(); | ||
| 753 | void test_erase(); | ||
| 754 | @@ -28,6 +21,13 @@ public: | ||
| 755 | void test_thread(); | ||
| 756 | }; | ||
| 757 | |||
| 758 | +#import <map> | ||
| 759 | +#import <vector> | ||
| 760 | + | ||
| 761 | +#import "data/hash_queue_node.h" | ||
| 762 | +#import "data/hash_check_queue.h" | ||
| 763 | +#import "torrent/hash_string.h" | ||
| 764 | + | ||
| 765 | typedef std::map<int, torrent::HashString> done_chunks_type; | ||
| 766 | typedef std::vector<torrent::ChunkHandle> handle_list; | ||
| 767 | |||
| 768 | diff --git a/test/data/hash_queue_test.cc b/test/data/test_hash_queue.cc | ||
| 769 | similarity index 82% | ||
| 770 | rename from test/data/hash_queue_test.cc | ||
| 771 | rename to test/data/test_hash_queue.cc | ||
| 772 | index d7ce3ba8..d9a88c8d 100644 | ||
| 773 | --- a/test/data/hash_queue_test.cc | ||
| 774 | +++ b/test/data/test_hash_queue.cc | ||
| 775 | @@ -1,22 +1,26 @@ | ||
| 776 | -#include "config.h" | ||
| 777 | +#import "config.h" | ||
| 778 | |||
| 779 | -#include <functional> | ||
| 780 | -#include <signal.h> | ||
| 781 | +#import "test_hash_queue.h" | ||
| 782 | |||
| 783 | -#include "data/hash_queue_node.h" | ||
| 784 | -#include "torrent/chunk_manager.h" | ||
| 785 | -#include "torrent/exceptions.h" | ||
| 786 | -#include "torrent/hash_string.h" | ||
| 787 | -#include "torrent/poll_select.h" | ||
| 788 | -#include "torrent/utils/thread_base_test.h" | ||
| 789 | -#include "globals.h" | ||
| 790 | -#include "thread_disk.h" | ||
| 791 | +#import "helpers/test_thread.h" | ||
| 792 | +#import "helpers/test_utils.h" | ||
| 793 | |||
| 794 | -#include "chunk_list_test.h" | ||
| 795 | -#include "hash_queue_test.h" | ||
| 796 | -#include "hash_check_queue_test.h" | ||
| 797 | +#import <functional> | ||
| 798 | +#import <signal.h> | ||
| 799 | |||
| 800 | -CPPUNIT_TEST_SUITE_REGISTRATION(HashQueueTest); | ||
| 801 | +#import "data/hash_queue.h" | ||
| 802 | +#import "data/hash_queue_node.h" | ||
| 803 | +#import "torrent/chunk_manager.h" | ||
| 804 | +#import "torrent/exceptions.h" | ||
| 805 | +#import "torrent/hash_string.h" | ||
| 806 | +#import "torrent/poll_select.h" | ||
| 807 | +#import "globals.h" | ||
| 808 | +#import "thread_disk.h" | ||
| 809 | + | ||
| 810 | +#import "test_chunk_list.h" | ||
| 811 | +#import "test_hash_check_queue.h" | ||
| 812 | + | ||
| 813 | +CPPUNIT_TEST_SUITE_NAMED_REGISTRATION(test_hash_queue, "data"); | ||
| 814 | |||
| 815 | typedef std::map<int, torrent::HashString> done_chunks_type; | ||
| 816 | |||
| 817 | @@ -39,7 +43,9 @@ static torrent::Poll* create_select_poll() { return torrent::PollSelect::create( | ||
| 818 | static void do_nothing() {} | ||
| 819 | |||
| 820 | void | ||
| 821 | -HashQueueTest::setUp() { | ||
| 822 | +test_hash_queue::setUp() { | ||
| 823 | + test_fixture::setUp(); | ||
| 824 | + | ||
| 825 | CPPUNIT_ASSERT(torrent::taskScheduler.empty()); | ||
| 826 | |||
| 827 | torrent::Poll::slot_create_poll() = std::bind(&create_select_poll); | ||
| 828 | @@ -47,25 +53,9 @@ HashQueueTest::setUp() { | ||
| 829 | } | ||
| 830 | |||
| 831 | void | ||
| 832 | -HashQueueTest::tearDown() { | ||
| 833 | +test_hash_queue::tearDown() { | ||
| 834 | torrent::taskScheduler.clear(); | ||
| 835 | -} | ||
| 836 | - | ||
| 837 | -void | ||
| 838 | -HashQueueTest::test_basic() { | ||
| 839 | - // SETUP_CHUNK_LIST(); | ||
| 840 | - // SETUP_THREAD(); | ||
| 841 | - // thread_disk->start_thread(); | ||
| 842 | - | ||
| 843 | - // torrent::HashQueue* hash_queue = new torrent::HashQueue(thread_disk); | ||
| 844 | - | ||
| 845 | - // // Do stuff? | ||
| 846 | - | ||
| 847 | - // delete hash_queue; | ||
| 848 | - | ||
| 849 | - // thread_disk->stop_thread(); | ||
| 850 | - // CLEANUP_THREAD(); | ||
| 851 | - // CLEANUP_CHUNK_LIST(); | ||
| 852 | + test_fixture::tearDown(); | ||
| 853 | } | ||
| 854 | |||
| 855 | static void | ||
| 856 | @@ -73,7 +63,7 @@ fill_queue() { | ||
| 857 | } | ||
| 858 | |||
| 859 | void | ||
| 860 | -HashQueueTest::test_single() { | ||
| 861 | +test_hash_queue::test_single() { | ||
| 862 | SETUP_CHUNK_LIST(); | ||
| 863 | SETUP_THREAD(); | ||
| 864 | thread_disk->start_thread(); | ||
| 865 | @@ -105,7 +95,7 @@ HashQueueTest::test_single() { | ||
| 866 | } | ||
| 867 | |||
| 868 | void | ||
| 869 | -HashQueueTest::test_multiple() { | ||
| 870 | +test_hash_queue::test_multiple() { | ||
| 871 | SETUP_CHUNK_LIST(); | ||
| 872 | SETUP_THREAD(); | ||
| 873 | thread_disk->start_thread(); | ||
| 874 | @@ -137,7 +127,7 @@ HashQueueTest::test_multiple() { | ||
| 875 | } | ||
| 876 | |||
| 877 | void | ||
| 878 | -HashQueueTest::test_erase() { | ||
| 879 | +test_hash_queue::test_erase() { | ||
| 880 | SETUP_CHUNK_LIST(); | ||
| 881 | SETUP_THREAD(); | ||
| 882 | |||
| 883 | @@ -164,7 +154,7 @@ HashQueueTest::test_erase() { | ||
| 884 | } | ||
| 885 | |||
| 886 | void | ||
| 887 | -HashQueueTest::test_erase_stress() { | ||
| 888 | +test_hash_queue::test_erase_stress() { | ||
| 889 | SETUP_CHUNK_LIST(); | ||
| 890 | SETUP_THREAD(); | ||
| 891 | thread_disk->start_thread(); | ||
| 892 | diff --git a/test/data/hash_queue_test.h b/test/data/test_hash_queue.h | ||
| 893 | similarity index 58% | ||
| 894 | rename from test/data/hash_queue_test.h | ||
| 895 | rename to test/data/test_hash_queue.h | ||
| 896 | index cb5b7282..79914484 100644 | ||
| 897 | --- a/test/data/hash_queue_test.h | ||
| 898 | +++ b/test/data/test_hash_queue.h | ||
| 899 | @@ -1,10 +1,7 @@ | ||
| 900 | -#include <cppunit/extensions/HelperMacros.h> | ||
| 901 | +#include "helpers/test_fixture.h" | ||
| 902 | |||
| 903 | -#include "data/hash_queue.h" | ||
| 904 | - | ||
| 905 | -class HashQueueTest : public CppUnit::TestFixture { | ||
| 906 | - CPPUNIT_TEST_SUITE(HashQueueTest); | ||
| 907 | - CPPUNIT_TEST(test_basic); | ||
| 908 | +class test_hash_queue : public test_fixture { | ||
| 909 | + CPPUNIT_TEST_SUITE(test_hash_queue); | ||
| 910 | |||
| 911 | CPPUNIT_TEST(test_single); | ||
| 912 | CPPUNIT_TEST(test_multiple); | ||
| 913 | @@ -17,8 +14,6 @@ public: | ||
| 914 | void setUp(); | ||
| 915 | void tearDown(); | ||
| 916 | |||
| 917 | - void test_basic(); | ||
| 918 | - | ||
| 919 | void test_single(); | ||
| 920 | void test_multiple(); | ||
| 921 | void test_erase(); | ||
| 922 | diff --git a/test/helpers/progress_listener.cc b/test/helpers/progress_listener.cc | ||
| 923 | index c2b60bcd..7a6ed047 100644 | ||
| 924 | --- a/test/helpers/progress_listener.cc | ||
| 925 | +++ b/test/helpers/progress_listener.cc | ||
| 926 | @@ -36,10 +36,10 @@ progress_listener::addFailure(const CppUnit::TestFailure &failure) { | ||
| 927 | if (m_current_log_buffer == nullptr) | ||
| 928 | return; | ||
| 929 | |||
| 930 | - std::cout << " : " << (failure.isError() ? "error" : "assertion"); | ||
| 931 | + std::cout << " : " << (failure.isError() ? "error" : "assertion") << std::flush; | ||
| 932 | |||
| 933 | m_last_test_failed = true; | ||
| 934 | - m_failures.push_back(std::move(failure_type{failure.failedTestName(), std::move(m_current_log_buffer)})); | ||
| 935 | + m_failures.push_back(failure_type{ failure.failedTestName(), std::move(m_current_log_buffer) }); | ||
| 936 | } | ||
| 937 | |||
| 938 | void | ||
| 939 | diff --git a/test/helpers/test_fixture.h b/test/helpers/test_fixture.h | ||
| 940 | index 312d5009..aa557a5e 100644 | ||
| 941 | --- a/test/helpers/test_fixture.h | ||
| 942 | +++ b/test/helpers/test_fixture.h | ||
| 943 | @@ -1,14 +1,14 @@ | ||
| 944 | -#ifndef LIBTORRENT_HELPER_TEST_FIXTURE_H | ||
| 945 | -#define LIBTORRENT_HELPER_TEST_FIXTURE_H | ||
| 946 | - | ||
| 947 | -#include <cppunit/extensions/HelperMacros.h> | ||
| 948 | - | ||
| 949 | -#include "helpers/mock_function.h" | ||
| 950 | - | ||
| 951 | -class test_fixture : public CppUnit::TestFixture { | ||
| 952 | -public: | ||
| 953 | - void setUp(); | ||
| 954 | - void tearDown(); | ||
| 955 | -}; | ||
| 956 | - | ||
| 957 | -#endif | ||
| 958 | +#ifndef LIBTORRENT_HELPER_TEST_FIXTURE_H | ||
| 959 | +#define LIBTORRENT_HELPER_TEST_FIXTURE_H | ||
| 960 | + | ||
| 961 | +#include <cppunit/extensions/HelperMacros.h> | ||
| 962 | + | ||
| 963 | +#include "helpers/mock_function.h" | ||
| 964 | + | ||
| 965 | +class test_fixture : public CppUnit::TestFixture { | ||
| 966 | +public: | ||
| 967 | + void setUp(); | ||
| 968 | + void tearDown(); | ||
| 969 | +}; | ||
| 970 | + | ||
| 971 | +#endif | ||
| 972 | diff --git a/test/helpers/test_thread.cc b/test/helpers/test_thread.cc | ||
| 973 | new file mode 100755 | ||
| 974 | index 00000000..4b3d4c95 | ||
| 975 | --- /dev/null | ||
| 976 | +++ b/test/helpers/test_thread.cc | ||
| 977 | @@ -0,0 +1,71 @@ | ||
| 978 | +#import "config.h" | ||
| 979 | + | ||
| 980 | +#import "test_thread.h" | ||
| 981 | + | ||
| 982 | +#import <unistd.h> | ||
| 983 | +#import <cppunit/extensions/HelperMacros.h> | ||
| 984 | + | ||
| 985 | +#import "thread_disk.h" | ||
| 986 | +#import "torrent/exceptions.h" | ||
| 987 | +#import "torrent/poll_select.h" | ||
| 988 | + | ||
| 989 | +const int test_thread::test_flag_pre_stop; | ||
| 990 | +const int test_thread::test_flag_long_timeout; | ||
| 991 | + | ||
| 992 | +const int test_thread::test_flag_acquire_global; | ||
| 993 | +const int test_thread::test_flag_has_global; | ||
| 994 | + | ||
| 995 | +const int test_thread::test_flag_do_work; | ||
| 996 | +const int test_thread::test_flag_pre_poke; | ||
| 997 | +const int test_thread::test_flag_post_poke; | ||
| 998 | + | ||
| 999 | +test_thread::test_thread() : | ||
| 1000 | + m_test_state(TEST_NONE), | ||
| 1001 | + m_test_flags(0) { | ||
| 1002 | +} | ||
| 1003 | + | ||
| 1004 | +void | ||
| 1005 | +test_thread::init_thread() { | ||
| 1006 | + m_state = STATE_INITIALIZED; | ||
| 1007 | + m_test_state = TEST_PRE_START; | ||
| 1008 | + m_poll = torrent::PollSelect::create(256); | ||
| 1009 | +} | ||
| 1010 | + | ||
| 1011 | +void | ||
| 1012 | +test_thread::call_events() { | ||
| 1013 | + if ((m_test_flags & test_flag_pre_stop) && m_test_state == TEST_PRE_START && m_state == STATE_ACTIVE) | ||
| 1014 | + __sync_lock_test_and_set(&m_test_state, TEST_PRE_STOP); | ||
| 1015 | + | ||
| 1016 | + if ((m_test_flags & test_flag_acquire_global)) { | ||
| 1017 | + acquire_global_lock(); | ||
| 1018 | + __sync_and_and_fetch(&m_test_flags, ~test_flag_acquire_global); | ||
| 1019 | + __sync_or_and_fetch(&m_test_flags, test_flag_has_global); | ||
| 1020 | + } | ||
| 1021 | + | ||
| 1022 | + if ((m_flags & flag_do_shutdown)) { | ||
| 1023 | + if ((m_flags & flag_did_shutdown)) | ||
| 1024 | + throw torrent::internal_error("Already trigged shutdown."); | ||
| 1025 | + | ||
| 1026 | + __sync_or_and_fetch(&m_flags, flag_did_shutdown); | ||
| 1027 | + throw torrent::shutdown_exception(); | ||
| 1028 | + } | ||
| 1029 | + | ||
| 1030 | + if ((m_test_flags & test_flag_pre_poke)) { | ||
| 1031 | + } | ||
| 1032 | + | ||
| 1033 | + if ((m_test_flags & test_flag_do_work)) { | ||
| 1034 | + usleep(10 * 1000); // TODO: Don't just sleep, as that give up core. | ||
| 1035 | + __sync_and_and_fetch(&m_test_flags, ~test_flag_do_work); | ||
| 1036 | + } | ||
| 1037 | + | ||
| 1038 | + if ((m_test_flags & test_flag_post_poke)) { | ||
| 1039 | + } | ||
| 1040 | +} | ||
| 1041 | + | ||
| 1042 | +thread_management_type::thread_management_type() { | ||
| 1043 | + CPPUNIT_ASSERT(torrent::thread_base::trylock_global_lock()); | ||
| 1044 | +} | ||
| 1045 | + | ||
| 1046 | +thread_management_type::~thread_management_type() { | ||
| 1047 | + torrent::thread_base::release_global_lock(); | ||
| 1048 | +} | ||
| 1049 | diff --git a/test/helpers/test_thread.h b/test/helpers/test_thread.h | ||
| 1050 | new file mode 100755 | ||
| 1051 | index 00000000..52037036 | ||
| 1052 | --- /dev/null | ||
| 1053 | +++ b/test/helpers/test_thread.h | ||
| 1054 | @@ -0,0 +1,59 @@ | ||
| 1055 | +#import "torrent/utils/thread_base.h" | ||
| 1056 | + | ||
| 1057 | +class test_thread : public torrent::thread_base { | ||
| 1058 | +public: | ||
| 1059 | + enum test_state { | ||
| 1060 | + TEST_NONE, | ||
| 1061 | + TEST_PRE_START, | ||
| 1062 | + TEST_PRE_STOP, | ||
| 1063 | + TEST_STOP | ||
| 1064 | + }; | ||
| 1065 | + | ||
| 1066 | + static const int test_flag_pre_stop = 0x1; | ||
| 1067 | + static const int test_flag_long_timeout = 0x2; | ||
| 1068 | + | ||
| 1069 | + static const int test_flag_acquire_global = 0x10; | ||
| 1070 | + static const int test_flag_has_global = 0x20; | ||
| 1071 | + | ||
| 1072 | + static const int test_flag_do_work = 0x100; | ||
| 1073 | + static const int test_flag_pre_poke = 0x200; | ||
| 1074 | + static const int test_flag_post_poke = 0x400; | ||
| 1075 | + | ||
| 1076 | + test_thread(); | ||
| 1077 | + | ||
| 1078 | + int test_state() const { return m_test_state; } | ||
| 1079 | + bool is_state(int state) const { return m_state == state; } | ||
| 1080 | + bool is_test_state(int state) const { return m_test_state == state; } | ||
| 1081 | + bool is_test_flags(int flags) const { return (m_test_flags & flags) == flags; } | ||
| 1082 | + bool is_not_test_flags(int flags) const { return !(m_test_flags & flags); } | ||
| 1083 | + | ||
| 1084 | + auto name() const -> const char* { return "test_thread"; } | ||
| 1085 | + | ||
| 1086 | + void init_thread(); | ||
| 1087 | + | ||
| 1088 | + void set_pre_stop() { __sync_or_and_fetch(&m_test_flags, test_flag_pre_stop); } | ||
| 1089 | + void set_acquire_global() { __sync_or_and_fetch(&m_test_flags, test_flag_acquire_global); } | ||
| 1090 | + | ||
| 1091 | + void set_test_flag(int flags) { __sync_or_and_fetch(&m_test_flags, flags); } | ||
| 1092 | + | ||
| 1093 | +private: | ||
| 1094 | + void call_events(); | ||
| 1095 | + int64_t next_timeout_usec() { return (m_test_flags & test_flag_long_timeout) ? (10000 * 1000) : (100 * 1000); } | ||
| 1096 | + | ||
| 1097 | + int m_test_state lt_cacheline_aligned; | ||
| 1098 | + int m_test_flags lt_cacheline_aligned; | ||
| 1099 | +}; | ||
| 1100 | + | ||
| 1101 | +struct thread_management_type { | ||
| 1102 | + thread_management_type(); | ||
| 1103 | + ~thread_management_type(); | ||
| 1104 | +}; | ||
| 1105 | + | ||
| 1106 | +#define SETUP_THREAD() \ | ||
| 1107 | + thread_management_type thread_management; \ | ||
| 1108 | + torrent::thread_disk* thread_disk = new torrent::thread_disk(); \ | ||
| 1109 | + thread_disk->init_thread(); | ||
| 1110 | + | ||
| 1111 | +#define CLEANUP_THREAD() \ | ||
| 1112 | + CPPUNIT_ASSERT(wait_for_true(std::bind(&torrent::thread_base::is_inactive, thread_disk))); \ | ||
| 1113 | + delete thread_disk; | ||
| 1114 | diff --git a/test/helpers/test_utils.h b/test/helpers/test_utils.h | ||
| 1115 | new file mode 100644 | ||
| 1116 | index 00000000..0c8c6b7a | ||
| 1117 | --- /dev/null | ||
| 1118 | +++ b/test/helpers/test_utils.h | ||
| 1119 | @@ -0,0 +1,16 @@ | ||
| 1120 | +#include <functional> | ||
| 1121 | +#include <unistd.h> | ||
| 1122 | + | ||
| 1123 | +inline bool | ||
| 1124 | +wait_for_true(std::function<bool ()> test_function) { | ||
| 1125 | + int i = 100; | ||
| 1126 | + | ||
| 1127 | + do { | ||
| 1128 | + if (test_function()) | ||
| 1129 | + return true; | ||
| 1130 | + | ||
| 1131 | + usleep(10 * 1000); | ||
| 1132 | + } while (--i); | ||
| 1133 | + | ||
| 1134 | + return false; | ||
| 1135 | +} | ||
| 1136 | diff --git a/test/helpers/utils.h b/test/helpers/utils.h | ||
| 1137 | index d18450c1..e81d22eb 100644 | ||
| 1138 | --- a/test/helpers/utils.h | ||
| 1139 | +++ b/test/helpers/utils.h | ||
| 1140 | @@ -1,60 +1,60 @@ | ||
| 1141 | -#ifndef LIBTORRENT_HELPER_UTILS_H | ||
| 1142 | -#define LIBTORRENT_HELPER_UTILS_H | ||
| 1143 | - | ||
| 1144 | -#include <algorithm> | ||
| 1145 | -#include <iostream> | ||
| 1146 | -#include <cppunit/extensions/TestFactoryRegistry.h> | ||
| 1147 | -#include <torrent/utils/log.h> | ||
| 1148 | - | ||
| 1149 | -static void | ||
| 1150 | -dump_failure_log(const failure_type& failure) { | ||
| 1151 | - if (failure.log->empty()) | ||
| 1152 | - return; | ||
| 1153 | - | ||
| 1154 | - std::cout << std::endl << failure.name << std::endl; | ||
| 1155 | - | ||
| 1156 | - // Doesn't print dump messages as log_buffer drops them. | ||
| 1157 | - std::for_each(failure.log->begin(), failure.log->end(), [](const torrent::log_entry& entry) { | ||
| 1158 | - std::cout << entry.timestamp << ' ' << entry.message << '\n'; | ||
| 1159 | - }); | ||
| 1160 | - | ||
| 1161 | - std::cout << std::flush; | ||
| 1162 | -} | ||
| 1163 | - | ||
| 1164 | -static void | ||
| 1165 | -dump_failures(const failure_list_type& failures) { | ||
| 1166 | - if (failures.empty()) | ||
| 1167 | - return; | ||
| 1168 | - | ||
| 1169 | - std::cout << std::endl | ||
| 1170 | - << "=================" << std::endl | ||
| 1171 | - << "Failed Test Logs:" << std::endl | ||
| 1172 | - << "=================" << std::endl; | ||
| 1173 | - | ||
| 1174 | - std::for_each(failures.begin(), failures.end(), [](const failure_type& failure) { | ||
| 1175 | - dump_failure_log(failure); | ||
| 1176 | - }); | ||
| 1177 | - std::cout << std::endl; | ||
| 1178 | -} | ||
| 1179 | - | ||
| 1180 | -static | ||
| 1181 | -void add_tests(CppUnit::TextUi::TestRunner& runner, const char* c_test_names) { | ||
| 1182 | - if (c_test_names == NULL || std::string(c_test_names).empty()) { | ||
| 1183 | - runner.addTest(CppUnit::TestFactoryRegistry::getRegistry().makeTest()); | ||
| 1184 | - return; | ||
| 1185 | - } | ||
| 1186 | - | ||
| 1187 | - const std::string& test_names(c_test_names); | ||
| 1188 | - | ||
| 1189 | - size_t pos = 0; | ||
| 1190 | - size_t next = 0; | ||
| 1191 | - | ||
| 1192 | - while ((next = test_names.find(',', pos)) < test_names.size()) { | ||
| 1193 | - runner.addTest(CppUnit::TestFactoryRegistry::getRegistry(test_names.substr(pos, next - pos)).makeTest()); | ||
| 1194 | - pos = next + 1; | ||
| 1195 | - } | ||
| 1196 | - | ||
| 1197 | - runner.addTest(CppUnit::TestFactoryRegistry::getRegistry(test_names.substr(pos)).makeTest()); | ||
| 1198 | -} | ||
| 1199 | - | ||
| 1200 | -#endif | ||
| 1201 | +#ifndef LIBTORRENT_HELPER_UTILS_H | ||
| 1202 | +#define LIBTORRENT_HELPER_UTILS_H | ||
| 1203 | + | ||
| 1204 | +#include <algorithm> | ||
| 1205 | +#include <iostream> | ||
| 1206 | +#include <cppunit/extensions/TestFactoryRegistry.h> | ||
| 1207 | +#include <torrent/utils/log.h> | ||
| 1208 | + | ||
| 1209 | +static void | ||
| 1210 | +dump_failure_log(const failure_type& failure) { | ||
| 1211 | + if (failure.log->empty()) | ||
| 1212 | + return; | ||
| 1213 | + | ||
| 1214 | + std::cout << std::endl << failure.name << std::endl; | ||
| 1215 | + | ||
| 1216 | + // Doesn't print dump messages as log_buffer drops them. | ||
| 1217 | + std::for_each(failure.log->begin(), failure.log->end(), [](const torrent::log_entry& entry) { | ||
| 1218 | + std::cout << entry.timestamp << ' ' << entry.message << '\n'; | ||
| 1219 | + }); | ||
| 1220 | + | ||
| 1221 | + std::cout << std::flush; | ||
| 1222 | +} | ||
| 1223 | + | ||
| 1224 | +static void | ||
| 1225 | +dump_failures(const failure_list_type& failures) { | ||
| 1226 | + if (failures.empty()) | ||
| 1227 | + return; | ||
| 1228 | + | ||
| 1229 | + std::cout << std::endl | ||
| 1230 | + << "=================" << std::endl | ||
| 1231 | + << "Failed Test Logs:" << std::endl | ||
| 1232 | + << "=================" << std::endl; | ||
| 1233 | + | ||
| 1234 | + std::for_each(failures.begin(), failures.end(), [](const failure_type& failure) { | ||
| 1235 | + dump_failure_log(failure); | ||
| 1236 | + }); | ||
| 1237 | + std::cout << std::endl; | ||
| 1238 | +} | ||
| 1239 | + | ||
| 1240 | +static | ||
| 1241 | +void add_tests(CppUnit::TextUi::TestRunner& runner, const char* c_test_names) { | ||
| 1242 | + if (c_test_names == NULL || std::string(c_test_names).empty()) { | ||
| 1243 | + runner.addTest(CppUnit::TestFactoryRegistry::getRegistry().makeTest()); | ||
| 1244 | + return; | ||
| 1245 | + } | ||
| 1246 | + | ||
| 1247 | + const std::string& test_names(c_test_names); | ||
| 1248 | + | ||
| 1249 | + size_t pos = 0; | ||
| 1250 | + size_t next = 0; | ||
| 1251 | + | ||
| 1252 | + while ((next = test_names.find(',', pos)) < test_names.size()) { | ||
| 1253 | + runner.addTest(CppUnit::TestFactoryRegistry::getRegistry(test_names.substr(pos, next - pos)).makeTest()); | ||
| 1254 | + pos = next + 1; | ||
| 1255 | + } | ||
| 1256 | + | ||
| 1257 | + runner.addTest(CppUnit::TestFactoryRegistry::getRegistry(test_names.substr(pos)).makeTest()); | ||
| 1258 | +} | ||
| 1259 | + | ||
| 1260 | +#endif | ||
| 1261 | diff --git a/test/main.cc b/test/main.cc | ||
| 1262 | index e8a00e1f..57ae31a2 100644 | ||
| 1263 | --- a/test/main.cc | ||
| 1264 | +++ b/test/main.cc | ||
| 1265 | @@ -19,9 +19,11 @@ | ||
| 1266 | #include "helpers/progress_listener.h" | ||
| 1267 | #include "helpers/utils.h" | ||
| 1268 | |||
| 1269 | -CPPUNIT_REGISTRY_ADD_TO_DEFAULT("net"); | ||
| 1270 | CPPUNIT_REGISTRY_ADD_TO_DEFAULT("torrent/net"); | ||
| 1271 | CPPUNIT_REGISTRY_ADD_TO_DEFAULT("torrent/utils"); | ||
| 1272 | +CPPUNIT_REGISTRY_ADD_TO_DEFAULT("torrent"); | ||
| 1273 | +CPPUNIT_REGISTRY_ADD_TO_DEFAULT("net"); | ||
| 1274 | +CPPUNIT_REGISTRY_ADD_TO_DEFAULT("tracker"); | ||
| 1275 | |||
| 1276 | void | ||
| 1277 | do_test_panic(int signum) { | ||
| 1278 | diff --git a/test/torrent/http_test.cc b/test/torrent/test_http.cc | ||
| 1279 | similarity index 94% | ||
| 1280 | rename from test/torrent/http_test.cc | ||
| 1281 | rename to test/torrent/test_http.cc | ||
| 1282 | index 27e04552..24ec97b5 100644 | ||
| 1283 | --- a/test/torrent/http_test.cc | ||
| 1284 | +++ b/test/torrent/test_http.cc | ||
| 1285 | @@ -1,10 +1,11 @@ | ||
| 1286 | #include "config.h" | ||
| 1287 | |||
| 1288 | -#include <sstream> | ||
| 1289 | +#include "test_http.h" | ||
| 1290 | |||
| 1291 | -#include "http_test.h" | ||
| 1292 | +#include <sstream> | ||
| 1293 | +#include "torrent/http.h" | ||
| 1294 | |||
| 1295 | -CPPUNIT_TEST_SUITE_REGISTRATION(HttpTest); | ||
| 1296 | +CPPUNIT_TEST_SUITE_NAMED_REGISTRATION(test_http, "torrent"); | ||
| 1297 | |||
| 1298 | #define HTTP_SETUP() \ | ||
| 1299 | bool http_destroyed = false; \ | ||
| 1300 | @@ -72,7 +73,7 @@ TestHttp* create_test_http() { return new TestHttp; } | ||
| 1301 | static void increment_value(int* value) { (*value)++; } | ||
| 1302 | |||
| 1303 | void | ||
| 1304 | -HttpTest::test_basic() { | ||
| 1305 | +test_http::test_basic() { | ||
| 1306 | torrent::Http::slot_factory() = std::bind(&create_test_http); | ||
| 1307 | |||
| 1308 | torrent::Http* http = torrent::Http::slot_factory()(); | ||
| 1309 | @@ -94,7 +95,7 @@ HttpTest::test_basic() { | ||
| 1310 | } | ||
| 1311 | |||
| 1312 | void | ||
| 1313 | -HttpTest::test_done() { | ||
| 1314 | +test_http::test_done() { | ||
| 1315 | HTTP_SETUP(); | ||
| 1316 | http->start(); | ||
| 1317 | |||
| 1318 | @@ -106,7 +107,7 @@ HttpTest::test_done() { | ||
| 1319 | } | ||
| 1320 | |||
| 1321 | void | ||
| 1322 | -HttpTest::test_failure() { | ||
| 1323 | +test_http::test_failure() { | ||
| 1324 | HTTP_SETUP(); | ||
| 1325 | http->start(); | ||
| 1326 | |||
| 1327 | @@ -118,7 +119,7 @@ HttpTest::test_failure() { | ||
| 1328 | } | ||
| 1329 | |||
| 1330 | void | ||
| 1331 | -HttpTest::test_delete_on_done() { | ||
| 1332 | +test_http::test_delete_on_done() { | ||
| 1333 | HTTP_SETUP(); | ||
| 1334 | http->start(); | ||
| 1335 | http->set_delete_stream(); | ||
| 1336 | @@ -145,7 +146,7 @@ HttpTest::test_delete_on_done() { | ||
| 1337 | } | ||
| 1338 | |||
| 1339 | void | ||
| 1340 | -HttpTest::test_delete_on_failure() { | ||
| 1341 | +test_http::test_delete_on_failure() { | ||
| 1342 | HTTP_SETUP(); | ||
| 1343 | http->start(); | ||
| 1344 | http->set_delete_stream(); | ||
| 1345 | diff --git a/test/torrent/http_test.h b/test/torrent/test_http.h | ||
| 1346 | similarity index 63% | ||
| 1347 | rename from test/torrent/http_test.h | ||
| 1348 | rename to test/torrent/test_http.h | ||
| 1349 | index c6c97d08..f4334646 100644 | ||
| 1350 | --- a/test/torrent/http_test.h | ||
| 1351 | +++ b/test/torrent/test_http.h | ||
| 1352 | @@ -1,21 +1,18 @@ | ||
| 1353 | -#include <cppunit/extensions/HelperMacros.h> | ||
| 1354 | +#import "helpers/test_fixture.h" | ||
| 1355 | |||
| 1356 | -#include "torrent/http.h" | ||
| 1357 | +class test_http : public test_fixture { | ||
| 1358 | + CPPUNIT_TEST_SUITE(test_http); | ||
| 1359 | |||
| 1360 | -class HttpTest : public CppUnit::TestFixture { | ||
| 1361 | - CPPUNIT_TEST_SUITE(HttpTest); | ||
| 1362 | CPPUNIT_TEST(test_basic); | ||
| 1363 | CPPUNIT_TEST(test_done); | ||
| 1364 | CPPUNIT_TEST(test_failure); | ||
| 1365 | |||
| 1366 | CPPUNIT_TEST(test_delete_on_done); | ||
| 1367 | CPPUNIT_TEST(test_delete_on_failure); | ||
| 1368 | + | ||
| 1369 | CPPUNIT_TEST_SUITE_END(); | ||
| 1370 | |||
| 1371 | public: | ||
| 1372 | - void setUp() {} | ||
| 1373 | - void tearDown() {} | ||
| 1374 | - | ||
| 1375 | void test_basic(); | ||
| 1376 | void test_done(); | ||
| 1377 | void test_failure(); | ||
| 1378 | diff --git a/test/torrent/utils/option_strings_test.h b/test/torrent/utils/option_strings_test.h | ||
| 1379 | deleted file mode 100644 | ||
| 1380 | index 55df4f19..00000000 | ||
| 1381 | --- a/test/torrent/utils/option_strings_test.h | ||
| 1382 | +++ /dev/null | ||
| 1383 | @@ -1,17 +0,0 @@ | ||
| 1384 | -#include <cppunit/extensions/HelperMacros.h> | ||
| 1385 | - | ||
| 1386 | -#include "torrent/utils/option_strings.h" | ||
| 1387 | - | ||
| 1388 | -class option_strings_test : public CppUnit::TestFixture { | ||
| 1389 | - CPPUNIT_TEST_SUITE(option_strings_test); | ||
| 1390 | - CPPUNIT_TEST(test_basic); | ||
| 1391 | - CPPUNIT_TEST(test_entries); | ||
| 1392 | - CPPUNIT_TEST_SUITE_END(); | ||
| 1393 | - | ||
| 1394 | -public: | ||
| 1395 | - void setUp() {} | ||
| 1396 | - void tearDown() {} | ||
| 1397 | - | ||
| 1398 | - void test_basic(); | ||
| 1399 | - void test_entries(); | ||
| 1400 | -}; | ||
| 1401 | diff --git a/test/torrent/utils/signal_bitfield_test.h b/test/torrent/utils/signal_bitfield_test.h | ||
| 1402 | deleted file mode 100644 | ||
| 1403 | index 4590de41..00000000 | ||
| 1404 | --- a/test/torrent/utils/signal_bitfield_test.h | ||
| 1405 | +++ /dev/null | ||
| 1406 | @@ -1,23 +0,0 @@ | ||
| 1407 | -#include <cppunit/extensions/HelperMacros.h> | ||
| 1408 | - | ||
| 1409 | -#include "torrent/utils/signal_bitfield.h" | ||
| 1410 | - | ||
| 1411 | -class utils_signal_bitfield_test : public CppUnit::TestFixture { | ||
| 1412 | - CPPUNIT_TEST_SUITE(utils_signal_bitfield_test); | ||
| 1413 | - CPPUNIT_TEST(test_basic); | ||
| 1414 | - CPPUNIT_TEST(test_single); | ||
| 1415 | - CPPUNIT_TEST(test_multiple); | ||
| 1416 | - | ||
| 1417 | - CPPUNIT_TEST(test_thread); | ||
| 1418 | - CPPUNIT_TEST_SUITE_END(); | ||
| 1419 | - | ||
| 1420 | -public: | ||
| 1421 | - void setUp(); | ||
| 1422 | - void tearDown(); | ||
| 1423 | - | ||
| 1424 | - void test_basic(); | ||
| 1425 | - void test_single(); | ||
| 1426 | - void test_multiple(); | ||
| 1427 | - | ||
| 1428 | - void test_thread(); | ||
| 1429 | -}; | ||
| 1430 | diff --git a/test/torrent/utils/test_extents.cc b/test/torrent/utils/test_extents.cc | ||
| 1431 | index 87424d62..8e614e10 100644 | ||
| 1432 | --- a/test/torrent/utils/test_extents.cc | ||
| 1433 | +++ b/test/torrent/utils/test_extents.cc | ||
| 1434 | @@ -2,34 +2,25 @@ | ||
| 1435 | |||
| 1436 | #include "test_extents.h" | ||
| 1437 | |||
| 1438 | -#include <cinttypes> | ||
| 1439 | -#include <iostream> | ||
| 1440 | #include <torrent/utils/extents.h> | ||
| 1441 | +#include <torrent/utils/log.h> | ||
| 1442 | |||
| 1443 | -CPPUNIT_TEST_SUITE_REGISTRATION(ExtentsTest); | ||
| 1444 | +CPPUNIT_TEST_SUITE_NAMED_REGISTRATION(test_extents, "torrent/utils"); | ||
| 1445 | |||
| 1446 | -void | ||
| 1447 | -ExtentsTest::setUp() { | ||
| 1448 | -} | ||
| 1449 | +#define TEST_EXTENT_BEGIN(name) \ | ||
| 1450 | + lt_log_print(torrent::LOG_MOCK_CALLS, "extent: %s", name); | ||
| 1451 | |||
| 1452 | -void | ||
| 1453 | -ExtentsTest::tearDown() { | ||
| 1454 | -} | ||
| 1455 | - | ||
| 1456 | -//typedef torrent::extents<uint32_t, int, 8, 16, 4> extent_type_1; | ||
| 1457 | typedef torrent::extents<uint32_t, int> extent_type_1; | ||
| 1458 | |||
| 1459 | -// typedef torrent::extents<uint32_t, int, 0, 256, 16> extent_type_3; | ||
| 1460 | -/* | ||
| 1461 | template <typename Extent> | ||
| 1462 | bool | ||
| 1463 | verify_extent_data(Extent& extent, const uint32_t* idx, const int* val) { | ||
| 1464 | while (*idx != *(idx + 1)) { | ||
| 1465 | - if (!extent.is_equal_range(*idx, *(idx + 1) - 1, *val)) { | ||
| 1466 | - // std::cout << *idx << ' ' << *(idx + 1) << ' ' << *val << std::endl; | ||
| 1467 | - // std::cout << extent.at(*idx) << std::endl; | ||
| 1468 | - // std::cout << extent.at(*(idx + 1)) << std::endl; | ||
| 1469 | - return false; | ||
| 1470 | + for (auto i = *idx; i != *(idx + 1); i++) { | ||
| 1471 | + lt_log_print(torrent::LOG_MOCK_CALLS, "extent: at %u", i); | ||
| 1472 | + | ||
| 1473 | + if (extent.at(i) != *val) | ||
| 1474 | + return false; | ||
| 1475 | } | ||
| 1476 | |||
| 1477 | idx++; | ||
| 1478 | @@ -40,34 +31,32 @@ verify_extent_data(Extent& extent, const uint32_t* idx, const int* val) { | ||
| 1479 | } | ||
| 1480 | |||
| 1481 | static const uint32_t idx_empty[] = {0, 256, 256}; | ||
| 1482 | -static const int val_empty[] = {0, 1}; | ||
| 1483 | +static const int val_empty[] = {0}; | ||
| 1484 | |||
| 1485 | static const uint32_t idx_basic_1[] = {0, 1, 255, 256, 256}; | ||
| 1486 | static const int val_basic_1[] = {1, 0, 1}; | ||
| 1487 | |||
| 1488 | -// static const uint32_t idx_basic_2[] = {0, 1, 16, 255, 256, 256}; | ||
| 1489 | -// static const int val_basic_2[] = {1, 0, 2, 1}; | ||
| 1490 | -*/ | ||
| 1491 | void | ||
| 1492 | -ExtentsTest::test_basic() { | ||
| 1493 | +test_extents::test_basic() { | ||
| 1494 | extent_type_1 extent_1; | ||
| 1495 | -/* | ||
| 1496 | - // Test empty. | ||
| 1497 | - CPPUNIT_ASSERT(verify_extent_data(extent_1, idx_empty, val_empty)); | ||
| 1498 | - | ||
| 1499 | - CPPUNIT_ASSERT(extent_1.at(0) == int()); | ||
| 1500 | - CPPUNIT_ASSERT(extent_1.at(255) == int()); | ||
| 1501 | + extent_1.insert(0, 255, int()); | ||
| 1502 | |||
| 1503 | - extent_1.insert(0, 0, 1); | ||
| 1504 | - extent_1.insert(255, 0, 1); | ||
| 1505 | + { TEST_EXTENT_BEGIN("empty"); | ||
| 1506 | + CPPUNIT_ASSERT(verify_extent_data(extent_1, idx_empty, val_empty)); | ||
| 1507 | |||
| 1508 | - CPPUNIT_ASSERT(extent_1.at(0) == 1); | ||
| 1509 | - CPPUNIT_ASSERT(extent_1.at(255) == 1); | ||
| 1510 | + CPPUNIT_ASSERT(extent_1.at(0) == int()); | ||
| 1511 | + CPPUNIT_ASSERT(extent_1.at(255) == int()); | ||
| 1512 | + }; | ||
| 1513 | + { TEST_EXTENT_BEGIN("borders"); | ||
| 1514 | |||
| 1515 | - CPPUNIT_ASSERT(verify_extent_data(extent_1, idx_basic_1, val_basic_1)); | ||
| 1516 | + extent_1.insert(0, 0, 1); | ||
| 1517 | + extent_1.insert(255, 255, 1); | ||
| 1518 | + // This step shouldn't be needed. | ||
| 1519 | + extent_1.insert(1, 254, int()); | ||
| 1520 | |||
| 1521 | - // extent_1.insert(38, 3, 2); | ||
| 1522 | + CPPUNIT_ASSERT(extent_1.at(0) == 1); | ||
| 1523 | + CPPUNIT_ASSERT(extent_1.at(255) == 1); | ||
| 1524 | |||
| 1525 | - // CPPUNIT_ASSERT(verify_extent_data(extent_1, idx_basic_2, val_basic_2)); | ||
| 1526 | -*/ | ||
| 1527 | + CPPUNIT_ASSERT(verify_extent_data(extent_1, idx_basic_1, val_basic_1)); | ||
| 1528 | + }; | ||
| 1529 | } | ||
| 1530 | diff --git a/test/torrent/utils/test_extents.h b/test/torrent/utils/test_extents.h | ||
| 1531 | index fd790cf8..e187f6a7 100644 | ||
| 1532 | --- a/test/torrent/utils/test_extents.h | ||
| 1533 | +++ b/test/torrent/utils/test_extents.h | ||
| 1534 | @@ -1,13 +1,10 @@ | ||
| 1535 | -#include <cppunit/extensions/HelperMacros.h> | ||
| 1536 | +#include "helpers/test_fixture.h" | ||
| 1537 | |||
| 1538 | -class ExtentsTest : public CppUnit::TestFixture { | ||
| 1539 | - CPPUNIT_TEST_SUITE(ExtentsTest); | ||
| 1540 | +class test_extents : public test_fixture { | ||
| 1541 | + CPPUNIT_TEST_SUITE(test_extents); | ||
| 1542 | CPPUNIT_TEST(test_basic); | ||
| 1543 | CPPUNIT_TEST_SUITE_END(); | ||
| 1544 | |||
| 1545 | public: | ||
| 1546 | - void setUp(); | ||
| 1547 | - void tearDown(); | ||
| 1548 | - | ||
| 1549 | void test_basic(); | ||
| 1550 | }; | ||
| 1551 | diff --git a/test/torrent/utils/log_test.cc b/test/torrent/utils/test_log.cc | ||
| 1552 | similarity index 92% | ||
| 1553 | rename from test/torrent/utils/log_test.cc | ||
| 1554 | rename to test/torrent/utils/test_log.cc | ||
| 1555 | index 8cc00ef8..fec7e505 100644 | ||
| 1556 | --- a/test/torrent/utils/log_test.cc | ||
| 1557 | +++ b/test/torrent/utils/test_log.cc | ||
| 1558 | @@ -1,5 +1,7 @@ | ||
| 1559 | #include "config.h" | ||
| 1560 | |||
| 1561 | +#include "test_log.h" | ||
| 1562 | + | ||
| 1563 | #include <algorithm> | ||
| 1564 | #include <cstring> | ||
| 1565 | #include <fstream> | ||
| 1566 | @@ -9,15 +11,13 @@ | ||
| 1567 | #include <torrent/exceptions.h> | ||
| 1568 | #include <torrent/utils/log.h> | ||
| 1569 | |||
| 1570 | -#include "log_test.h" | ||
| 1571 | +CPPUNIT_TEST_SUITE_NAMED_REGISTRATION(test_log, "torrent/utils"); | ||
| 1572 | |||
| 1573 | namespace torrent { | ||
| 1574 | typedef std::vector<std::pair<std::string, log_slot> > log_output_list; | ||
| 1575 | extern log_output_list log_outputs; | ||
| 1576 | } | ||
| 1577 | |||
| 1578 | -CPPUNIT_TEST_SUITE_REGISTRATION(utils_log_test); | ||
| 1579 | - | ||
| 1580 | const char* expected_output = NULL; | ||
| 1581 | unsigned int output_mask; | ||
| 1582 | |||
| 1583 | @@ -35,19 +35,19 @@ test_output(const char* output, unsigned int length, unsigned int mask) { | ||
| 1584 | CPPUNIT_ASSERT(output_mask == (mask)); | ||
| 1585 | |||
| 1586 | void | ||
| 1587 | -utils_log_test::setUp() { | ||
| 1588 | +test_log::setUp() { | ||
| 1589 | // Don't initialize since this creates the group->child connections. | ||
| 1590 | // torrent::log_initialize(); | ||
| 1591 | torrent::log_cleanup(); | ||
| 1592 | } | ||
| 1593 | |||
| 1594 | void | ||
| 1595 | -utils_log_test::tearDown() { | ||
| 1596 | +test_log::tearDown() { | ||
| 1597 | torrent::log_cleanup(); | ||
| 1598 | } | ||
| 1599 | |||
| 1600 | void | ||
| 1601 | -utils_log_test::test_basic() { | ||
| 1602 | +test_log::test_basic() { | ||
| 1603 | CPPUNIT_ASSERT(!torrent::log_groups.empty()); | ||
| 1604 | CPPUNIT_ASSERT(torrent::log_groups.size() == torrent::LOG_GROUP_MAX_SIZE); | ||
| 1605 | |||
| 1606 | @@ -61,7 +61,7 @@ open_output(const char* name, int mask = 0) { | ||
| 1607 | } | ||
| 1608 | |||
| 1609 | void | ||
| 1610 | -utils_log_test::test_output_open() { | ||
| 1611 | +test_log::test_output_open() { | ||
| 1612 | CPPUNIT_ASSERT(torrent::log_groups[0].size_outputs() == 0); | ||
| 1613 | |||
| 1614 | // Add test for unknown output names. | ||
| 1615 | @@ -92,7 +92,7 @@ utils_log_test::test_output_open() { | ||
| 1616 | // on unused log items. | ||
| 1617 | |||
| 1618 | void | ||
| 1619 | -utils_log_test::test_print() { | ||
| 1620 | +test_log::test_print() { | ||
| 1621 | open_output("test_print_1", 0x1); | ||
| 1622 | open_output("test_print_2", 0x2); | ||
| 1623 | torrent::log_add_group_output(0, "test_print_1"); | ||
| 1624 | @@ -113,7 +113,7 @@ enum { | ||
| 1625 | }; | ||
| 1626 | |||
| 1627 | void | ||
| 1628 | -utils_log_test::test_children() { | ||
| 1629 | +test_log::test_children() { | ||
| 1630 | open_output("test_children_1", 0x1); | ||
| 1631 | open_output("test_children_2", 0x2); | ||
| 1632 | torrent::log_add_group_output(GROUP_PARENT_1, "test_children_1"); | ||
| 1633 | @@ -136,8 +136,8 @@ utils_log_test::test_children() { | ||
| 1634 | } | ||
| 1635 | |||
| 1636 | void | ||
| 1637 | -utils_log_test::test_file_output() { | ||
| 1638 | - std::string filename = "utils_log_test.XXXXXX"; | ||
| 1639 | +test_log::test_file_output() { | ||
| 1640 | + std::string filename = "test_log.XXXXXX"; | ||
| 1641 | |||
| 1642 | mktemp(&*filename.begin()); | ||
| 1643 | |||
| 1644 | @@ -159,8 +159,8 @@ utils_log_test::test_file_output() { | ||
| 1645 | } | ||
| 1646 | |||
| 1647 | void | ||
| 1648 | -utils_log_test::test_file_output_append() { | ||
| 1649 | - std::string filename = "utils_log_test.XXXXXX"; | ||
| 1650 | +test_log::test_file_output_append() { | ||
| 1651 | + std::string filename = "test_log.XXXXXX"; | ||
| 1652 | |||
| 1653 | mktemp(&*filename.begin()); | ||
| 1654 | |||
| 1655 | diff --git a/test/torrent/utils/log_test.h b/test/torrent/utils/test_log.h | ||
| 1656 | similarity index 71% | ||
| 1657 | rename from test/torrent/utils/log_test.h | ||
| 1658 | rename to test/torrent/utils/test_log.h | ||
| 1659 | index d4cb3bc6..a06c95ae 100644 | ||
| 1660 | --- a/test/torrent/utils/log_test.h | ||
| 1661 | +++ b/test/torrent/utils/test_log.h | ||
| 1662 | @@ -1,9 +1,7 @@ | ||
| 1663 | -#include <cppunit/extensions/HelperMacros.h> | ||
| 1664 | +#include "helpers/test_fixture.h" | ||
| 1665 | |||
| 1666 | -#include "torrent/utils/log.h" | ||
| 1667 | - | ||
| 1668 | -class utils_log_test : public CppUnit::TestFixture { | ||
| 1669 | - CPPUNIT_TEST_SUITE(utils_log_test); | ||
| 1670 | +class test_log : public test_fixture { | ||
| 1671 | + CPPUNIT_TEST_SUITE(test_log); | ||
| 1672 | CPPUNIT_TEST(test_basic); | ||
| 1673 | CPPUNIT_TEST(test_output_open); | ||
| 1674 | |||
| 1675 | diff --git a/test/torrent/utils/test_log_buffer.cc b/test/torrent/utils/test_log_buffer.cc | ||
| 1676 | index a56a5365..58412750 100644 | ||
| 1677 | --- a/test/torrent/utils/test_log_buffer.cc | ||
| 1678 | +++ b/test/torrent/utils/test_log_buffer.cc | ||
| 1679 | @@ -7,18 +7,10 @@ | ||
| 1680 | |||
| 1681 | CPPUNIT_TEST_SUITE_NAMED_REGISTRATION(test_log_buffer, "torrent/utils"); | ||
| 1682 | |||
| 1683 | -void | ||
| 1684 | -test_log_buffer::setUp() { | ||
| 1685 | - torrent::cachedTime = rak::timer::from_seconds(1000); | ||
| 1686 | -} | ||
| 1687 | - | ||
| 1688 | -void | ||
| 1689 | -test_log_buffer::tearDown() { | ||
| 1690 | -} | ||
| 1691 | - | ||
| 1692 | void | ||
| 1693 | test_log_buffer::test_basic() { | ||
| 1694 | torrent::log_buffer log; | ||
| 1695 | + torrent::cachedTime = rak::timer::from_seconds(1000); | ||
| 1696 | |||
| 1697 | log.lock(); | ||
| 1698 | CPPUNIT_ASSERT(log.empty()); | ||
| 1699 | @@ -46,6 +38,7 @@ test_log_buffer::test_basic() { | ||
| 1700 | void | ||
| 1701 | test_log_buffer::test_timestamps() { | ||
| 1702 | torrent::log_buffer log; | ||
| 1703 | + torrent::cachedTime = rak::timer::from_seconds(1000); | ||
| 1704 | |||
| 1705 | log.lock_and_push_log("foobar", 6, 0); | ||
| 1706 | CPPUNIT_ASSERT(log.back().timestamp == 1000); | ||
| 1707 | diff --git a/test/torrent/utils/test_log_buffer.h b/test/torrent/utils/test_log_buffer.h | ||
| 1708 | index 290df4c1..39c6b879 100644 | ||
| 1709 | --- a/test/torrent/utils/test_log_buffer.h | ||
| 1710 | +++ b/test/torrent/utils/test_log_buffer.h | ||
| 1711 | @@ -2,16 +2,11 @@ | ||
| 1712 | |||
| 1713 | class test_log_buffer : public test_fixture { | ||
| 1714 | CPPUNIT_TEST_SUITE(test_log_buffer); | ||
| 1715 | - | ||
| 1716 | CPPUNIT_TEST(test_basic); | ||
| 1717 | CPPUNIT_TEST(test_timestamps); | ||
| 1718 | - | ||
| 1719 | CPPUNIT_TEST_SUITE_END(); | ||
| 1720 | |||
| 1721 | public: | ||
| 1722 | - void setUp(); | ||
| 1723 | - void tearDown(); | ||
| 1724 | - | ||
| 1725 | void test_basic(); | ||
| 1726 | void test_timestamps(); | ||
| 1727 | }; | ||
| 1728 | diff --git a/test/torrent/utils/option_strings_test.cc b/test/torrent/utils/test_option_strings.cc | ||
| 1729 | similarity index 65% | ||
| 1730 | rename from test/torrent/utils/option_strings_test.cc | ||
| 1731 | rename to test/torrent/utils/test_option_strings.cc | ||
| 1732 | index a9bdcc89..68da1d2b 100644 | ||
| 1733 | --- a/test/torrent/utils/option_strings_test.cc | ||
| 1734 | +++ b/test/torrent/utils/test_option_strings.cc | ||
| 1735 | @@ -1,35 +1,22 @@ | ||
| 1736 | #include "config.h" | ||
| 1737 | |||
| 1738 | -#include <fstream> | ||
| 1739 | -#include <functional> | ||
| 1740 | -#include <iostream> | ||
| 1741 | +#include "test_option_strings.h" | ||
| 1742 | |||
| 1743 | -#include <torrent/exceptions.h> | ||
| 1744 | -#include <torrent/utils/option_strings.h> | ||
| 1745 | - | ||
| 1746 | -#include <torrent/connection_manager.h> | ||
| 1747 | -#include <torrent/object.h> | ||
| 1748 | #include <torrent/download.h> | ||
| 1749 | -#include <torrent/download/choke_group.h> | ||
| 1750 | -#include <torrent/download/choke_queue.h> | ||
| 1751 | +#include <torrent/utils/option_strings.h> | ||
| 1752 | #include <torrent/utils/log.h> | ||
| 1753 | |||
| 1754 | -#include "option_strings_test.h" | ||
| 1755 | - | ||
| 1756 | -CPPUNIT_TEST_SUITE_REGISTRATION(option_strings_test); | ||
| 1757 | - | ||
| 1758 | -void | ||
| 1759 | -option_strings_test::test_basic() { | ||
| 1760 | - | ||
| 1761 | -} | ||
| 1762 | +CPPUNIT_TEST_SUITE_NAMED_REGISTRATION(test_option_strings, "torrent/utils"); | ||
| 1763 | |||
| 1764 | #define TEST_ENTRY(group, name, value) \ | ||
| 1765 | - { std::string result(torrent::option_as_string(torrent::group, value)); \ | ||
| 1766 | + { lt_log_print(torrent::LOG_MOCK_CALLS, "option_string: %s", name); \ | ||
| 1767 | + std::string result(torrent::option_as_string(torrent::group, value)); \ | ||
| 1768 | CPPUNIT_ASSERT_MESSAGE("Not found '" + result + "'", result == name); \ | ||
| 1769 | - CPPUNIT_ASSERT(torrent::option_find_string(torrent::group, name) == value); } | ||
| 1770 | + CPPUNIT_ASSERT(torrent::option_find_string(torrent::group, name) == value); \ | ||
| 1771 | + } | ||
| 1772 | |||
| 1773 | void | ||
| 1774 | -option_strings_test::test_entries() { | ||
| 1775 | +test_option_strings::test_entries() { | ||
| 1776 | TEST_ENTRY(OPTION_CONNECTION_TYPE, "leech", torrent::Download::CONNECTION_LEECH); | ||
| 1777 | TEST_ENTRY(OPTION_CONNECTION_TYPE, "seed", torrent::Download::CONNECTION_SEED); | ||
| 1778 | TEST_ENTRY(OPTION_CONNECTION_TYPE, "initial_seed", torrent::Download::CONNECTION_INITIAL_SEED); | ||
| 1779 | diff --git a/test/torrent/utils/test_option_strings.h b/test/torrent/utils/test_option_strings.h | ||
| 1780 | new file mode 100644 | ||
| 1781 | index 00000000..dc86e735 | ||
| 1782 | --- /dev/null | ||
| 1783 | +++ b/test/torrent/utils/test_option_strings.h | ||
| 1784 | @@ -0,0 +1,10 @@ | ||
| 1785 | +#include "helpers/test_fixture.h" | ||
| 1786 | + | ||
| 1787 | +class test_option_strings : public test_fixture { | ||
| 1788 | + CPPUNIT_TEST_SUITE(test_option_strings); | ||
| 1789 | + CPPUNIT_TEST(test_entries); | ||
| 1790 | + CPPUNIT_TEST_SUITE_END(); | ||
| 1791 | + | ||
| 1792 | +public: | ||
| 1793 | + void test_entries(); | ||
| 1794 | +}; | ||
| 1795 | diff --git a/test/torrent/utils/test_queue_buckets.cc b/test/torrent/utils/test_queue_buckets.cc | ||
| 1796 | index a32d17e7..49d1bae6 100644 | ||
| 1797 | --- a/test/torrent/utils/test_queue_buckets.cc | ||
| 1798 | +++ b/test/torrent/utils/test_queue_buckets.cc | ||
| 1799 | @@ -5,7 +5,7 @@ | ||
| 1800 | #include "utils/instrumentation.h" | ||
| 1801 | #include "utils/queue_buckets.h" | ||
| 1802 | |||
| 1803 | -CPPUNIT_TEST_SUITE_REGISTRATION(TestQueueBuckets); | ||
| 1804 | +CPPUNIT_TEST_SUITE_NAMED_REGISTRATION(test_queue_buckets, "torrent/utils"); | ||
| 1805 | |||
| 1806 | struct test_constants { | ||
| 1807 | static const int bucket_count = 2; | ||
| 1808 | @@ -87,7 +87,7 @@ struct test_queue_bucket_compare { | ||
| 1809 | // | ||
| 1810 | |||
| 1811 | void | ||
| 1812 | -TestQueueBuckets::test_basic() { | ||
| 1813 | +test_queue_buckets::test_basic() { | ||
| 1814 | torrent::instrumentation_initialize(); | ||
| 1815 | |||
| 1816 | buckets_type buckets; | ||
| 1817 | @@ -129,7 +129,7 @@ TestQueueBuckets::test_basic() { | ||
| 1818 | } | ||
| 1819 | |||
| 1820 | void | ||
| 1821 | -TestQueueBuckets::test_erase() { | ||
| 1822 | +test_queue_buckets::test_erase() { | ||
| 1823 | items_destroyed = 0; | ||
| 1824 | torrent::instrumentation_initialize(); | ||
| 1825 | |||
| 1826 | @@ -162,7 +162,7 @@ bucket_queue_find_in_any(const buckets_type& buckets, int value) { | ||
| 1827 | } | ||
| 1828 | |||
| 1829 | void | ||
| 1830 | -TestQueueBuckets::test_find() { | ||
| 1831 | +test_queue_buckets::test_find() { | ||
| 1832 | items_destroyed = 0; | ||
| 1833 | torrent::instrumentation_initialize(); | ||
| 1834 | |||
| 1835 | @@ -183,7 +183,7 @@ TestQueueBuckets::test_find() { | ||
| 1836 | } | ||
| 1837 | |||
| 1838 | void | ||
| 1839 | -TestQueueBuckets::test_destroy_range() { | ||
| 1840 | +test_queue_buckets::test_destroy_range() { | ||
| 1841 | items_destroyed = 0; | ||
| 1842 | torrent::instrumentation_initialize(); | ||
| 1843 | |||
| 1844 | @@ -206,7 +206,7 @@ TestQueueBuckets::test_destroy_range() { | ||
| 1845 | } | ||
| 1846 | |||
| 1847 | void | ||
| 1848 | -TestQueueBuckets::test_move_range() { | ||
| 1849 | +test_queue_buckets::test_move_range() { | ||
| 1850 | items_destroyed = 0; | ||
| 1851 | torrent::instrumentation_initialize(); | ||
| 1852 | |||
| 1853 | diff --git a/test/torrent/utils/test_queue_buckets.h b/test/torrent/utils/test_queue_buckets.h | ||
| 1854 | index 94624573..a7f1c30a 100644 | ||
| 1855 | --- a/test/torrent/utils/test_queue_buckets.h | ||
| 1856 | +++ b/test/torrent/utils/test_queue_buckets.h | ||
| 1857 | @@ -1,21 +1,18 @@ | ||
| 1858 | -#include <cppunit/extensions/HelperMacros.h> | ||
| 1859 | +#include "helpers/test_fixture.h" | ||
| 1860 | |||
| 1861 | -#include "protocol/request_list.h" | ||
| 1862 | +class test_queue_buckets : public test_fixture { | ||
| 1863 | + CPPUNIT_TEST_SUITE(test_queue_buckets); | ||
| 1864 | |||
| 1865 | -class TestQueueBuckets : public CppUnit::TestFixture { | ||
| 1866 | - CPPUNIT_TEST_SUITE(TestQueueBuckets); | ||
| 1867 | CPPUNIT_TEST(test_basic); | ||
| 1868 | CPPUNIT_TEST(test_erase); | ||
| 1869 | CPPUNIT_TEST(test_find); | ||
| 1870 | |||
| 1871 | CPPUNIT_TEST(test_destroy_range); | ||
| 1872 | CPPUNIT_TEST(test_move_range); | ||
| 1873 | + | ||
| 1874 | CPPUNIT_TEST_SUITE_END(); | ||
| 1875 | |||
| 1876 | public: | ||
| 1877 | - void setUp() {} | ||
| 1878 | - void tearDown() {} | ||
| 1879 | - | ||
| 1880 | void test_basic(); | ||
| 1881 | void test_erase(); | ||
| 1882 | void test_find(); | ||
| 1883 | diff --git a/test/torrent/utils/signal_bitfield_test.cc b/test/torrent/utils/test_signal_bitfield.cc | ||
| 1884 | similarity index 85% | ||
| 1885 | rename from test/torrent/utils/signal_bitfield_test.cc | ||
| 1886 | rename to test/torrent/utils/test_signal_bitfield.cc | ||
| 1887 | index 34b622b3..4ecd18c0 100644 | ||
| 1888 | --- a/test/torrent/utils/signal_bitfield_test.cc | ||
| 1889 | +++ b/test/torrent/utils/test_signal_bitfield.cc | ||
| 1890 | @@ -1,13 +1,15 @@ | ||
| 1891 | #include "config.h" | ||
| 1892 | |||
| 1893 | +#include "test_signal_bitfield.h" | ||
| 1894 | + | ||
| 1895 | +#include "helpers/test_thread.h" | ||
| 1896 | +#include "helpers/test_utils.h" | ||
| 1897 | + | ||
| 1898 | #include <torrent/exceptions.h> | ||
| 1899 | #include <torrent/utils/signal_bitfield.h> | ||
| 1900 | #include <torrent/utils/thread_base.h> | ||
| 1901 | |||
| 1902 | -#include "signal_bitfield_test.h" | ||
| 1903 | -#include "thread_base_test.h" | ||
| 1904 | - | ||
| 1905 | -CPPUNIT_TEST_SUITE_REGISTRATION(utils_signal_bitfield_test); | ||
| 1906 | +CPPUNIT_TEST_SUITE_NAMED_REGISTRATION(test_signal_bitfield, "torrent/utils"); | ||
| 1907 | |||
| 1908 | static void | ||
| 1909 | mark_index(uint32_t* bitfield, unsigned int index) { | ||
| 1910 | @@ -20,13 +22,10 @@ check_index(uint32_t* bitfield, unsigned int index) { | ||
| 1911 | } | ||
| 1912 | |||
| 1913 | void | ||
| 1914 | -utils_signal_bitfield_test::setUp() { | ||
| 1915 | -} | ||
| 1916 | - | ||
| 1917 | -void | ||
| 1918 | -utils_signal_bitfield_test::tearDown() { | ||
| 1919 | +test_signal_bitfield::tearDown() { | ||
| 1920 | CPPUNIT_ASSERT(torrent::thread_base::trylock_global_lock()); | ||
| 1921 | torrent::thread_base::release_global_lock(); | ||
| 1922 | + test_fixture::tearDown(); | ||
| 1923 | } | ||
| 1924 | |||
| 1925 | static bool | ||
| 1926 | @@ -54,7 +53,7 @@ verify_did_internal_error(std::function<unsigned int ()> func, bool should_throw | ||
| 1927 | did_throw)); | ||
| 1928 | |||
| 1929 | void | ||
| 1930 | -utils_signal_bitfield_test::test_basic() { | ||
| 1931 | +test_signal_bitfield::test_basic() { | ||
| 1932 | SETUP_SIGNAL_BITFIELD(); | ||
| 1933 | |||
| 1934 | CPPUNIT_ASSERT(torrent::signal_bitfield::max_size == sizeof(torrent::signal_bitfield::bitfield_type) * 8); | ||
| 1935 | @@ -68,7 +67,7 @@ utils_signal_bitfield_test::test_basic() { | ||
| 1936 | } | ||
| 1937 | |||
| 1938 | void | ||
| 1939 | -utils_signal_bitfield_test::test_single() { | ||
| 1940 | +test_signal_bitfield::test_single() { | ||
| 1941 | SETUP_SIGNAL_BITFIELD(); | ||
| 1942 | |||
| 1943 | CPPUNIT_ASSERT(signal_bitfield.add_signal(std::bind(&mark_index, &marked_bitfield, 0)) == 0); | ||
| 1944 | @@ -86,7 +85,7 @@ utils_signal_bitfield_test::test_single() { | ||
| 1945 | } | ||
| 1946 | |||
| 1947 | void | ||
| 1948 | -utils_signal_bitfield_test::test_multiple() { | ||
| 1949 | +test_signal_bitfield::test_multiple() { | ||
| 1950 | SETUP_SIGNAL_BITFIELD(); | ||
| 1951 | |||
| 1952 | for (unsigned int i = 0; i < torrent::signal_bitfield::max_size; i++) | ||
| 1953 | @@ -106,10 +105,10 @@ utils_signal_bitfield_test::test_multiple() { | ||
| 1954 | } | ||
| 1955 | |||
| 1956 | void | ||
| 1957 | -utils_signal_bitfield_test::test_thread() { | ||
| 1958 | +test_signal_bitfield::test_threaded() { | ||
| 1959 | uint32_t marked_bitfield = 0; | ||
| 1960 | - thread_test* thread = new thread_test; | ||
| 1961 | - // thread->set_test_flag(thread_test::test_flag_long_timeout); | ||
| 1962 | + test_thread* thread = new test_thread; | ||
| 1963 | + // thread->set_test_flag(test_thread::test_flag_long_timeout); | ||
| 1964 | |||
| 1965 | for (unsigned int i = 0; i < torrent::signal_bitfield::max_size; i++) | ||
| 1966 | CPPUNIT_ASSERT(thread->signal_bitfield()->add_signal(std::bind(&mark_index, &marked_bitfield, i)) == i); | ||
| 1967 | @@ -131,7 +130,7 @@ utils_signal_bitfield_test::test_thread() { | ||
| 1968 | } | ||
| 1969 | |||
| 1970 | thread->stop_thread(); | ||
| 1971 | - CPPUNIT_ASSERT(wait_for_true(std::bind(&thread_test::is_state, thread, thread_test::STATE_INACTIVE))); | ||
| 1972 | + CPPUNIT_ASSERT(wait_for_true(std::bind(&test_thread::is_state, thread, test_thread::STATE_INACTIVE))); | ||
| 1973 | |||
| 1974 | delete thread; | ||
| 1975 | } | ||
| 1976 | diff --git a/test/torrent/utils/test_signal_bitfield.h b/test/torrent/utils/test_signal_bitfield.h | ||
| 1977 | new file mode 100644 | ||
| 1978 | index 00000000..2d24d955 | ||
| 1979 | --- /dev/null | ||
| 1980 | +++ b/test/torrent/utils/test_signal_bitfield.h | ||
| 1981 | @@ -0,0 +1,22 @@ | ||
| 1982 | +#include "helpers/test_fixture.h" | ||
| 1983 | + | ||
| 1984 | +class test_signal_bitfield : public test_fixture { | ||
| 1985 | + CPPUNIT_TEST_SUITE(test_signal_bitfield); | ||
| 1986 | + | ||
| 1987 | + CPPUNIT_TEST(test_basic); | ||
| 1988 | + CPPUNIT_TEST(test_single); | ||
| 1989 | + CPPUNIT_TEST(test_multiple); | ||
| 1990 | + | ||
| 1991 | + CPPUNIT_TEST(test_threaded); | ||
| 1992 | + | ||
| 1993 | + CPPUNIT_TEST_SUITE_END(); | ||
| 1994 | + | ||
| 1995 | +public: | ||
| 1996 | + void tearDown(); | ||
| 1997 | + | ||
| 1998 | + void test_basic(); | ||
| 1999 | + void test_single(); | ||
| 2000 | + void test_multiple(); | ||
| 2001 | + | ||
| 2002 | + void test_threaded(); | ||
| 2003 | +}; | ||
| 2004 | diff --git a/test/torrent/utils/test_thread_base.cc b/test/torrent/utils/test_thread_base.cc | ||
| 2005 | new file mode 100644 | ||
| 2006 | index 00000000..33519b7c | ||
| 2007 | --- /dev/null | ||
| 2008 | +++ b/test/torrent/utils/test_thread_base.cc | ||
| 2009 | @@ -0,0 +1,169 @@ | ||
| 2010 | +#include "config.h" | ||
| 2011 | + | ||
| 2012 | +#include "test_thread_base.h" | ||
| 2013 | + | ||
| 2014 | +#include "helpers/test_thread.h" | ||
| 2015 | +#include "helpers/test_utils.h" | ||
| 2016 | + | ||
| 2017 | +#include <functional> | ||
| 2018 | +#include <unistd.h> | ||
| 2019 | + | ||
| 2020 | +#include "torrent/exceptions.h" | ||
| 2021 | +#include "torrent/poll_select.h" | ||
| 2022 | +#include "torrent/utils/log.h" | ||
| 2023 | +#include "torrent/utils/thread_base.h" | ||
| 2024 | + | ||
| 2025 | +CPPUNIT_TEST_SUITE_NAMED_REGISTRATION(test_thread_base, "torrent/utils"); | ||
| 2026 | + | ||
| 2027 | +#define TEST_BEGIN(name) \ | ||
| 2028 | + lt_log_print(torrent::LOG_MOCK_CALLS, "thread_base: %s", name); \ | ||
| 2029 | + | ||
| 2030 | +void throw_shutdown_exception() { throw torrent::shutdown_exception(); } | ||
| 2031 | + | ||
| 2032 | +void | ||
| 2033 | +test_thread_base::tearDown() { | ||
| 2034 | + CPPUNIT_ASSERT(torrent::thread_base::trylock_global_lock()); | ||
| 2035 | + torrent::thread_base::release_global_lock(); | ||
| 2036 | + test_fixture::tearDown(); | ||
| 2037 | +} | ||
| 2038 | + | ||
| 2039 | +void | ||
| 2040 | +test_thread_base::test_basic() { | ||
| 2041 | + test_thread* thread = new test_thread; | ||
| 2042 | + | ||
| 2043 | + CPPUNIT_ASSERT(thread->flags() == 0); | ||
| 2044 | + | ||
| 2045 | + CPPUNIT_ASSERT(!thread->is_main_polling()); | ||
| 2046 | + CPPUNIT_ASSERT(!thread->is_active()); | ||
| 2047 | + CPPUNIT_ASSERT(thread->global_queue_size() == 0); | ||
| 2048 | + CPPUNIT_ASSERT(thread->poll() == NULL); | ||
| 2049 | + | ||
| 2050 | + // Check active... | ||
| 2051 | +} | ||
| 2052 | + | ||
| 2053 | +void | ||
| 2054 | +test_thread_base::test_lifecycle() { | ||
| 2055 | + test_thread* thread = new test_thread; | ||
| 2056 | + | ||
| 2057 | + CPPUNIT_ASSERT(thread->state() == torrent::thread_base::STATE_UNKNOWN); | ||
| 2058 | + CPPUNIT_ASSERT(thread->test_state() == test_thread::TEST_NONE); | ||
| 2059 | + | ||
| 2060 | + thread->init_thread(); | ||
| 2061 | + CPPUNIT_ASSERT(thread->state() == torrent::thread_base::STATE_INITIALIZED); | ||
| 2062 | + CPPUNIT_ASSERT(thread->is_initialized()); | ||
| 2063 | + CPPUNIT_ASSERT(thread->test_state() == test_thread::TEST_PRE_START); | ||
| 2064 | + | ||
| 2065 | + thread->set_pre_stop(); | ||
| 2066 | + CPPUNIT_ASSERT(!wait_for_true(std::bind(&test_thread::is_test_state, thread, test_thread::TEST_PRE_STOP))); | ||
| 2067 | + | ||
| 2068 | + thread->start_thread(); | ||
| 2069 | + CPPUNIT_ASSERT(wait_for_true(std::bind(&test_thread::is_state, thread, test_thread::STATE_ACTIVE))); | ||
| 2070 | + CPPUNIT_ASSERT(thread->is_active()); | ||
| 2071 | + CPPUNIT_ASSERT(wait_for_true(std::bind(&test_thread::is_test_state, thread, test_thread::TEST_PRE_STOP))); | ||
| 2072 | + | ||
| 2073 | + thread->stop_thread(); | ||
| 2074 | + CPPUNIT_ASSERT(wait_for_true(std::bind(&test_thread::is_state, thread, test_thread::STATE_INACTIVE))); | ||
| 2075 | + CPPUNIT_ASSERT(thread->is_inactive()); | ||
| 2076 | + | ||
| 2077 | + delete thread; | ||
| 2078 | +} | ||
| 2079 | + | ||
| 2080 | +void | ||
| 2081 | +test_thread_base::test_global_lock_basic() { | ||
| 2082 | + test_thread* thread = new test_thread; | ||
| 2083 | + | ||
| 2084 | + thread->init_thread(); | ||
| 2085 | + thread->start_thread(); | ||
| 2086 | + | ||
| 2087 | + CPPUNIT_ASSERT(torrent::thread_base::global_queue_size() == 0); | ||
| 2088 | + | ||
| 2089 | + // Acquire main thread... | ||
| 2090 | + CPPUNIT_ASSERT(torrent::thread_base::trylock_global_lock()); | ||
| 2091 | + CPPUNIT_ASSERT(!torrent::thread_base::trylock_global_lock()); | ||
| 2092 | + | ||
| 2093 | + torrent::thread_base::release_global_lock(); | ||
| 2094 | + CPPUNIT_ASSERT(torrent::thread_base::trylock_global_lock()); | ||
| 2095 | + CPPUNIT_ASSERT(!torrent::thread_base::trylock_global_lock()); | ||
| 2096 | + | ||
| 2097 | + torrent::thread_base::release_global_lock(); | ||
| 2098 | + torrent::thread_base::acquire_global_lock(); | ||
| 2099 | + CPPUNIT_ASSERT(!torrent::thread_base::trylock_global_lock()); | ||
| 2100 | + | ||
| 2101 | + thread->set_acquire_global(); | ||
| 2102 | + CPPUNIT_ASSERT(!wait_for_true(std::bind(&test_thread::is_test_flags, thread, test_thread::test_flag_has_global))); | ||
| 2103 | + | ||
| 2104 | + torrent::thread_base::release_global_lock(); | ||
| 2105 | + CPPUNIT_ASSERT(wait_for_true(std::bind(&test_thread::is_test_flags, thread, test_thread::test_flag_has_global))); | ||
| 2106 | + | ||
| 2107 | + CPPUNIT_ASSERT(!torrent::thread_base::trylock_global_lock()); | ||
| 2108 | + torrent::thread_base::release_global_lock(); | ||
| 2109 | + CPPUNIT_ASSERT(torrent::thread_base::trylock_global_lock()); | ||
| 2110 | + | ||
| 2111 | + // Test waive (loop). | ||
| 2112 | + | ||
| 2113 | + CPPUNIT_ASSERT(torrent::thread_base::global_queue_size() == 0); | ||
| 2114 | + | ||
| 2115 | + torrent::thread_base::release_global_lock(); | ||
| 2116 | + thread->stop_thread(); | ||
| 2117 | + CPPUNIT_ASSERT(wait_for_true(std::bind(&test_thread::is_state, thread, test_thread::STATE_INACTIVE))); | ||
| 2118 | + | ||
| 2119 | + delete thread; | ||
| 2120 | +} | ||
| 2121 | + | ||
| 2122 | +void | ||
| 2123 | +test_thread_base::test_interrupt() { | ||
| 2124 | + test_thread* thread = new test_thread; | ||
| 2125 | + thread->set_test_flag(test_thread::test_flag_long_timeout); | ||
| 2126 | + | ||
| 2127 | + thread->init_thread(); | ||
| 2128 | + thread->start_thread(); | ||
| 2129 | + | ||
| 2130 | + // Vary the various timeouts. | ||
| 2131 | + | ||
| 2132 | + for (int i = 0; i < 100; i++) { | ||
| 2133 | + thread->interrupt(); | ||
| 2134 | + usleep(0); | ||
| 2135 | + | ||
| 2136 | + thread->set_test_flag(test_thread::test_flag_do_work); | ||
| 2137 | + thread->interrupt(); | ||
| 2138 | + | ||
| 2139 | + // Wait for flag to clear. | ||
| 2140 | + CPPUNIT_ASSERT(wait_for_true(std::bind(&test_thread::is_not_test_flags, thread, test_thread::test_flag_do_work))); | ||
| 2141 | + } | ||
| 2142 | + | ||
| 2143 | + thread->stop_thread(); | ||
| 2144 | + CPPUNIT_ASSERT(wait_for_true(std::bind(&test_thread::is_state, thread, test_thread::STATE_INACTIVE))); | ||
| 2145 | + | ||
| 2146 | + delete thread; | ||
| 2147 | +} | ||
| 2148 | + | ||
| 2149 | +void | ||
| 2150 | +test_thread_base::test_stop() { | ||
| 2151 | + { TEST_BEGIN("trylock global lock"); | ||
| 2152 | + CPPUNIT_ASSERT(torrent::thread_base::trylock_global_lock()); | ||
| 2153 | + // torrent::thread_base::acquire_global_lock(); | ||
| 2154 | + }; | ||
| 2155 | + | ||
| 2156 | + for (int i = 0; i < 20; i++) { | ||
| 2157 | + CPPUNIT_ASSERT(!torrent::thread_base::trylock_global_lock()); | ||
| 2158 | + | ||
| 2159 | + test_thread* thread = new test_thread; | ||
| 2160 | + thread->set_test_flag(test_thread::test_flag_do_work); | ||
| 2161 | + | ||
| 2162 | + { TEST_BEGIN("init and start thread"); | ||
| 2163 | + thread->init_thread(); | ||
| 2164 | + thread->start_thread(); | ||
| 2165 | + }; | ||
| 2166 | + | ||
| 2167 | + { TEST_BEGIN("stop and delete thread"); | ||
| 2168 | + thread->stop_thread_wait(); | ||
| 2169 | + CPPUNIT_ASSERT(thread->is_inactive()); | ||
| 2170 | + | ||
| 2171 | + delete thread; | ||
| 2172 | + } | ||
| 2173 | + } | ||
| 2174 | + | ||
| 2175 | + { TEST_BEGIN("release global lock"); | ||
| 2176 | + torrent::thread_base::release_global_lock(); | ||
| 2177 | + }; | ||
| 2178 | +} | ||
| 2179 | diff --git a/test/torrent/utils/test_thread_base.h b/test/torrent/utils/test_thread_base.h | ||
| 2180 | new file mode 100644 | ||
| 2181 | index 00000000..7b2a3432 | ||
| 2182 | --- /dev/null | ||
| 2183 | +++ b/test/torrent/utils/test_thread_base.h | ||
| 2184 | @@ -0,0 +1,25 @@ | ||
| 2185 | +#include "helpers/test_fixture.h" | ||
| 2186 | + | ||
| 2187 | +class test_thread_base : public test_fixture { | ||
| 2188 | + CPPUNIT_TEST_SUITE(test_thread_base); | ||
| 2189 | + | ||
| 2190 | + CPPUNIT_TEST(test_basic); | ||
| 2191 | + CPPUNIT_TEST(test_lifecycle); | ||
| 2192 | + | ||
| 2193 | + CPPUNIT_TEST(test_global_lock_basic); | ||
| 2194 | + CPPUNIT_TEST(test_interrupt); | ||
| 2195 | + CPPUNIT_TEST(test_stop); | ||
| 2196 | + | ||
| 2197 | + CPPUNIT_TEST_SUITE_END(); | ||
| 2198 | + | ||
| 2199 | +public: | ||
| 2200 | + void tearDown(); | ||
| 2201 | + | ||
| 2202 | + void test_basic(); | ||
| 2203 | + void test_lifecycle(); | ||
| 2204 | + | ||
| 2205 | + void test_global_lock_basic(); | ||
| 2206 | + void test_interrupt(); | ||
| 2207 | + void test_interrupt_legacy(); | ||
| 2208 | + void test_stop(); | ||
| 2209 | +}; | ||
| 2210 | diff --git a/test/torrent/utils/test_uri_parser.cc b/test/torrent/utils/test_uri_parser.cc | ||
| 2211 | index 1f4bebe8..66d6cda5 100644 | ||
| 2212 | --- a/test/torrent/utils/test_uri_parser.cc | ||
| 2213 | +++ b/test/torrent/utils/test_uri_parser.cc | ||
| 2214 | @@ -2,31 +2,22 @@ | ||
| 2215 | |||
| 2216 | #include "test_uri_parser.h" | ||
| 2217 | |||
| 2218 | -#include <cinttypes> | ||
| 2219 | -#include <iostream> | ||
| 2220 | +#include <torrent/utils/log.h> | ||
| 2221 | #include <torrent/utils/uri_parser.h> | ||
| 2222 | |||
| 2223 | -CPPUNIT_TEST_SUITE_REGISTRATION(UriParserTest); | ||
| 2224 | - | ||
| 2225 | -void | ||
| 2226 | -UriParserTest::setUp() { | ||
| 2227 | -} | ||
| 2228 | - | ||
| 2229 | -void | ||
| 2230 | -UriParserTest::tearDown() { | ||
| 2231 | -} | ||
| 2232 | +CPPUNIT_TEST_SUITE_NAMED_REGISTRATION(test_uri_parser, "torrent/utils"); | ||
| 2233 | |||
| 2234 | void | ||
| 2235 | test_print_uri_state(torrent::utils::uri_state state) { | ||
| 2236 | - std::cerr << "state.uri: " << state.uri << std::endl; | ||
| 2237 | - std::cerr << "state.scheme: " << state.scheme << std::endl; | ||
| 2238 | - std::cerr << "state.resource: " << state.resource << std::endl; | ||
| 2239 | - std::cerr << "state.query: " << state.query << std::endl; | ||
| 2240 | - std::cerr << "state.fragment: " << state.fragment << std::endl; | ||
| 2241 | + lt_log_print(torrent::LOG_MOCK_CALLS, "state.uri: %s", state.uri.c_str()); | ||
| 2242 | + lt_log_print(torrent::LOG_MOCK_CALLS, "state.scheme: %s", state.scheme.c_str()); | ||
| 2243 | + lt_log_print(torrent::LOG_MOCK_CALLS, "state.resource: %s", state.resource.c_str()); | ||
| 2244 | + lt_log_print(torrent::LOG_MOCK_CALLS, "state.query: %s", state.query.c_str()); | ||
| 2245 | + lt_log_print(torrent::LOG_MOCK_CALLS, "state.fragment: %s", state.fragment.c_str()); | ||
| 2246 | } | ||
| 2247 | |||
| 2248 | void | ||
| 2249 | -UriParserTest::test_basic() { | ||
| 2250 | +test_uri_parser::test_basic() { | ||
| 2251 | torrent::utils::uri_state state; | ||
| 2252 | |||
| 2253 | CPPUNIT_ASSERT(state.state == torrent::utils::uri_state::state_empty); | ||
| 2254 | @@ -37,7 +28,7 @@ UriParserTest::test_basic() { | ||
| 2255 | #define MAGNET_BASIC "magnet:?xt=urn:sha1:YNCKHTQCWBTRNJIV4WNAE52SJUQCZO5C" | ||
| 2256 | |||
| 2257 | void | ||
| 2258 | -UriParserTest::test_basic_magnet() { | ||
| 2259 | +test_uri_parser::test_basic_magnet() { | ||
| 2260 | torrent::utils::uri_state state; | ||
| 2261 | |||
| 2262 | uri_parse_str(MAGNET_BASIC, state); | ||
| 2263 | @@ -63,7 +54,7 @@ UriParserTest::test_basic_magnet() { | ||
| 2264 | #define QUERY_MAGNET "magnet:?" QUERY_MAGNET_QUERY | ||
| 2265 | |||
| 2266 | void | ||
| 2267 | -UriParserTest::test_query_magnet() { | ||
| 2268 | +test_uri_parser::test_query_magnet() { | ||
| 2269 | torrent::utils::uri_state state; | ||
| 2270 | torrent::utils::uri_query_state query_state; | ||
| 2271 | |||
| 2272 | @@ -82,7 +73,7 @@ UriParserTest::test_query_magnet() { | ||
| 2273 | uri_parse_query_str(state.query, query_state); | ||
| 2274 | |||
| 2275 | for (auto element : query_state.elements) | ||
| 2276 | - std::cerr << "query_element: " << element << std::endl; | ||
| 2277 | + lt_log_print(torrent::LOG_MOCK_CALLS, "query_element: %s", element.c_str()); | ||
| 2278 | |||
| 2279 | CPPUNIT_ASSERT(query_state.state == torrent::utils::uri_query_state::state_valid); | ||
| 2280 | |||
| 2281 | diff --git a/test/torrent/utils/test_uri_parser.h b/test/torrent/utils/test_uri_parser.h | ||
| 2282 | index 4f1c2586..f978c8ad 100644 | ||
| 2283 | --- a/test/torrent/utils/test_uri_parser.h | ||
| 2284 | +++ b/test/torrent/utils/test_uri_parser.h | ||
| 2285 | @@ -1,16 +1,15 @@ | ||
| 2286 | -#include <cppunit/extensions/HelperMacros.h> | ||
| 2287 | +#include "helpers/test_fixture.h" | ||
| 2288 | + | ||
| 2289 | +class test_uri_parser : public test_fixture { | ||
| 2290 | + CPPUNIT_TEST_SUITE(test_uri_parser); | ||
| 2291 | |||
| 2292 | -class UriParserTest : public CppUnit::TestFixture { | ||
| 2293 | - CPPUNIT_TEST_SUITE(UriParserTest); | ||
| 2294 | CPPUNIT_TEST(test_basic); | ||
| 2295 | CPPUNIT_TEST(test_basic_magnet); | ||
| 2296 | CPPUNIT_TEST(test_query_magnet); | ||
| 2297 | + | ||
| 2298 | CPPUNIT_TEST_SUITE_END(); | ||
| 2299 | |||
| 2300 | public: | ||
| 2301 | - void setUp(); | ||
| 2302 | - void tearDown(); | ||
| 2303 | - | ||
| 2304 | void test_basic(); | ||
| 2305 | void test_basic_magnet(); | ||
| 2306 | void test_query_magnet(); | ||
| 2307 | diff --git a/test/torrent/utils/thread_base_test.cc b/test/torrent/utils/thread_base_test.cc | ||
| 2308 | deleted file mode 100644 | ||
| 2309 | index 8366c9ba..00000000 | ||
| 2310 | --- a/test/torrent/utils/thread_base_test.cc | ||
| 2311 | +++ /dev/null | ||
| 2312 | @@ -1,224 +0,0 @@ | ||
| 2313 | -#include "config.h" | ||
| 2314 | - | ||
| 2315 | -#include <functional> | ||
| 2316 | -#include <unistd.h> | ||
| 2317 | - | ||
| 2318 | -#include <torrent/exceptions.h> | ||
| 2319 | -#include <torrent/poll_select.h> | ||
| 2320 | -#include <torrent/utils/thread_base.h> | ||
| 2321 | - | ||
| 2322 | -#include "thread_base_test.h" | ||
| 2323 | - | ||
| 2324 | -CPPUNIT_TEST_SUITE_REGISTRATION(utils_thread_base_test); | ||
| 2325 | - | ||
| 2326 | -const int thread_test::test_flag_pre_stop; | ||
| 2327 | -const int thread_test::test_flag_long_timeout; | ||
| 2328 | - | ||
| 2329 | -const int thread_test::test_flag_acquire_global; | ||
| 2330 | -const int thread_test::test_flag_has_global; | ||
| 2331 | - | ||
| 2332 | -const int thread_test::test_flag_do_work; | ||
| 2333 | -const int thread_test::test_flag_pre_poke; | ||
| 2334 | -const int thread_test::test_flag_post_poke; | ||
| 2335 | - | ||
| 2336 | -void throw_shutdown_exception() { throw torrent::shutdown_exception(); } | ||
| 2337 | - | ||
| 2338 | -thread_test::thread_test() : | ||
| 2339 | - m_test_state(TEST_NONE), | ||
| 2340 | - m_test_flags(0) { | ||
| 2341 | -} | ||
| 2342 | - | ||
| 2343 | -void | ||
| 2344 | -thread_test::init_thread() { | ||
| 2345 | - m_state = STATE_INITIALIZED; | ||
| 2346 | - m_test_state = TEST_PRE_START; | ||
| 2347 | - m_poll = torrent::PollSelect::create(256); | ||
| 2348 | -} | ||
| 2349 | - | ||
| 2350 | -void | ||
| 2351 | -thread_test::call_events() { | ||
| 2352 | - if ((m_test_flags & test_flag_pre_stop) && m_test_state == TEST_PRE_START && m_state == STATE_ACTIVE) | ||
| 2353 | - __sync_lock_test_and_set(&m_test_state, TEST_PRE_STOP); | ||
| 2354 | - | ||
| 2355 | - if ((m_test_flags & test_flag_acquire_global)) { | ||
| 2356 | - acquire_global_lock(); | ||
| 2357 | - __sync_and_and_fetch(&m_test_flags, ~test_flag_acquire_global); | ||
| 2358 | - __sync_or_and_fetch(&m_test_flags, test_flag_has_global); | ||
| 2359 | - } | ||
| 2360 | - | ||
| 2361 | - if ((m_flags & flag_do_shutdown)) { | ||
| 2362 | - if ((m_flags & flag_did_shutdown)) | ||
| 2363 | - throw torrent::internal_error("Already trigged shutdown."); | ||
| 2364 | - | ||
| 2365 | - __sync_or_and_fetch(&m_flags, flag_did_shutdown); | ||
| 2366 | - throw torrent::shutdown_exception(); | ||
| 2367 | - } | ||
| 2368 | - | ||
| 2369 | - if ((m_test_flags & test_flag_pre_poke)) { | ||
| 2370 | - } | ||
| 2371 | - | ||
| 2372 | - if ((m_test_flags & test_flag_do_work)) { | ||
| 2373 | - usleep(10 * 1000); // TODO: Don't just sleep, as that give up core. | ||
| 2374 | - __sync_and_and_fetch(&m_test_flags, ~test_flag_do_work); | ||
| 2375 | - } | ||
| 2376 | - | ||
| 2377 | - if ((m_test_flags & test_flag_post_poke)) { | ||
| 2378 | - } | ||
| 2379 | -} | ||
| 2380 | - | ||
| 2381 | -bool | ||
| 2382 | -wait_for_true(std::function<bool ()> test_function) { | ||
| 2383 | - int i = 100; | ||
| 2384 | - | ||
| 2385 | - do { | ||
| 2386 | - if (test_function()) | ||
| 2387 | - return true; | ||
| 2388 | - | ||
| 2389 | - usleep(10 * 1000); | ||
| 2390 | - } while (--i); | ||
| 2391 | - | ||
| 2392 | - return false; | ||
| 2393 | -} | ||
| 2394 | - | ||
| 2395 | -void | ||
| 2396 | -utils_thread_base_test::setUp() { | ||
| 2397 | -} | ||
| 2398 | - | ||
| 2399 | -void | ||
| 2400 | -utils_thread_base_test::tearDown() { | ||
| 2401 | - CPPUNIT_ASSERT(torrent::thread_base::trylock_global_lock()); | ||
| 2402 | - torrent::thread_base::release_global_lock(); | ||
| 2403 | -} | ||
| 2404 | - | ||
| 2405 | -void | ||
| 2406 | -utils_thread_base_test::test_basic() { | ||
| 2407 | - thread_test* thread = new thread_test; | ||
| 2408 | - | ||
| 2409 | - CPPUNIT_ASSERT(thread->flags() == 0); | ||
| 2410 | - | ||
| 2411 | - CPPUNIT_ASSERT(!thread->is_main_polling()); | ||
| 2412 | - CPPUNIT_ASSERT(!thread->is_active()); | ||
| 2413 | - CPPUNIT_ASSERT(thread->global_queue_size() == 0); | ||
| 2414 | - CPPUNIT_ASSERT(thread->poll() == NULL); | ||
| 2415 | - | ||
| 2416 | - // Check active... | ||
| 2417 | -} | ||
| 2418 | - | ||
| 2419 | -void | ||
| 2420 | -utils_thread_base_test::test_lifecycle() { | ||
| 2421 | - thread_test* thread = new thread_test; | ||
| 2422 | - | ||
| 2423 | - CPPUNIT_ASSERT(thread->state() == torrent::thread_base::STATE_UNKNOWN); | ||
| 2424 | - CPPUNIT_ASSERT(thread->test_state() == thread_test::TEST_NONE); | ||
| 2425 | - | ||
| 2426 | - thread->init_thread(); | ||
| 2427 | - CPPUNIT_ASSERT(thread->state() == torrent::thread_base::STATE_INITIALIZED); | ||
| 2428 | - CPPUNIT_ASSERT(thread->is_initialized()); | ||
| 2429 | - CPPUNIT_ASSERT(thread->test_state() == thread_test::TEST_PRE_START); | ||
| 2430 | - | ||
| 2431 | - thread->set_pre_stop(); | ||
| 2432 | - CPPUNIT_ASSERT(!wait_for_true(std::bind(&thread_test::is_test_state, thread, thread_test::TEST_PRE_STOP))); | ||
| 2433 | - | ||
| 2434 | - thread->start_thread(); | ||
| 2435 | - CPPUNIT_ASSERT(wait_for_true(std::bind(&thread_test::is_state, thread, thread_test::STATE_ACTIVE))); | ||
| 2436 | - CPPUNIT_ASSERT(thread->is_active()); | ||
| 2437 | - CPPUNIT_ASSERT(wait_for_true(std::bind(&thread_test::is_test_state, thread, thread_test::TEST_PRE_STOP))); | ||
| 2438 | - | ||
| 2439 | - thread->stop_thread(); | ||
| 2440 | - CPPUNIT_ASSERT(wait_for_true(std::bind(&thread_test::is_state, thread, thread_test::STATE_INACTIVE))); | ||
| 2441 | - CPPUNIT_ASSERT(thread->is_inactive()); | ||
| 2442 | - | ||
| 2443 | - delete thread; | ||
| 2444 | -} | ||
| 2445 | - | ||
| 2446 | -void | ||
| 2447 | -utils_thread_base_test::test_global_lock_basic() { | ||
| 2448 | - thread_test* thread = new thread_test; | ||
| 2449 | - | ||
| 2450 | - thread->init_thread(); | ||
| 2451 | - thread->start_thread(); | ||
| 2452 | - | ||
| 2453 | - CPPUNIT_ASSERT(torrent::thread_base::global_queue_size() == 0); | ||
| 2454 | - | ||
| 2455 | - // Acquire main thread... | ||
| 2456 | - CPPUNIT_ASSERT(torrent::thread_base::trylock_global_lock()); | ||
| 2457 | - CPPUNIT_ASSERT(!torrent::thread_base::trylock_global_lock()); | ||
| 2458 | - | ||
| 2459 | - torrent::thread_base::release_global_lock(); | ||
| 2460 | - CPPUNIT_ASSERT(torrent::thread_base::trylock_global_lock()); | ||
| 2461 | - CPPUNIT_ASSERT(!torrent::thread_base::trylock_global_lock()); | ||
| 2462 | - | ||
| 2463 | - torrent::thread_base::release_global_lock(); | ||
| 2464 | - torrent::thread_base::acquire_global_lock(); | ||
| 2465 | - CPPUNIT_ASSERT(!torrent::thread_base::trylock_global_lock()); | ||
| 2466 | - | ||
| 2467 | - thread->set_acquire_global(); | ||
| 2468 | - CPPUNIT_ASSERT(!wait_for_true(std::bind(&thread_test::is_test_flags, thread, thread_test::test_flag_has_global))); | ||
| 2469 | - | ||
| 2470 | - torrent::thread_base::release_global_lock(); | ||
| 2471 | - CPPUNIT_ASSERT(wait_for_true(std::bind(&thread_test::is_test_flags, thread, thread_test::test_flag_has_global))); | ||
| 2472 | - | ||
| 2473 | - CPPUNIT_ASSERT(!torrent::thread_base::trylock_global_lock()); | ||
| 2474 | - torrent::thread_base::release_global_lock(); | ||
| 2475 | - CPPUNIT_ASSERT(torrent::thread_base::trylock_global_lock()); | ||
| 2476 | - | ||
| 2477 | - // Test waive (loop). | ||
| 2478 | - | ||
| 2479 | - CPPUNIT_ASSERT(torrent::thread_base::global_queue_size() == 0); | ||
| 2480 | - | ||
| 2481 | - torrent::thread_base::release_global_lock(); | ||
| 2482 | - thread->stop_thread(); | ||
| 2483 | - CPPUNIT_ASSERT(wait_for_true(std::bind(&thread_test::is_state, thread, thread_test::STATE_INACTIVE))); | ||
| 2484 | - | ||
| 2485 | - delete thread; | ||
| 2486 | -} | ||
| 2487 | - | ||
| 2488 | -void | ||
| 2489 | -utils_thread_base_test::test_interrupt() { | ||
| 2490 | - thread_test* thread = new thread_test; | ||
| 2491 | - thread->set_test_flag(thread_test::test_flag_long_timeout); | ||
| 2492 | - | ||
| 2493 | - thread->init_thread(); | ||
| 2494 | - thread->start_thread(); | ||
| 2495 | - | ||
| 2496 | - // Vary the various timeouts. | ||
| 2497 | - | ||
| 2498 | - for (int i = 0; i < 100; i++) { | ||
| 2499 | - thread->interrupt(); | ||
| 2500 | - usleep(0); | ||
| 2501 | - | ||
| 2502 | - thread->set_test_flag(thread_test::test_flag_do_work); | ||
| 2503 | - thread->interrupt(); | ||
| 2504 | - | ||
| 2505 | - // Wait for flag to clear. | ||
| 2506 | - CPPUNIT_ASSERT(wait_for_true(std::bind(&thread_test::is_not_test_flags, thread, thread_test::test_flag_do_work))); | ||
| 2507 | - } | ||
| 2508 | - | ||
| 2509 | - thread->stop_thread(); | ||
| 2510 | - CPPUNIT_ASSERT(wait_for_true(std::bind(&thread_test::is_state, thread, thread_test::STATE_INACTIVE))); | ||
| 2511 | - | ||
| 2512 | - delete thread; | ||
| 2513 | -} | ||
| 2514 | - | ||
| 2515 | -void | ||
| 2516 | -utils_thread_base_test::test_stop() { | ||
| 2517 | - CPPUNIT_ASSERT(torrent::thread_base::trylock_global_lock()); | ||
| 2518 | - // torrent::thread_base::acquire_global_lock(); | ||
| 2519 | - | ||
| 2520 | - for (int i = 0; i < 20; i++) { | ||
| 2521 | - CPPUNIT_ASSERT(!torrent::thread_base::trylock_global_lock()); | ||
| 2522 | - | ||
| 2523 | - thread_test* thread = new thread_test; | ||
| 2524 | - thread->set_test_flag(thread_test::test_flag_do_work); | ||
| 2525 | - | ||
| 2526 | - thread->init_thread(); | ||
| 2527 | - thread->start_thread(); | ||
| 2528 | - | ||
| 2529 | - thread->stop_thread_wait(); | ||
| 2530 | - CPPUNIT_ASSERT(thread->is_inactive()); | ||
| 2531 | - | ||
| 2532 | - delete thread; | ||
| 2533 | - } | ||
| 2534 | - | ||
| 2535 | - torrent::thread_base::release_global_lock(); | ||
| 2536 | -} | ||
| 2537 | diff --git a/test/torrent/utils/thread_base_test.h b/test/torrent/utils/thread_base_test.h | ||
| 2538 | deleted file mode 100644 | ||
| 2539 | index 22eb99dc..00000000 | ||
| 2540 | --- a/test/torrent/utils/thread_base_test.h | ||
| 2541 | +++ /dev/null | ||
| 2542 | @@ -1,86 +0,0 @@ | ||
| 2543 | -#include <cppunit/extensions/HelperMacros.h> | ||
| 2544 | - | ||
| 2545 | -#include "torrent/utils/thread_base.h" | ||
| 2546 | - | ||
| 2547 | -class utils_thread_base_test : public CppUnit::TestFixture { | ||
| 2548 | - CPPUNIT_TEST_SUITE(utils_thread_base_test); | ||
| 2549 | - CPPUNIT_TEST(test_basic); | ||
| 2550 | - CPPUNIT_TEST(test_lifecycle); | ||
| 2551 | - | ||
| 2552 | - CPPUNIT_TEST(test_global_lock_basic); | ||
| 2553 | - CPPUNIT_TEST(test_interrupt); | ||
| 2554 | - CPPUNIT_TEST(test_stop); | ||
| 2555 | - CPPUNIT_TEST_SUITE_END(); | ||
| 2556 | - | ||
| 2557 | -public: | ||
| 2558 | - void setUp(); | ||
| 2559 | - void tearDown(); | ||
| 2560 | - | ||
| 2561 | - void test_basic(); | ||
| 2562 | - void test_lifecycle(); | ||
| 2563 | - | ||
| 2564 | - void test_global_lock_basic(); | ||
| 2565 | - void test_interrupt(); | ||
| 2566 | - void test_interrupt_legacy(); | ||
| 2567 | - void test_stop(); | ||
| 2568 | -}; | ||
| 2569 | - | ||
| 2570 | -struct thread_management_type { | ||
| 2571 | - thread_management_type() { CPPUNIT_ASSERT(torrent::thread_base::trylock_global_lock()); } | ||
| 2572 | - ~thread_management_type() { torrent::thread_base::release_global_lock(); } | ||
| 2573 | -}; | ||
| 2574 | - | ||
| 2575 | -#define SETUP_THREAD() \ | ||
| 2576 | - thread_management_type thread_management; \ | ||
| 2577 | - torrent::thread_disk* thread_disk = new torrent::thread_disk(); \ | ||
| 2578 | - thread_disk->init_thread(); | ||
| 2579 | - | ||
| 2580 | -#define CLEANUP_THREAD() \ | ||
| 2581 | - CPPUNIT_ASSERT(wait_for_true(std::bind(&torrent::thread_base::is_inactive, thread_disk))); \ | ||
| 2582 | - delete thread_disk; | ||
| 2583 | - | ||
| 2584 | -bool wait_for_true(std::function<bool ()> test_function); | ||
| 2585 | - | ||
| 2586 | -class thread_test : public torrent::thread_base { | ||
| 2587 | -public: | ||
| 2588 | - enum test_state { | ||
| 2589 | - TEST_NONE, | ||
| 2590 | - TEST_PRE_START, | ||
| 2591 | - TEST_PRE_STOP, | ||
| 2592 | - TEST_STOP | ||
| 2593 | - }; | ||
| 2594 | - | ||
| 2595 | - static const int test_flag_pre_stop = 0x1; | ||
| 2596 | - static const int test_flag_long_timeout = 0x2; | ||
| 2597 | - | ||
| 2598 | - static const int test_flag_acquire_global = 0x10; | ||
| 2599 | - static const int test_flag_has_global = 0x20; | ||
| 2600 | - | ||
| 2601 | - static const int test_flag_do_work = 0x100; | ||
| 2602 | - static const int test_flag_pre_poke = 0x200; | ||
| 2603 | - static const int test_flag_post_poke = 0x400; | ||
| 2604 | - | ||
| 2605 | - thread_test(); | ||
| 2606 | - | ||
| 2607 | - int test_state() const { return m_test_state; } | ||
| 2608 | - bool is_state(int state) const { return m_state == state; } | ||
| 2609 | - bool is_test_state(int state) const { return m_test_state == state; } | ||
| 2610 | - bool is_test_flags(int flags) const { return (m_test_flags & flags) == flags; } | ||
| 2611 | - bool is_not_test_flags(int flags) const { return !(m_test_flags & flags); } | ||
| 2612 | - | ||
| 2613 | - const char* name() const { return "test_thread"; } | ||
| 2614 | - | ||
| 2615 | - void init_thread(); | ||
| 2616 | - | ||
| 2617 | - void set_pre_stop() { __sync_or_and_fetch(&m_test_flags, test_flag_pre_stop); } | ||
| 2618 | - void set_acquire_global() { __sync_or_and_fetch(&m_test_flags, test_flag_acquire_global); } | ||
| 2619 | - | ||
| 2620 | - void set_test_flag(int flags) { __sync_or_and_fetch(&m_test_flags, flags); } | ||
| 2621 | - | ||
| 2622 | -private: | ||
| 2623 | - void call_events(); | ||
| 2624 | - int64_t next_timeout_usec() { return (m_test_flags & test_flag_long_timeout) ? (10000 * 1000) : (100 * 1000); } | ||
| 2625 | - | ||
| 2626 | - int m_test_state lt_cacheline_aligned; | ||
| 2627 | - int m_test_flags lt_cacheline_aligned; | ||
| 2628 | -}; | ||
| 2629 | diff --git a/test/tracker/test_tracker_http.cc b/test/tracker/test_tracker_http.cc | ||
| 2630 | new file mode 100644 | ||
| 2631 | index 00000000..399d00d5 | ||
| 2632 | --- /dev/null | ||
| 2633 | +++ b/test/tracker/test_tracker_http.cc | ||
| 2634 | @@ -0,0 +1,11 @@ | ||
| 2635 | +#include "config.h" | ||
| 2636 | + | ||
| 2637 | +#include "test_tracker_http.h" | ||
| 2638 | + | ||
| 2639 | +#include "tracker/tracker_http.h" | ||
| 2640 | + | ||
| 2641 | +CPPUNIT_TEST_SUITE_NAMED_REGISTRATION(test_tracker_http, "tracker"); | ||
| 2642 | + | ||
| 2643 | +void | ||
| 2644 | +test_tracker_http::test_basic() { | ||
| 2645 | +} | ||
| 2646 | diff --git a/test/tracker/test_tracker_http.h b/test/tracker/test_tracker_http.h | ||
| 2647 | new file mode 100644 | ||
| 2648 | index 00000000..ab11a8f7 | ||
| 2649 | --- /dev/null | ||
| 2650 | +++ b/test/tracker/test_tracker_http.h | ||
| 2651 | @@ -0,0 +1,12 @@ | ||
| 2652 | +#include "helpers/test_fixture.h" | ||
| 2653 | + | ||
| 2654 | +#include "torrent/utils/thread_base.h" | ||
| 2655 | + | ||
| 2656 | +class test_tracker_http : public test_fixture { | ||
| 2657 | + CPPUNIT_TEST_SUITE(test_tracker_http); | ||
| 2658 | + CPPUNIT_TEST(test_basic); | ||
| 2659 | + CPPUNIT_TEST_SUITE_END(); | ||
| 2660 | + | ||
| 2661 | +public: | ||
| 2662 | + void test_basic(); | ||
| 2663 | +}; | ||
| 2664 | diff --git a/test/tracker/tracker_http_test.cc b/test/tracker/tracker_http_test.cc | ||
| 2665 | deleted file mode 100644 | ||
| 2666 | index deda4382..00000000 | ||
| 2667 | --- a/test/tracker/tracker_http_test.cc | ||
| 2668 | +++ /dev/null | ||
| 2669 | @@ -1,17 +0,0 @@ | ||
| 2670 | -#include "config.h" | ||
| 2671 | - | ||
| 2672 | -#include "tracker_http_test.h" | ||
| 2673 | - | ||
| 2674 | -#include "tracker/tracker_http.h" | ||
| 2675 | - | ||
| 2676 | -void | ||
| 2677 | -tracker_http_test::setUp() { | ||
| 2678 | -} | ||
| 2679 | - | ||
| 2680 | -void | ||
| 2681 | -tracker_http_test::tearDown() { | ||
| 2682 | -} | ||
| 2683 | - | ||
| 2684 | -void | ||
| 2685 | -tracker_http_test::test_basic() { | ||
| 2686 | -} | ||
| 2687 | diff --git a/test/tracker/tracker_http_test.h b/test/tracker/tracker_http_test.h | ||
| 2688 | deleted file mode 100644 | ||
| 2689 | index 11ff8246..00000000 | ||
| 2690 | --- a/test/tracker/tracker_http_test.h | ||
| 2691 | +++ /dev/null | ||
| 2692 | @@ -1,18 +0,0 @@ | ||
| 2693 | -#include <cppunit/extensions/HelperMacros.h> | ||
| 2694 | - | ||
| 2695 | -#include "tracker/tracker_http.h" | ||
| 2696 | - | ||
| 2697 | -class tracker_http_test : public CppUnit::TestFixture { | ||
| 2698 | - CPPUNIT_TEST_SUITE(tracker_http_test); | ||
| 2699 | - CPPUNIT_TEST(test_basic); | ||
| 2700 | - CPPUNIT_TEST(test_scrape); | ||
| 2701 | - CPPUNIT_TEST_SUITE_END(); | ||
| 2702 | - | ||
| 2703 | -public: | ||
| 2704 | - void setUp(); | ||
| 2705 | - void tearDown(); | ||
| 2706 | - | ||
| 2707 | - void test_basic(); | ||
| 2708 | - | ||
| 2709 | - void test_scrape(); | ||
| 2710 | -}; | ||
diff --git a/meta-oe/recipes-connectivity/libtorrent/libtorrent/0034-Changes-automake-required-files.patch b/meta-oe/recipes-connectivity/libtorrent/libtorrent/0034-Changes-automake-required-files.patch new file mode 100644 index 0000000000..e860045a78 --- /dev/null +++ b/meta-oe/recipes-connectivity/libtorrent/libtorrent/0034-Changes-automake-required-files.patch | |||
| @@ -0,0 +1,22 @@ | |||
| 1 | From 03e1c95987917bf98534e50fdd718a948540ffb2 Mon Sep 17 00:00:00 2001 | ||
| 2 | From: rakshasa <sundell.software@gmail.com> | ||
| 3 | Date: Thu, 25 Feb 2021 00:03:27 +0900 | ||
| 4 | Subject: [PATCH] Changes automake required files. | ||
| 5 | |||
| 6 | --- | ||
| 7 | autogen.sh | 2 +- | ||
| 8 | 1 file changed, 1 insertion(+), 1 deletion(-) | ||
| 9 | |||
| 10 | diff --git a/autogen.sh b/autogen.sh | ||
| 11 | index 79afab8e..6def96dd 100755 | ||
| 12 | --- a/autogen.sh | ||
| 13 | +++ b/autogen.sh | ||
| 14 | @@ -36,7 +36,7 @@ echo automake... | ||
| 15 | exit 1 | ||
| 16 | } | ||
| 17 | |||
| 18 | -automake --add-missing --copy --gnu || exit 1 | ||
| 19 | +automake --add-missing --copy --foreign || exit 1 | ||
| 20 | |||
| 21 | echo autoconf... | ||
| 22 | (autoconf --version) < /dev/null > /dev/null 2>&1 || { | ||
diff --git a/meta-oe/recipes-connectivity/libtorrent/libtorrent/0035-Replaced-custom-execinfo-autoconf-test.patch b/meta-oe/recipes-connectivity/libtorrent/libtorrent/0035-Replaced-custom-execinfo-autoconf-test.patch new file mode 100644 index 0000000000..0ff30731cb --- /dev/null +++ b/meta-oe/recipes-connectivity/libtorrent/libtorrent/0035-Replaced-custom-execinfo-autoconf-test.patch | |||
| @@ -0,0 +1,48 @@ | |||
| 1 | From b4a3888bd891d804a83ae1cee623592725975895 Mon Sep 17 00:00:00 2001 | ||
| 2 | From: rakshasa <sundell.software@gmail.com> | ||
| 3 | Date: Sat, 27 Feb 2021 22:11:55 +0900 | ||
| 4 | Subject: [PATCH] Replaced custom execinfo autoconf test. | ||
| 5 | |||
| 6 | --- | ||
| 7 | configure.ac | 2 +- | ||
| 8 | scripts/rak_execinfo.m4 | 11 ----------- | ||
| 9 | 2 files changed, 1 insertion(+), 12 deletions(-) | ||
| 10 | delete mode 100644 scripts/rak_execinfo.m4 | ||
| 11 | |||
| 12 | diff --git a/configure.ac b/configure.ac | ||
| 13 | index 88a46edd..197bbc94 100644 | ||
| 14 | --- a/configure.ac | ||
| 15 | +++ b/configure.ac | ||
| 16 | @@ -34,7 +34,6 @@ RAK_CHECK_CXXFLAGS | ||
| 17 | RAK_ENABLE_DEBUG | ||
| 18 | RAK_ENABLE_EXTRA_DEBUG | ||
| 19 | RAK_ENABLE_WERROR | ||
| 20 | -RAK_DISABLE_BACKTRACE | ||
| 21 | |||
| 22 | RAK_CHECK_CXX11 | ||
| 23 | |||
| 24 | @@ -58,6 +57,7 @@ TORRENT_WITH_INOTIFY | ||
| 25 | CC_ATTRIBUTE_VISIBILITY | ||
| 26 | |||
| 27 | AX_CHECK_ZLIB | ||
| 28 | +AX_EXECINFO | ||
| 29 | AX_PTHREAD | ||
| 30 | |||
| 31 | PKG_CHECK_MODULES([CPPUNIT], [cppunit],, [no_cppunit="yes"]) | ||
| 32 | diff --git a/scripts/rak_execinfo.m4 b/scripts/rak_execinfo.m4 | ||
| 33 | deleted file mode 100644 | ||
| 34 | index c1d9b2f8..00000000 | ||
| 35 | --- a/scripts/rak_execinfo.m4 | ||
| 36 | +++ /dev/null | ||
| 37 | @@ -1,11 +0,0 @@ | ||
| 38 | -AC_DEFUN([RAK_DISABLE_BACKTRACE], [ | ||
| 39 | - AC_ARG_ENABLE(backtrace, | ||
| 40 | - AC_HELP_STRING([--disable-backtrace], [disable backtrace information [[default=no]]]), | ||
| 41 | - [ | ||
| 42 | - if test "$enableval" = "yes"; then | ||
| 43 | - AX_EXECINFO | ||
| 44 | - fi | ||
| 45 | - ],[ | ||
| 46 | - AX_EXECINFO | ||
| 47 | - ]) | ||
| 48 | -]) | ||
diff --git a/meta-oe/recipes-connectivity/libtorrent/libtorrent/0036-Added-option-to-disable-pthread_setname_np.patch b/meta-oe/recipes-connectivity/libtorrent/libtorrent/0036-Added-option-to-disable-pthread_setname_np.patch new file mode 100644 index 0000000000..9d3c0fa23e --- /dev/null +++ b/meta-oe/recipes-connectivity/libtorrent/libtorrent/0036-Added-option-to-disable-pthread_setname_np.patch | |||
| @@ -0,0 +1,135 @@ | |||
| 1 | From e5ed6301e0d07adeaab10e9924a8c9a2e327cdc5 Mon Sep 17 00:00:00 2001 | ||
| 2 | From: rakshasa <sundell.software@gmail.com> | ||
| 3 | Date: Thu, 29 Apr 2021 19:33:04 +0900 | ||
| 4 | Subject: [PATCH] Added option to disable pthread_setname_np. | ||
| 5 | |||
| 6 | --- | ||
| 7 | configure.ac | 30 +++++++++++++++++++----------- | ||
| 8 | scripts/checks.m4 | 18 ++++++++++++++++++ | ||
| 9 | src/torrent/utils/thread_base.cc | 16 ++++++++++++++-- | ||
| 10 | 3 files changed, 51 insertions(+), 13 deletions(-) | ||
| 11 | |||
| 12 | diff --git a/configure.ac b/configure.ac | ||
| 13 | index 197bbc94..73caf712 100644 | ||
| 14 | --- a/configure.ac | ||
| 15 | +++ b/configure.ac | ||
| 16 | @@ -24,9 +24,9 @@ AC_PROG_CXX | ||
| 17 | AC_SYS_LARGEFILE | ||
| 18 | |||
| 19 | AC_C_BIGENDIAN( | ||
| 20 | - AC_DEFINE(IS_BIG_ENDIAN, 1, Big endian), | ||
| 21 | - AC_DEFINE(IS_LITTLE_ENDIAN, 1, Little endian), | ||
| 22 | - AC_MSG_ERROR([Could not determine endianness]) | ||
| 23 | + AC_DEFINE(IS_BIG_ENDIAN, 1, Big endian), | ||
| 24 | + AC_DEFINE(IS_LITTLE_ENDIAN, 1, Little endian), | ||
| 25 | + AC_MSG_ERROR([Could not determine endianness]) | ||
| 26 | ) | ||
| 27 | |||
| 28 | RAK_CHECK_CFLAGS | ||
| 29 | @@ -54,7 +54,15 @@ TORRENT_WITHOUT_STATVFS | ||
| 30 | TORRENT_WITHOUT_STATFS | ||
| 31 | TORRENT_WITH_INOTIFY | ||
| 32 | |||
| 33 | -CC_ATTRIBUTE_VISIBILITY | ||
| 34 | +AC_ARG_ENABLE(attribute-visibility, | ||
| 35 | + AC_HELP_STRING([--disable-attribute-visibility], [disable symbol visibility attribute [[default=enable]]]), | ||
| 36 | + [ | ||
| 37 | + if test "$enableval" = "yes"; then | ||
| 38 | + CC_ATTRIBUTE_VISIBILITY | ||
| 39 | + fi | ||
| 40 | + ],[ | ||
| 41 | + CC_ATTRIBUTE_VISIBILITY | ||
| 42 | + ]) | ||
| 43 | |||
| 44 | AX_CHECK_ZLIB | ||
| 45 | AX_EXECINFO | ||
| 46 | @@ -71,11 +79,11 @@ TORRENT_ARG_CYRUS_RC4 | ||
| 47 | |||
| 48 | AC_CHECK_FUNCS(posix_memalign) | ||
| 49 | |||
| 50 | -TORRENT_CHECK_MADVISE() | ||
| 51 | -TORRENT_CHECK_CACHELINE() | ||
| 52 | -TORRENT_CHECK_POPCOUNT() | ||
| 53 | -TORRENT_CHECK_PTHREAD_SETNAME_NP() | ||
| 54 | -TORRENT_MINCORE() | ||
| 55 | +TORRENT_CHECK_MADVISE | ||
| 56 | +TORRENT_CHECK_CACHELINE | ||
| 57 | +TORRENT_CHECK_POPCOUNT | ||
| 58 | +TORRENT_DISABLE_PTHREAD_SETNAME_NP | ||
| 59 | +TORRENT_MINCORE | ||
| 60 | |||
| 61 | TORRENT_DISABLE_INSTRUMENTATION | ||
| 62 | |||
| 63 | @@ -88,8 +96,8 @@ AC_SUBST(LIBTORRENT_CFLAGS) | ||
| 64 | AC_DEFINE(HAVE_CONFIG_H, 1, true if config.h was included) | ||
| 65 | |||
| 66 | CC_ATTRIBUTE_UNUSED( | ||
| 67 | - AC_DEFINE([__UNUSED], [__attribute__((unused))], [Wrapper around unused attribute]), | ||
| 68 | - AC_DEFINE([__UNUSED], [], [Null-wrapper if unused attribute is unsupported]) | ||
| 69 | + AC_DEFINE([__UNUSED], [__attribute__((unused))], [Wrapper around unused attribute]), | ||
| 70 | + AC_DEFINE([__UNUSED], [], [Null-wrapper if unused attribute is unsupported]) | ||
| 71 | ) | ||
| 72 | |||
| 73 | AC_OUTPUT([ | ||
| 74 | diff --git a/scripts/checks.m4 b/scripts/checks.m4 | ||
| 75 | index 98ef17f8..915a5011 100644 | ||
| 76 | --- a/scripts/checks.m4 | ||
| 77 | +++ b/scripts/checks.m4 | ||
| 78 | @@ -490,3 +490,21 @@ AC_DEFUN([TORRENT_CHECK_PTHREAD_SETNAME_NP], [ | ||
| 79 | ]) | ||
| 80 | ]) | ||
| 81 | ]) | ||
| 82 | + | ||
| 83 | +AC_DEFUN([TORRENT_DISABLE_PTHREAD_SETNAME_NP], [ | ||
| 84 | + AC_MSG_CHECKING([for pthread_setname_no]) | ||
| 85 | + | ||
| 86 | + AC_ARG_ENABLE(pthread-setname-np, | ||
| 87 | + AC_HELP_STRING([--disable-pthread-setname-np], [disable pthread_setname_np]), | ||
| 88 | + [ | ||
| 89 | + if test "$enableval" = "no"; then | ||
| 90 | + AC_MSG_RESULT(disabled) | ||
| 91 | + else | ||
| 92 | + AC_MSG_RESULT(checking) | ||
| 93 | + TORRENT_CHECK_PTHREAD_SETNAME_NP | ||
| 94 | + fi | ||
| 95 | + ], [ | ||
| 96 | + TORRENT_CHECK_PTHREAD_SETNAME_NP | ||
| 97 | + ] | ||
| 98 | + ) | ||
| 99 | +]) | ||
| 100 | diff --git a/src/torrent/utils/thread_base.cc b/src/torrent/utils/thread_base.cc | ||
| 101 | index 99d6355d..ec0619f3 100644 | ||
| 102 | --- a/src/torrent/utils/thread_base.cc | ||
| 103 | +++ b/src/torrent/utils/thread_base.cc | ||
| 104 | @@ -41,10 +41,16 @@ thread_base::~thread_base() { | ||
| 105 | |||
| 106 | void | ||
| 107 | thread_base::start_thread() { | ||
| 108 | - if (m_poll == NULL) | ||
| 109 | + if (this == nullptr) | ||
| 110 | + throw internal_error("Called thread_base::start_thread on a nullptr."); | ||
| 111 | + | ||
| 112 | + if (m_poll == nullptr) | ||
| 113 | throw internal_error("No poll object for thread defined."); | ||
| 114 | |||
| 115 | - if (!is_initialized() || pthread_create(&m_thread, NULL, (pthread_func)&thread_base::event_loop, this)) | ||
| 116 | + if (!is_initialized()) | ||
| 117 | + throw internal_error("Called thread_base::start_thread on an uninitialized object."); | ||
| 118 | + | ||
| 119 | + if (pthread_create(&m_thread, NULL, (pthread_func)&thread_base::event_loop, this)) | ||
| 120 | throw internal_error("Failed to create thread."); | ||
| 121 | } | ||
| 122 | |||
| 123 | @@ -82,6 +88,12 @@ thread_base::should_handle_sigusr1() { | ||
| 124 | |||
| 125 | void* | ||
| 126 | thread_base::event_loop(thread_base* thread) { | ||
| 127 | + if (thread == nullptr) | ||
| 128 | + throw internal_error("thread_base::event_loop called with a null pointer thread"); | ||
| 129 | + | ||
| 130 | + if (!thread->is_initialized()) | ||
| 131 | + throw internal_error("thread_base::event_loop call on an uninitialized object"); | ||
| 132 | + | ||
| 133 | __sync_lock_test_and_set(&thread->m_state, STATE_ACTIVE); | ||
| 134 | |||
| 135 | #if defined(HAS_PTHREAD_SETNAME_NP_DARWIN) | ||
diff --git a/meta-oe/recipes-connectivity/libtorrent/libtorrent/0037-Improved-backtrace-error-checking.patch b/meta-oe/recipes-connectivity/libtorrent/libtorrent/0037-Improved-backtrace-error-checking.patch new file mode 100644 index 0000000000..5f48d76bfd --- /dev/null +++ b/meta-oe/recipes-connectivity/libtorrent/libtorrent/0037-Improved-backtrace-error-checking.patch | |||
| @@ -0,0 +1,594 @@ | |||
| 1 | From f978e68f9d907e25207d0a7d247d2b10935e5d76 Mon Sep 17 00:00:00 2001 | ||
| 2 | From: rakshasa <sundell.software@gmail.com> | ||
| 3 | Date: Thu, 29 Apr 2021 19:34:35 +0900 | ||
| 4 | Subject: [PATCH] Improved backtrace error checking. | ||
| 5 | |||
| 6 | --- | ||
| 7 | src/download/download_main.cc | 36 ------------- | ||
| 8 | src/download/download_main.h | 36 ------------- | ||
| 9 | src/download/download_wrapper.cc | 43 ++-------------- | ||
| 10 | src/torrent/data/download_data.h | 36 ------------- | ||
| 11 | src/torrent/download/choke_queue.cc | 50 +++++------------- | ||
| 12 | src/torrent/download/resource_manager.cc | 53 +++++-------------- | ||
| 13 | src/torrent/exceptions.cc | 65 +++++++----------------- | ||
| 14 | src/torrent/torrent.cc | 1 + | ||
| 15 | src/torrent/utils/extents.h | 36 ------------- | ||
| 16 | src/torrent/utils/signal_bitfield.cc | 36 ------------- | ||
| 17 | 10 files changed, 48 insertions(+), 344 deletions(-) | ||
| 18 | |||
| 19 | diff --git a/src/download/download_main.cc b/src/download/download_main.cc | ||
| 20 | index 9a3f9df2..e075038a 100644 | ||
| 21 | --- a/src/download/download_main.cc | ||
| 22 | +++ b/src/download/download_main.cc | ||
| 23 | @@ -1,39 +1,3 @@ | ||
| 24 | -// libTorrent - BitTorrent library | ||
| 25 | -// Copyright (C) 2005-2011, Jari Sundell | ||
| 26 | -// | ||
| 27 | -// This program is free software; you can redistribute it and/or modify | ||
| 28 | -// it under the terms of the GNU General Public License as published by | ||
| 29 | -// the Free Software Foundation; either version 2 of the License, or | ||
| 30 | -// (at your option) any later version. | ||
| 31 | -// | ||
| 32 | -// This program is distributed in the hope that it will be useful, | ||
| 33 | -// but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
| 34 | -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
| 35 | -// GNU General Public License for more details. | ||
| 36 | -// | ||
| 37 | -// You should have received a copy of the GNU General Public License | ||
| 38 | -// along with this program; if not, write to the Free Software | ||
| 39 | -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | ||
| 40 | -// | ||
| 41 | -// In addition, as a special exception, the copyright holders give | ||
| 42 | -// permission to link the code of portions of this program with the | ||
| 43 | -// OpenSSL library under certain conditions as described in each | ||
| 44 | -// individual source file, and distribute linked combinations | ||
| 45 | -// including the two. | ||
| 46 | -// | ||
| 47 | -// You must obey the GNU General Public License in all respects for | ||
| 48 | -// all of the code used other than OpenSSL. If you modify file(s) | ||
| 49 | -// with this exception, you may extend this exception to your version | ||
| 50 | -// of the file(s), but you are not obligated to do so. If you do not | ||
| 51 | -// wish to do so, delete this exception statement from your version. | ||
| 52 | -// If you delete this exception statement from all source files in the | ||
| 53 | -// program, then also delete it here. | ||
| 54 | -// | ||
| 55 | -// Contact: Jari Sundell <jaris@ifi.uio.no> | ||
| 56 | -// | ||
| 57 | -// Skomakerveien 33 | ||
| 58 | -// 3185 Skoppum, NORWAY | ||
| 59 | - | ||
| 60 | #include "config.h" | ||
| 61 | |||
| 62 | #include <cstring> | ||
| 63 | diff --git a/src/download/download_main.h b/src/download/download_main.h | ||
| 64 | index da3cf182..4783e863 100644 | ||
| 65 | --- a/src/download/download_main.h | ||
| 66 | +++ b/src/download/download_main.h | ||
| 67 | @@ -1,39 +1,3 @@ | ||
| 68 | -// libTorrent - BitTorrent library | ||
| 69 | -// Copyright (C) 2005-2011, Jari Sundell | ||
| 70 | -// | ||
| 71 | -// This program is free software; you can redistribute it and/or modify | ||
| 72 | -// it under the terms of the GNU General Public License as published by | ||
| 73 | -// the Free Software Foundation; either version 2 of the License, or | ||
| 74 | -// (at your option) any later version. | ||
| 75 | -// | ||
| 76 | -// This program is distributed in the hope that it will be useful, | ||
| 77 | -// but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
| 78 | -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
| 79 | -// GNU General Public License for more details. | ||
| 80 | -// | ||
| 81 | -// You should have received a copy of the GNU General Public License | ||
| 82 | -// along with this program; if not, write to the Free Software | ||
| 83 | -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | ||
| 84 | -// | ||
| 85 | -// In addition, as a special exception, the copyright holders give | ||
| 86 | -// permission to link the code of portions of this program with the | ||
| 87 | -// OpenSSL library under certain conditions as described in each | ||
| 88 | -// individual source file, and distribute linked combinations | ||
| 89 | -// including the two. | ||
| 90 | -// | ||
| 91 | -// You must obey the GNU General Public License in all respects for | ||
| 92 | -// all of the code used other than OpenSSL. If you modify file(s) | ||
| 93 | -// with this exception, you may extend this exception to your version | ||
| 94 | -// of the file(s), but you are not obligated to do so. If you do not | ||
| 95 | -// wish to do so, delete this exception statement from your version. | ||
| 96 | -// If you delete this exception statement from all source files in the | ||
| 97 | -// program, then also delete it here. | ||
| 98 | -// | ||
| 99 | -// Contact: Jari Sundell <jaris@ifi.uio.no> | ||
| 100 | -// | ||
| 101 | -// Skomakerveien 33 | ||
| 102 | -// 3185 Skoppum, NORWAY | ||
| 103 | - | ||
| 104 | #ifndef LIBTORRENT_DOWNLOAD_MAIN_H | ||
| 105 | #define LIBTORRENT_DOWNLOAD_MAIN_H | ||
| 106 | |||
| 107 | diff --git a/src/download/download_wrapper.cc b/src/download/download_wrapper.cc | ||
| 108 | index 59e81781..304bddce 100644 | ||
| 109 | --- a/src/download/download_wrapper.cc | ||
| 110 | +++ b/src/download/download_wrapper.cc | ||
| 111 | @@ -1,39 +1,3 @@ | ||
| 112 | -// libTorrent - BitTorrent library | ||
| 113 | -// Copyright (C) 2005-2011, Jari Sundell | ||
| 114 | -// | ||
| 115 | -// This program is free software; you can redistribute it and/or modify | ||
| 116 | -// it under the terms of the GNU General Public License as published by | ||
| 117 | -// the Free Software Foundation; either version 2 of the License, or | ||
| 118 | -// (at your option) any later version. | ||
| 119 | -// | ||
| 120 | -// This program is distributed in the hope that it will be useful, | ||
| 121 | -// but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
| 122 | -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
| 123 | -// GNU General Public License for more details. | ||
| 124 | -// | ||
| 125 | -// You should have received a copy of the GNU General Public License | ||
| 126 | -// along with this program; if not, write to the Free Software | ||
| 127 | -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | ||
| 128 | -// | ||
| 129 | -// In addition, as a special exception, the copyright holders give | ||
| 130 | -// permission to link the code of portions of this program with the | ||
| 131 | -// OpenSSL library under certain conditions as described in each | ||
| 132 | -// individual source file, and distribute linked combinations | ||
| 133 | -// including the two. | ||
| 134 | -// | ||
| 135 | -// You must obey the GNU General Public License in all respects for | ||
| 136 | -// all of the code used other than OpenSSL. If you modify file(s) | ||
| 137 | -// with this exception, you may extend this exception to your version | ||
| 138 | -// of the file(s), but you are not obligated to do so. If you do not | ||
| 139 | -// wish to do so, delete this exception statement from your version. | ||
| 140 | -// If you delete this exception statement from all source files in the | ||
| 141 | -// program, then also delete it here. | ||
| 142 | -// | ||
| 143 | -// Contact: Jari Sundell <jaris@ifi.uio.no> | ||
| 144 | -// | ||
| 145 | -// Skomakerveien 33 | ||
| 146 | -// 3185 Skoppum, NORWAY | ||
| 147 | - | ||
| 148 | #include "config.h" | ||
| 149 | |||
| 150 | #include <iterator> | ||
| 151 | @@ -62,6 +26,8 @@ | ||
| 152 | |||
| 153 | #include "download_wrapper.h" | ||
| 154 | |||
| 155 | +#define LT_LOG_THIS(log_fmt, ...) \ | ||
| 156 | + lt_log_print_info(LOG_TORRENT_INFO, this->info(), "download", log_fmt, __VA_ARGS__); | ||
| 157 | #define LT_LOG_STORAGE_ERRORS(log_fmt, ...) \ | ||
| 158 | lt_log_print_info(LOG_PROTOCOL_STORAGE_ERRORS, this->info(), "storage_errors", log_fmt, __VA_ARGS__); | ||
| 159 | |||
| 160 | @@ -325,8 +291,8 @@ DownloadWrapper::receive_tick(uint32_t ticks) { | ||
| 161 | |||
| 162 | void | ||
| 163 | DownloadWrapper::receive_update_priorities() { | ||
| 164 | - if (m_main->chunk_selector()->empty()) | ||
| 165 | - return; | ||
| 166 | + LT_LOG_THIS("update priorities: chunks_selected:%" PRIu32 " wanted_chunks:%" PRIu32, | ||
| 167 | + m_main->chunk_selector()->size(), data()->wanted_chunks()); | ||
| 168 | |||
| 169 | data()->mutable_high_priority()->clear(); | ||
| 170 | data()->mutable_normal_priority()->clear(); | ||
| 171 | @@ -359,7 +325,6 @@ DownloadWrapper::receive_update_priorities() { | ||
| 172 | } | ||
| 173 | |||
| 174 | bool was_partial = data()->wanted_chunks() != 0; | ||
| 175 | - | ||
| 176 | data()->update_wanted_chunks(); | ||
| 177 | |||
| 178 | m_main->chunk_selector()->update_priorities(); | ||
| 179 | diff --git a/src/torrent/data/download_data.h b/src/torrent/data/download_data.h | ||
| 180 | index fc212047..c701cb2f 100644 | ||
| 181 | --- a/src/torrent/data/download_data.h | ||
| 182 | +++ b/src/torrent/data/download_data.h | ||
| 183 | @@ -1,39 +1,3 @@ | ||
| 184 | -// libTorrent - BitTorrent library | ||
| 185 | -// Copyright (C) 2005-2011, Jari Sundell | ||
| 186 | -// | ||
| 187 | -// This program is free software; you can redistribute it and/or modify | ||
| 188 | -// it under the terms of the GNU General Public License as published by | ||
| 189 | -// the Free Software Foundation; either version 2 of the License, or | ||
| 190 | -// (at your option) any later version. | ||
| 191 | -// | ||
| 192 | -// This program is distributed in the hope that it will be useful, | ||
| 193 | -// but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
| 194 | -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
| 195 | -// GNU General Public License for more details. | ||
| 196 | -// | ||
| 197 | -// You should have received a copy of the GNU General Public License | ||
| 198 | -// along with this program; if not, write to the Free Software | ||
| 199 | -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | ||
| 200 | -// | ||
| 201 | -// In addition, as a special exception, the copyright holders give | ||
| 202 | -// permission to link the code of portions of this program with the | ||
| 203 | -// OpenSSL library under certain conditions as described in each | ||
| 204 | -// individual source file, and distribute linked combinations | ||
| 205 | -// including the two. | ||
| 206 | -// | ||
| 207 | -// You must obey the GNU General Public License in all respects for | ||
| 208 | -// all of the code used other than OpenSSL. If you modify file(s) | ||
| 209 | -// with this exception, you may extend this exception to your version | ||
| 210 | -// of the file(s), but you are not obligated to do so. If you do not | ||
| 211 | -// wish to do so, delete this exception statement from your version. | ||
| 212 | -// If you delete this exception statement from all source files in the | ||
| 213 | -// program, then also delete it here. | ||
| 214 | -// | ||
| 215 | -// Contact: Jari Sundell <jaris@ifi.uio.no> | ||
| 216 | -// | ||
| 217 | -// Skomakerveien 33 | ||
| 218 | -// 3185 Skoppum, NORWAY | ||
| 219 | - | ||
| 220 | #ifndef LIBTORRENT_DATA_DOWNLOAD_DATA_H | ||
| 221 | #define LIBTORRENT_DATA_DOWNLOAD_DATA_H | ||
| 222 | |||
| 223 | diff --git a/src/torrent/download/choke_queue.cc b/src/torrent/download/choke_queue.cc | ||
| 224 | index 7c00b686..edf47795 100644 | ||
| 225 | --- a/src/torrent/download/choke_queue.cc | ||
| 226 | +++ b/src/torrent/download/choke_queue.cc | ||
| 227 | @@ -1,39 +1,3 @@ | ||
| 228 | -// libTorrent - BitTorrent library | ||
| 229 | -// Copyright (C) 2005-2011, Jari Sundell | ||
| 230 | -// | ||
| 231 | -// This program is free software; you can redistribute it and/or modify | ||
| 232 | -// it under the terms of the GNU General Public License as published by | ||
| 233 | -// the Free Software Foundation; either version 2 of the License, or | ||
| 234 | -// (at your option) any later version. | ||
| 235 | -// | ||
| 236 | -// This program is distributed in the hope that it will be useful, | ||
| 237 | -// but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
| 238 | -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
| 239 | -// GNU General Public License for more details. | ||
| 240 | -// | ||
| 241 | -// You should have received a copy of the GNU General Public License | ||
| 242 | -// along with this program; if not, write to the Free Software | ||
| 243 | -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | ||
| 244 | -// | ||
| 245 | -// In addition, as a special exception, the copyright holders give | ||
| 246 | -// permission to link the code of portions of this program with the | ||
| 247 | -// OpenSSL library under certain conditions as described in each | ||
| 248 | -// individual source file, and distribute linked combinations | ||
| 249 | -// including the two. | ||
| 250 | -// | ||
| 251 | -// You must obey the GNU General Public License in all respects for | ||
| 252 | -// all of the code used other than OpenSSL. If you modify file(s) | ||
| 253 | -// with this exception, you may extend this exception to your version | ||
| 254 | -// of the file(s), but you are not obligated to do so. If you do not | ||
| 255 | -// wish to do so, delete this exception statement from your version. | ||
| 256 | -// If you delete this exception statement from all source files in the | ||
| 257 | -// program, then also delete it here. | ||
| 258 | -// | ||
| 259 | -// Contact: Jari Sundell <jaris@ifi.uio.no> | ||
| 260 | -// | ||
| 261 | -// Skomakerveien 33 | ||
| 262 | -// 3185 Skoppum, NORWAY | ||
| 263 | - | ||
| 264 | #include "config.h" | ||
| 265 | |||
| 266 | #include <algorithm> | ||
| 267 | @@ -50,6 +14,10 @@ | ||
| 268 | |||
| 269 | #include "choke_queue.h" | ||
| 270 | |||
| 271 | +// TODO: Add a different logging category. | ||
| 272 | +#define LT_LOG_THIS(log_fmt, ...) \ | ||
| 273 | + lt_log_print_subsystem(LOG_TORRENT_INFO, "choke_queue", log_fmt, __VA_ARGS__); | ||
| 274 | + | ||
| 275 | namespace torrent { | ||
| 276 | |||
| 277 | struct choke_manager_less { | ||
| 278 | @@ -193,6 +161,9 @@ choke_queue::rebuild_containers(container_type* queued, container_type* unchoked | ||
| 279 | |||
| 280 | void | ||
| 281 | choke_queue::balance() { | ||
| 282 | + LT_LOG_THIS("balancing queue: heuristics:%i currently_unchoked:%" PRIu32 " max_unchoked:%" PRIu32, | ||
| 283 | + m_heuristics, m_currently_unchoked, m_maxUnchoked) | ||
| 284 | + | ||
| 285 | // Return if no balancing is needed. Don't return if is_unlimited() | ||
| 286 | // as we might have just changed the value and have interested that | ||
| 287 | // can be unchoked. | ||
| 288 | @@ -216,6 +187,9 @@ choke_queue::balance() { | ||
| 289 | |||
| 290 | // If we have more unchoked than max global slots allow for, | ||
| 291 | // 'can_unchoke' will be negative. | ||
| 292 | + // | ||
| 293 | + // Throws std::bad_function_call if 'set_slot_can_unchoke' is not | ||
| 294 | + // set. | ||
| 295 | int can_unchoke = m_slotCanUnchoke(); | ||
| 296 | int max_unchoked = std::min(m_maxUnchoked, (uint32_t)(1 << 20)); | ||
| 297 | |||
| 298 | @@ -240,8 +214,8 @@ choke_queue::balance() { | ||
| 299 | if (result != 0) | ||
| 300 | m_slotUnchoke(result); | ||
| 301 | |||
| 302 | - lt_log_print(LOG_PEER_DEBUG, "Called balance; adjust:%i can_unchoke:%i queued:%u unchoked:%u result:%i.", | ||
| 303 | - adjust, can_unchoke, (unsigned)queued.size(), (unsigned)unchoked.size(), result); | ||
| 304 | + LT_LOG_THIS("balanced queue: adjust:%i can_unchoke:%i queued:%" PRIu32 " unchoked:%" PRIu32 " result:%i", | ||
| 305 | + adjust, can_unchoke, queued.size(), unchoked.size(), result); | ||
| 306 | } | ||
| 307 | |||
| 308 | void | ||
| 309 | diff --git a/src/torrent/download/resource_manager.cc b/src/torrent/download/resource_manager.cc | ||
| 310 | index 51434c91..8ca7b02e 100644 | ||
| 311 | --- a/src/torrent/download/resource_manager.cc | ||
| 312 | +++ b/src/torrent/download/resource_manager.cc | ||
| 313 | @@ -1,39 +1,3 @@ | ||
| 314 | -// libTorrent - BitTorrent library | ||
| 315 | -// Copyright (C) 2005-2011, Jari Sundell | ||
| 316 | -// | ||
| 317 | -// This program is free software; you can redistribute it and/or modify | ||
| 318 | -// it under the terms of the GNU General Public License as published by | ||
| 319 | -// the Free Software Foundation; either version 2 of the License, or | ||
| 320 | -// (at your option) any later version. | ||
| 321 | -// | ||
| 322 | -// This program is distributed in the hope that it will be useful, | ||
| 323 | -// but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
| 324 | -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
| 325 | -// GNU General Public License for more details. | ||
| 326 | -// | ||
| 327 | -// You should have received a copy of the GNU General Public License | ||
| 328 | -// along with this program; if not, write to the Free Software | ||
| 329 | -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | ||
| 330 | -// | ||
| 331 | -// In addition, as a special exception, the copyright holders give | ||
| 332 | -// permission to link the code of portions of this program with the | ||
| 333 | -// OpenSSL library under certain conditions as described in each | ||
| 334 | -// individual source file, and distribute linked combinations | ||
| 335 | -// including the two. | ||
| 336 | -// | ||
| 337 | -// You must obey the GNU General Public License in all respects for | ||
| 338 | -// all of the code used other than OpenSSL. If you modify file(s) | ||
| 339 | -// with this exception, you may extend this exception to your version | ||
| 340 | -// of the file(s), but you are not obligated to do so. If you do not | ||
| 341 | -// wish to do so, delete this exception statement from your version. | ||
| 342 | -// If you delete this exception statement from all source files in the | ||
| 343 | -// program, then also delete it here. | ||
| 344 | -// | ||
| 345 | -// Contact: Jari Sundell <jaris@ifi.uio.no> | ||
| 346 | -// | ||
| 347 | -// Skomakerveien 33 | ||
| 348 | -// 3185 Skoppum, NORWAY | ||
| 349 | - | ||
| 350 | #include "config.h" | ||
| 351 | |||
| 352 | #include <algorithm> | ||
| 353 | @@ -51,6 +15,11 @@ | ||
| 354 | #include "choke_queue.h" | ||
| 355 | #include "resource_manager.h" | ||
| 356 | |||
| 357 | +#define LT_LOG_THIS(log_fmt, ...) \ | ||
| 358 | + lt_log_print_subsystem(LOG_TORRENT_INFO, "resource_manager", log_fmt, __VA_ARGS__); | ||
| 359 | +#define LT_LOG_ITR(log_fmt, ...) \ | ||
| 360 | + lt_log_print_info(LOG_TORRENT_INFO, itr->download()->info(), "resource_manager", log_fmt, __VA_ARGS__); | ||
| 361 | + | ||
| 362 | namespace torrent { | ||
| 363 | |||
| 364 | const Rate* resource_manager_entry::up_rate() const { return m_download->info()->up_rate(); } | ||
| 365 | @@ -226,6 +195,8 @@ ResourceManager::group_index_of(const std::string& name) { | ||
| 366 | |||
| 367 | void | ||
| 368 | ResourceManager::set_priority(iterator itr, uint16_t pri) { | ||
| 369 | + LT_LOG_ITR("set priority: %" PRIu16, 0) | ||
| 370 | + | ||
| 371 | itr->set_priority(pri); | ||
| 372 | } | ||
| 373 | |||
| 374 | @@ -283,7 +254,7 @@ ResourceManager::set_max_download_unchoked(unsigned int m) { | ||
| 375 | // possibly multiple calls of this function. | ||
| 376 | void | ||
| 377 | ResourceManager::receive_upload_unchoke(int num) { | ||
| 378 | - lt_log_print(LOG_PEER_INFO, "Upload unchoked slots adjust; currently:%u adjust:%i", m_currentlyUploadUnchoked, num); | ||
| 379 | + LT_LOG_THIS("adjusting upload unchoked slots; current:%u adjusted:%i", m_currentlyUploadUnchoked, num); | ||
| 380 | |||
| 381 | if ((int)m_currentlyUploadUnchoked + num < 0) | ||
| 382 | throw internal_error("ResourceManager::receive_upload_unchoke(...) received an invalid value."); | ||
| 383 | @@ -293,7 +264,7 @@ ResourceManager::receive_upload_unchoke(int num) { | ||
| 384 | |||
| 385 | void | ||
| 386 | ResourceManager::receive_download_unchoke(int num) { | ||
| 387 | - lt_log_print(LOG_PEER_INFO, "Download unchoked slots adjust; currently:%u adjust:%i", m_currentlyDownloadUnchoked, num); | ||
| 388 | + LT_LOG_THIS("adjusting download unchoked slots; current:%u adjusted:%i", m_currentlyDownloadUnchoked, num); | ||
| 389 | |||
| 390 | if ((int)m_currentlyDownloadUnchoked + num < 0) | ||
| 391 | throw internal_error("ResourceManager::receive_download_unchoke(...) received an invalid value."); | ||
| 392 | @@ -387,12 +358,14 @@ ResourceManager::balance_unchoked(unsigned int weight, unsigned int max_unchoked | ||
| 393 | std::sort(group_first, group_last, std::bind(std::less<uint32_t>(), | ||
| 394 | std::bind(&choke_group::up_requested, std::placeholders::_1), | ||
| 395 | std::bind(&choke_group::up_requested, std::placeholders::_2))); | ||
| 396 | - lt_log_print(LOG_PEER_DEBUG, "Upload unchoked slots cycle; currently:%u adjusted:%i max_unchoked:%u", m_currentlyUploadUnchoked, change, max_unchoked); | ||
| 397 | + | ||
| 398 | + LT_LOG_THIS("balancing upload unchoked slots; current_unchoked:%u change:%i max_unchoked:%u", m_currentlyUploadUnchoked, change, max_unchoked); | ||
| 399 | } else { | ||
| 400 | std::sort(group_first, group_last, std::bind(std::less<uint32_t>(), | ||
| 401 | std::bind(&choke_group::down_requested, std::placeholders::_1), | ||
| 402 | std::bind(&choke_group::down_requested, std::placeholders::_2))); | ||
| 403 | - lt_log_print(LOG_PEER_DEBUG, "Download unchoked slots cycle; currently:%u adjusted:%i max_unchoked:%u", m_currentlyDownloadUnchoked, change, max_unchoked); | ||
| 404 | + | ||
| 405 | + LT_LOG_THIS("balancing download unchoked slots; current_unchoked:%u change:%i max_unchoked:%u", m_currentlyDownloadUnchoked, change, max_unchoked); | ||
| 406 | } | ||
| 407 | |||
| 408 | while (group_first != group_last) { | ||
| 409 | diff --git a/src/torrent/exceptions.cc b/src/torrent/exceptions.cc | ||
| 410 | index f834f9fa..7375ed8e 100644 | ||
| 411 | --- a/src/torrent/exceptions.cc | ||
| 412 | +++ b/src/torrent/exceptions.cc | ||
| 413 | @@ -1,39 +1,3 @@ | ||
| 414 | -// libTorrent - BitTorrent library | ||
| 415 | -// Copyright (C) 2005-2011, Jari Sundell | ||
| 416 | -// | ||
| 417 | -// This program is free software; you can redistribute it and/or modify | ||
| 418 | -// it under the terms of the GNU General Public License as published by | ||
| 419 | -// the Free Software Foundation; either version 2 of the License, or | ||
| 420 | -// (at your option) any later version. | ||
| 421 | -// | ||
| 422 | -// This program is distributed in the hope that it will be useful, | ||
| 423 | -// but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
| 424 | -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
| 425 | -// GNU General Public License for more details. | ||
| 426 | -// | ||
| 427 | -// You should have received a copy of the GNU General Public License | ||
| 428 | -// along with this program; if not, write to the Free Software | ||
| 429 | -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | ||
| 430 | -// | ||
| 431 | -// In addition, as a special exception, the copyright holders give | ||
| 432 | -// permission to link the code of portions of this program with the | ||
| 433 | -// OpenSSL library under certain conditions as described in each | ||
| 434 | -// individual source file, and distribute linked combinations | ||
| 435 | -// including the two. | ||
| 436 | -// | ||
| 437 | -// You must obey the GNU General Public License in all respects for | ||
| 438 | -// all of the code used other than OpenSSL. If you modify file(s) | ||
| 439 | -// with this exception, you may extend this exception to your version | ||
| 440 | -// of the file(s), but you are not obligated to do so. If you do not | ||
| 441 | -// wish to do so, delete this exception statement from your version. | ||
| 442 | -// If you delete this exception statement from all source files in the | ||
| 443 | -// program, then also delete it here. | ||
| 444 | -// | ||
| 445 | -// Contact: Jari Sundell <jaris@ifi.uio.no> | ||
| 446 | -// | ||
| 447 | -// Skomakerveien 33 | ||
| 448 | -// 3185 Skoppum, NORWAY | ||
| 449 | - | ||
| 450 | #include "config.h" | ||
| 451 | |||
| 452 | #include <cerrno> | ||
| 453 | @@ -73,23 +37,30 @@ void | ||
| 454 | internal_error::initialize(const std::string& msg) { | ||
| 455 | m_msg = msg; | ||
| 456 | |||
| 457 | - std::stringstream output; | ||
| 458 | - | ||
| 459 | #ifdef HAVE_BACKTRACE | ||
| 460 | - void* stackPtrs[20]; | ||
| 461 | + void* stack_ptrs[20]; | ||
| 462 | + int stack_size = ::backtrace(stack_ptrs, 20); | ||
| 463 | + char** stack_symbol_names = ::backtrace_symbols(stack_ptrs, stack_size); | ||
| 464 | |||
| 465 | - // Print the stack and exit. | ||
| 466 | - int stackSize = ::backtrace(stackPtrs, 20); | ||
| 467 | - char** stackStrings = backtrace_symbols(stackPtrs, stackSize); | ||
| 468 | + if (stack_symbol_names == nullptr) { | ||
| 469 | + m_backtrace = "backtrace_symbols failed"; | ||
| 470 | + return; | ||
| 471 | + } | ||
| 472 | |||
| 473 | - for (int i = 0; i < stackSize; ++i) | ||
| 474 | - output << stackStrings[i] << std::endl; | ||
| 475 | + std::stringstream output; | ||
| 476 | |||
| 477 | -#else | ||
| 478 | - output << "Stack dump not enabled." << std::endl; | ||
| 479 | -#endif | ||
| 480 | + for (int i = 0; i < stack_size; ++i) { | ||
| 481 | + if (stack_symbol_names[i] != nullptr && stack_symbol_names[i] > (void*)0x1000) | ||
| 482 | + output << stack_symbol_names[i] << std::endl; | ||
| 483 | + else | ||
| 484 | + output << "stack_symbol: nullptr" << std::endl; | ||
| 485 | + } | ||
| 486 | |||
| 487 | m_backtrace = output.str(); | ||
| 488 | + | ||
| 489 | +#else | ||
| 490 | + m_backtrace = "stack dump not enabled"; | ||
| 491 | +#endif | ||
| 492 | } | ||
| 493 | |||
| 494 | } | ||
| 495 | diff --git a/src/torrent/torrent.cc b/src/torrent/torrent.cc | ||
| 496 | index fb70d247..67de4387 100644 | ||
| 497 | --- a/src/torrent/torrent.cc | ||
| 498 | +++ b/src/torrent/torrent.cc | ||
| 499 | @@ -203,6 +203,7 @@ download_priority(Download d) { | ||
| 500 | return itr->priority(); | ||
| 501 | } | ||
| 502 | |||
| 503 | +// TODO: Remove this. | ||
| 504 | void | ||
| 505 | download_set_priority(Download d, uint32_t pri) { | ||
| 506 | ResourceManager::iterator itr = manager->resource_manager()->find(d.ptr()->main()); | ||
| 507 | diff --git a/src/torrent/utils/extents.h b/src/torrent/utils/extents.h | ||
| 508 | index c2b887b1..64605d4a 100644 | ||
| 509 | --- a/src/torrent/utils/extents.h | ||
| 510 | +++ b/src/torrent/utils/extents.h | ||
| 511 | @@ -1,39 +1,3 @@ | ||
| 512 | -// libTorrent - BitTorrent library | ||
| 513 | -// Copyright (C) 2005-2011, Jari Sundell | ||
| 514 | -// | ||
| 515 | -// This program is free software; you can redistribute it and/or modify | ||
| 516 | -// it under the terms of the GNU General Public License as published by | ||
| 517 | -// the Free Software Foundation; either version 2 of the License, or | ||
| 518 | -// (at your option) any later version. | ||
| 519 | -// | ||
| 520 | -// This program is distributed in the hope that it will be useful, | ||
| 521 | -// but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
| 522 | -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
| 523 | -// GNU General Public License for more details. | ||
| 524 | -// | ||
| 525 | -// You should have received a copy of the GNU General Public License | ||
| 526 | -// along with this program; if not, write to the Free Software | ||
| 527 | -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | ||
| 528 | -// | ||
| 529 | -// In addition, as a special exception, the copyright holders give | ||
| 530 | -// permission to link the code of portions of this program with the | ||
| 531 | -// OpenSSL library under certain conditions as described in each | ||
| 532 | -// individual source file, and distribute linked combinations | ||
| 533 | -// including the two. | ||
| 534 | -// | ||
| 535 | -// You must obey the GNU General Public License in all respects for | ||
| 536 | -// all of the code used other than OpenSSL. If you modify file(s) | ||
| 537 | -// with this exception, you may extend this exception to your version | ||
| 538 | -// of the file(s), but you are not obligated to do so. If you do not | ||
| 539 | -// wish to do so, delete this exception statement from your version. | ||
| 540 | -// If you delete this exception statement from all source files in the | ||
| 541 | -// program, then also delete it here. | ||
| 542 | -// | ||
| 543 | -// Contact: Jari Sundell <jaris@ifi.uio.no> | ||
| 544 | -// | ||
| 545 | -// Skomakerveien 33 | ||
| 546 | -// 3185 Skoppum, NORWAY | ||
| 547 | - | ||
| 548 | #ifndef LIBTORRENT_UTILS_EXTENTS_H | ||
| 549 | #define LIBTORRENT_UTILS_EXTENTS_H | ||
| 550 | |||
| 551 | diff --git a/src/torrent/utils/signal_bitfield.cc b/src/torrent/utils/signal_bitfield.cc | ||
| 552 | index 82f81e7c..dfc3d1fe 100644 | ||
| 553 | --- a/src/torrent/utils/signal_bitfield.cc | ||
| 554 | +++ b/src/torrent/utils/signal_bitfield.cc | ||
| 555 | @@ -1,39 +1,3 @@ | ||
| 556 | -// libTorrent - BitTorrent library | ||
| 557 | -// Copyright (C) 2005-2011, Jari Sundell | ||
| 558 | -// | ||
| 559 | -// This program is free software; you can redistribute it and/or modify | ||
| 560 | -// it under the terms of the GNU General Public License as published by | ||
| 561 | -// the Free Software Foundation; either version 2 of the License, or | ||
| 562 | -// (at your option) any later version. | ||
| 563 | -// | ||
| 564 | -// This program is distributed in the hope that it will be useful, | ||
| 565 | -// but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
| 566 | -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
| 567 | -// GNU General Public License for more details. | ||
| 568 | -// | ||
| 569 | -// You should have received a copy of the GNU General Public License | ||
| 570 | -// along with this program; if not, write to the Free Software | ||
| 571 | -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | ||
| 572 | -// | ||
| 573 | -// In addition, as a special exception, the copyright holders give | ||
| 574 | -// permission to link the code of portions of this program with the | ||
| 575 | -// OpenSSL library under certain conditions as described in each | ||
| 576 | -// individual source file, and distribute linked combinations | ||
| 577 | -// including the two. | ||
| 578 | -// | ||
| 579 | -// You must obey the GNU General Public License in all respects for | ||
| 580 | -// all of the code used other than OpenSSL. If you modify file(s) | ||
| 581 | -// with this exception, you may extend this exception to your version | ||
| 582 | -// of the file(s), but you are not obligated to do so. If you do not | ||
| 583 | -// wish to do so, delete this exception statement from your version. | ||
| 584 | -// If you delete this exception statement from all source files in the | ||
| 585 | -// program, then also delete it here. | ||
| 586 | -// | ||
| 587 | -// Contact: Jari Sundell <jaris@ifi.uio.no> | ||
| 588 | -// | ||
| 589 | -// Skomakerveien 33 | ||
| 590 | -// 3185 Skoppum, NORWAY | ||
| 591 | - | ||
| 592 | #include "config.h" | ||
| 593 | |||
| 594 | #include "torrent/exceptions.h" | ||
diff --git a/meta-oe/recipes-connectivity/libtorrent/libtorrent/0038-Fixed-issue-with-multiple-connections-from-NAT-not-w.patch b/meta-oe/recipes-connectivity/libtorrent/libtorrent/0038-Fixed-issue-with-multiple-connections-from-NAT-not-w.patch new file mode 100644 index 0000000000..8937e869fa --- /dev/null +++ b/meta-oe/recipes-connectivity/libtorrent/libtorrent/0038-Fixed-issue-with-multiple-connections-from-NAT-not-w.patch | |||
| @@ -0,0 +1,199 @@ | |||
| 1 | From cabc557fdf6f12fee7029081de2cf5de88464c21 Mon Sep 17 00:00:00 2001 | ||
| 2 | From: rakshasa <sundell.software@gmail.com> | ||
| 3 | Date: Thu, 29 Apr 2021 21:27:50 +0900 | ||
| 4 | Subject: [PATCH] Fixed issue with multiple connections from NAT not working. | ||
| 5 | |||
| 6 | --- | ||
| 7 | src/protocol/handshake.cc | 36 ------------------- | ||
| 8 | src/torrent/peer/peer_list.cc | 68 +++++++++++------------------------ | ||
| 9 | src/torrent/peer/peer_list.h | 36 ------------------- | ||
| 10 | 3 files changed, 20 insertions(+), 120 deletions(-) | ||
| 11 | |||
| 12 | diff --git a/src/protocol/handshake.cc b/src/protocol/handshake.cc | ||
| 13 | index 1b877c7a..d6f48e59 100644 | ||
| 14 | --- a/src/protocol/handshake.cc | ||
| 15 | +++ b/src/protocol/handshake.cc | ||
| 16 | @@ -1,39 +1,3 @@ | ||
| 17 | -// libTorrent - BitTorrent library | ||
| 18 | -// Copyright (C) 2005-2011, Jari Sundell | ||
| 19 | -// | ||
| 20 | -// This program is free software; you can redistribute it and/or modify | ||
| 21 | -// it under the terms of the GNU General Public License as published by | ||
| 22 | -// the Free Software Foundation; either version 2 of the License, or | ||
| 23 | -// (at your option) any later version. | ||
| 24 | -// | ||
| 25 | -// This program is distributed in the hope that it will be useful, | ||
| 26 | -// but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
| 27 | -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
| 28 | -// GNU General Public License for more details. | ||
| 29 | -// | ||
| 30 | -// You should have received a copy of the GNU General Public License | ||
| 31 | -// along with this program; if not, write to the Free Software | ||
| 32 | -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | ||
| 33 | -// | ||
| 34 | -// In addition, as a special exception, the copyright holders give | ||
| 35 | -// permission to link the code of portions of this program with the | ||
| 36 | -// OpenSSL library under certain conditions as described in each | ||
| 37 | -// individual source file, and distribute linked combinations | ||
| 38 | -// including the two. | ||
| 39 | -// | ||
| 40 | -// You must obey the GNU General Public License in all respects for | ||
| 41 | -// all of the code used other than OpenSSL. If you modify file(s) | ||
| 42 | -// with this exception, you may extend this exception to your version | ||
| 43 | -// of the file(s), but you are not obligated to do so. If you do not | ||
| 44 | -// wish to do so, delete this exception statement from your version. | ||
| 45 | -// If you delete this exception statement from all source files in the | ||
| 46 | -// program, then also delete it here. | ||
| 47 | -// | ||
| 48 | -// Contact: Jari Sundell <jaris@ifi.uio.no> | ||
| 49 | -// | ||
| 50 | -// Skomakerveien 33 | ||
| 51 | -// 3185 Skoppum, NORWAY | ||
| 52 | - | ||
| 53 | #include "config.h" | ||
| 54 | |||
| 55 | #include <stdio.h> | ||
| 56 | diff --git a/src/torrent/peer/peer_list.cc b/src/torrent/peer/peer_list.cc | ||
| 57 | index 080a7f13..6ce630f7 100644 | ||
| 58 | --- a/src/torrent/peer/peer_list.cc | ||
| 59 | +++ b/src/torrent/peer/peer_list.cc | ||
| 60 | @@ -1,39 +1,3 @@ | ||
| 61 | -// libTorrent - BitTorrent library | ||
| 62 | -// Copyright (C) 2005-2011, Jari Sundell | ||
| 63 | -// | ||
| 64 | -// This program is free software; you can redistribute it and/or modify | ||
| 65 | -// it under the terms of the GNU General Public License as published by | ||
| 66 | -// the Free Software Foundation; either version 2 of the License, or | ||
| 67 | -// (at your option) any later version. | ||
| 68 | -// | ||
| 69 | -// This program is distributed in the hope that it will be useful, | ||
| 70 | -// but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
| 71 | -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
| 72 | -// GNU General Public License for more details. | ||
| 73 | -// | ||
| 74 | -// You should have received a copy of the GNU General Public License | ||
| 75 | -// along with this program; if not, write to the Free Software | ||
| 76 | -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | ||
| 77 | -// | ||
| 78 | -// In addition, as a special exception, the copyright holders give | ||
| 79 | -// permission to link the code of portions of this program with the | ||
| 80 | -// OpenSSL library under certain conditions as described in each | ||
| 81 | -// individual source file, and distribute linked combinations | ||
| 82 | -// including the two. | ||
| 83 | -// | ||
| 84 | -// You must obey the GNU General Public License in all respects for | ||
| 85 | -// all of the code used other than OpenSSL. If you modify file(s) | ||
| 86 | -// with this exception, you may extend this exception to your version | ||
| 87 | -// of the file(s), but you are not obligated to do so. If you do not | ||
| 88 | -// wish to do so, delete this exception statement from your version. | ||
| 89 | -// If you delete this exception statement from all source files in the | ||
| 90 | -// program, then also delete it here. | ||
| 91 | -// | ||
| 92 | -// Contact: Jari Sundell <jaris@ifi.uio.no> | ||
| 93 | -// | ||
| 94 | -// Skomakerveien 33 | ||
| 95 | -// 3185 Skoppum, NORWAY | ||
| 96 | - | ||
| 97 | #include "config.h" | ||
| 98 | |||
| 99 | #include <algorithm> | ||
| 100 | @@ -262,8 +226,11 @@ PeerList::available_list_size() const { | ||
| 101 | return m_available_list->size(); | ||
| 102 | } | ||
| 103 | |||
| 104 | +// TODO: Rename connecting: | ||
| 105 | PeerInfo* | ||
| 106 | PeerList::connected(const sockaddr* sa, int flags) { | ||
| 107 | + // TODO: Rewrite to use new socket address api after fixing bug. | ||
| 108 | + | ||
| 109 | const rak::socket_address* address = rak::socket_address::cast_from(sa); | ||
| 110 | socket_address_key sock_key = socket_address_key::from_sockaddr(sa); | ||
| 111 | |||
| 112 | @@ -281,13 +248,7 @@ PeerList::connected(const sockaddr* sa, int flags) { | ||
| 113 | // We should also remove any PeerInfo objects already for this | ||
| 114 | // address. | ||
| 115 | if ((filter_value & PeerInfo::flag_unwanted)) { | ||
| 116 | - char ipv4_str[INET_ADDRSTRLEN]; | ||
| 117 | - uint32_t net_order_addr = htonl(host_byte_order_ipv4_addr); | ||
| 118 | - | ||
| 119 | - inet_ntop(AF_INET, &net_order_addr, ipv4_str, INET_ADDRSTRLEN); | ||
| 120 | - | ||
| 121 | - lt_log_print(LOG_PEER_INFO, "Peer %s is unwanted: preventing connection", ipv4_str); | ||
| 122 | - | ||
| 123 | + LT_LOG_EVENTS("connecting peer rejected, flagged as unwanted: " LT_LOG_SA_FMT, address->address_str().c_str(), address->port()); | ||
| 124 | return NULL; | ||
| 125 | } | ||
| 126 | |||
| 127 | @@ -313,12 +274,23 @@ PeerList::connected(const sockaddr* sa, int flags) { | ||
| 128 | // | ||
| 129 | // This also ensure we can connect to peers running on the same | ||
| 130 | // host as the tracker. | ||
| 131 | - if (flags & connect_keep_handshakes && | ||
| 132 | - range.first->second->is_handshake() && | ||
| 133 | - rak::socket_address::cast_from(range.first->second->socket_address())->port() != address->port()) | ||
| 134 | - m_available_list->buffer()->push_back(*address); | ||
| 135 | + // if (flags & connect_keep_handshakes && | ||
| 136 | + // range.first->second->is_handshake() && | ||
| 137 | + // rak::socket_address::cast_from(range.first->second->socket_address())->port() != address->port()) | ||
| 138 | + // m_available_list->buffer()->push_back(*address); | ||
| 139 | |||
| 140 | - return NULL; | ||
| 141 | + LT_LOG_EVENTS("connecting peer rejected, already connected (buggy, fixme): " LT_LOG_SA_FMT, address->address_str().c_str(), address->port()); | ||
| 142 | + | ||
| 143 | + // TODO: Verify this works properly, possibly add a check/flag | ||
| 144 | + // that allows the handshake manager to notify peer list if the | ||
| 145 | + // incoming connection was a duplicate peer hash. | ||
| 146 | + | ||
| 147 | + //return NULL; | ||
| 148 | + | ||
| 149 | + peerInfo = new PeerInfo(sa); | ||
| 150 | + peerInfo->set_flags(filter_value & PeerInfo::mask_ip_table); | ||
| 151 | + | ||
| 152 | + base_type::insert(range.second, value_type(sock_key, peerInfo)); | ||
| 153 | } | ||
| 154 | |||
| 155 | if (flags & connect_filter_recent && | ||
| 156 | diff --git a/src/torrent/peer/peer_list.h b/src/torrent/peer/peer_list.h | ||
| 157 | index 4c2f707d..a9d31a54 100644 | ||
| 158 | --- a/src/torrent/peer/peer_list.h | ||
| 159 | +++ b/src/torrent/peer/peer_list.h | ||
| 160 | @@ -1,39 +1,3 @@ | ||
| 161 | -// libTorrent - BitTorrent library | ||
| 162 | -// Copyright (C) 2005-2011, Jari Sundell | ||
| 163 | -// | ||
| 164 | -// This program is free software; you can redistribute it and/or modify | ||
| 165 | -// it under the terms of the GNU General Public License as published by | ||
| 166 | -// the Free Software Foundation; either version 2 of the License, or | ||
| 167 | -// (at your option) any later version. | ||
| 168 | -// | ||
| 169 | -// This program is distributed in the hope that it will be useful, | ||
| 170 | -// but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
| 171 | -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
| 172 | -// GNU General Public License for more details. | ||
| 173 | -// | ||
| 174 | -// You should have received a copy of the GNU General Public License | ||
| 175 | -// along with this program; if not, write to the Free Software | ||
| 176 | -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | ||
| 177 | -// | ||
| 178 | -// In addition, as a special exception, the copyright holders give | ||
| 179 | -// permission to link the code of portions of this program with the | ||
| 180 | -// OpenSSL library under certain conditions as described in each | ||
| 181 | -// individual source file, and distribute linked combinations | ||
| 182 | -// including the two. | ||
| 183 | -// | ||
| 184 | -// You must obey the GNU General Public License in all respects for | ||
| 185 | -// all of the code used other than OpenSSL. If you modify file(s) | ||
| 186 | -// with this exception, you may extend this exception to your version | ||
| 187 | -// of the file(s), but you are not obligated to do so. If you do not | ||
| 188 | -// wish to do so, delete this exception statement from your version. | ||
| 189 | -// If you delete this exception statement from all source files in the | ||
| 190 | -// program, then also delete it here. | ||
| 191 | -// | ||
| 192 | -// Contact: Jari Sundell <jaris@ifi.uio.no> | ||
| 193 | -// | ||
| 194 | -// Skomakerveien 33 | ||
| 195 | -// 3185 Skoppum, NORWAY | ||
| 196 | - | ||
| 197 | #ifndef LIBTORRENT_PEER_LIST_H | ||
| 198 | #define LIBTORRENT_PEER_LIST_H | ||
| 199 | |||
diff --git a/meta-oe/recipes-connectivity/libtorrent/libtorrent/0039-Added-disable-execinfo-option-to-configure.patch b/meta-oe/recipes-connectivity/libtorrent/libtorrent/0039-Added-disable-execinfo-option-to-configure.patch new file mode 100644 index 0000000000..a631b8de94 --- /dev/null +++ b/meta-oe/recipes-connectivity/libtorrent/libtorrent/0039-Added-disable-execinfo-option-to-configure.patch | |||
| @@ -0,0 +1,32 @@ | |||
| 1 | From 532d3e54b3f012dc81530ebb80ded8b26434fdd9 Mon Sep 17 00:00:00 2001 | ||
| 2 | From: rakshasa <sundell.software@gmail.com> | ||
| 3 | Date: Wed, 16 Jun 2021 23:28:28 +0900 | ||
| 4 | Subject: [PATCH] Added '--disable-execinfo' option to configure. | ||
| 5 | |||
| 6 | --- | ||
| 7 | configure.ac | 11 ++++++++++- | ||
| 8 | 1 file changed, 10 insertions(+), 1 deletion(-) | ||
| 9 | |||
| 10 | diff --git a/configure.ac b/configure.ac | ||
| 11 | index 73caf712..a4f051e4 100644 | ||
| 12 | --- a/configure.ac | ||
| 13 | +++ b/configure.ac | ||
| 14 | @@ -64,8 +64,17 @@ AC_ARG_ENABLE(attribute-visibility, | ||
| 15 | CC_ATTRIBUTE_VISIBILITY | ||
| 16 | ]) | ||
| 17 | |||
| 18 | +AC_ARG_ENABLE(execinfo, | ||
| 19 | + AC_HELP_STRING([--disable-execinfo], [disable libexecinfo [[default=enable]]]), | ||
| 20 | + [ | ||
| 21 | + if test "$enableval" = "yes"; then | ||
| 22 | + AX_EXECINFO | ||
| 23 | + fi | ||
| 24 | + ],[ | ||
| 25 | + AX_EXECINFO | ||
| 26 | + ]) | ||
| 27 | + | ||
| 28 | AX_CHECK_ZLIB | ||
| 29 | -AX_EXECINFO | ||
| 30 | AX_PTHREAD | ||
| 31 | |||
| 32 | PKG_CHECK_MODULES([CPPUNIT], [cppunit],, [no_cppunit="yes"]) | ||
diff --git a/meta-oe/recipes-connectivity/libtorrent/libtorrent/0040-Detect-ip-address.patch b/meta-oe/recipes-connectivity/libtorrent/libtorrent/0040-Detect-ip-address.patch new file mode 100644 index 0000000000..196d2f6aff --- /dev/null +++ b/meta-oe/recipes-connectivity/libtorrent/libtorrent/0040-Detect-ip-address.patch | |||
| @@ -0,0 +1,457 @@ | |||
| 1 | From 92781533fc4afab67447e8e6d47a649383179c44 Mon Sep 17 00:00:00 2001 | ||
| 2 | From: rakshasa <sundell.software@gmail.com> | ||
| 3 | Date: Sun, 20 Jun 2021 18:10:52 +0900 | ||
| 4 | Subject: [PATCH] Detect ip address. | ||
| 5 | |||
| 6 | --- | ||
| 7 | src/net/local_addr.cc | 6 +- | ||
| 8 | src/torrent/Makefile.am | 5 +- | ||
| 9 | src/torrent/net/fd.cc | 3 + | ||
| 10 | src/torrent/net/fd.h | 14 ++-- | ||
| 11 | src/torrent/net/socket_address.cc | 2 +- | ||
| 12 | src/torrent/net/socket_address.h | 2 +- | ||
| 13 | src/torrent/net/utils.cc | 104 ++++++++++++++++++++++++ | ||
| 14 | src/torrent/net/utils.h | 9 ++ | ||
| 15 | src/tracker/tracker_http.cc | 104 ++++++++---------------- | ||
| 16 | test/helpers/network.h | 2 + | ||
| 17 | test/torrent/net/test_fd.cc | 9 ++ | ||
| 18 | test/torrent/net/test_socket_address.cc | 2 +- | ||
| 19 | 12 files changed, 181 insertions(+), 81 deletions(-) | ||
| 20 | create mode 100755 src/torrent/net/utils.cc | ||
| 21 | create mode 100755 src/torrent/net/utils.h | ||
| 22 | |||
| 23 | diff --git a/src/net/local_addr.cc b/src/net/local_addr.cc | ||
| 24 | index 24413265..0c7116cb 100644 | ||
| 25 | --- a/src/net/local_addr.cc | ||
| 26 | +++ b/src/net/local_addr.cc | ||
| 27 | @@ -34,6 +34,8 @@ | ||
| 28 | // Skomakerveien 33 | ||
| 29 | // 3185 Skoppum, NORWAY | ||
| 30 | |||
| 31 | +// TODO: Remove. | ||
| 32 | + | ||
| 33 | #include "config.h" | ||
| 34 | |||
| 35 | #include <stdio.h> | ||
| 36 | @@ -241,7 +243,7 @@ bool get_local_address(sa_family_t family, rak::socket_address *address) { | ||
| 37 | int plen = IFA_PAYLOAD(nlmsg); | ||
| 38 | for (const rtattr *rta = IFA_RTA(ifa); | ||
| 39 | RTA_OK(rta, plen); | ||
| 40 | - rta = RTA_NEXT(rta, plen)) { | ||
| 41 | + rta = RTA_NEXT(rta, plen)) { | ||
| 42 | if (rta->rta_type != IFA_LOCAL && | ||
| 43 | rta->rta_type != IFA_ADDRESS) { | ||
| 44 | continue; | ||
| 45 | @@ -303,7 +305,7 @@ get_local_address(sa_family_t family, rak::socket_address *address) { | ||
| 46 | dummy_dest.set_address_c_str("4.0.0.0"); | ||
| 47 | break; | ||
| 48 | case rak::socket_address::af_inet6: | ||
| 49 | - dummy_dest.set_address_c_str("2001:700::"); | ||
| 50 | + dummy_dest.set_address_c_str("2001:1::"); | ||
| 51 | break; | ||
| 52 | default: | ||
| 53 | throw internal_error("Unknown address family"); | ||
| 54 | diff --git a/src/torrent/Makefile.am b/src/torrent/Makefile.am | ||
| 55 | index 30157b95..5de7e8ae 100644 | ||
| 56 | --- a/src/torrent/Makefile.am | ||
| 57 | +++ b/src/torrent/Makefile.am | ||
| 58 | @@ -46,6 +46,8 @@ libtorrent_torrent_la_SOURCES = \ | ||
| 59 | net/socket_event.cc \ | ||
| 60 | net/socket_event.h \ | ||
| 61 | net/types.h \ | ||
| 62 | + net/utils.cc \ | ||
| 63 | + net/utils.h \ | ||
| 64 | \ | ||
| 65 | peer/choke_status.h \ | ||
| 66 | peer/client_info.cc \ | ||
| 67 | @@ -167,7 +169,8 @@ libtorrent_torrent_net_include_HEADERS = \ | ||
| 68 | net/socket_address.h \ | ||
| 69 | net/socket_address_key.h \ | ||
| 70 | net/socket_event.h \ | ||
| 71 | - net/types.h | ||
| 72 | + net/types.h \ | ||
| 73 | + net/utils.h | ||
| 74 | |||
| 75 | libtorrent_torrent_peer_includedir = $(includedir)/torrent/peer | ||
| 76 | libtorrent_torrent_peer_include_HEADERS = \ | ||
| 77 | diff --git a/src/torrent/net/fd.cc b/src/torrent/net/fd.cc | ||
| 78 | index 07c91779..6d228181 100644 | ||
| 79 | --- a/src/torrent/net/fd.cc | ||
| 80 | +++ b/src/torrent/net/fd.cc | ||
| 81 | @@ -64,6 +64,9 @@ fd_open(fd_flags flags) { | ||
| 82 | if ((flags & fd_flag_stream)) { | ||
| 83 | domain = SOCK_STREAM; | ||
| 84 | protocol = IPPROTO_TCP; | ||
| 85 | + } else if ((flags & fd_flag_datagram)) { | ||
| 86 | + domain = SOCK_DGRAM; | ||
| 87 | + protocol = IPPROTO_UDP; | ||
| 88 | } else { | ||
| 89 | LT_LOG_FLAG("fd_open missing socket type"); | ||
| 90 | errno = EINVAL; | ||
| 91 | diff --git a/src/torrent/net/fd.h b/src/torrent/net/fd.h | ||
| 92 | index a7094646..6ab3302d 100644 | ||
| 93 | --- a/src/torrent/net/fd.h | ||
| 94 | +++ b/src/torrent/net/fd.h | ||
| 95 | @@ -9,11 +9,12 @@ namespace torrent { | ||
| 96 | |||
| 97 | enum fd_flags : int { | ||
| 98 | fd_flag_stream = 0x1, | ||
| 99 | - fd_flag_nonblock = 0x10, | ||
| 100 | - fd_flag_reuse_address = 0x20, | ||
| 101 | - fd_flag_v4only = 0x40, | ||
| 102 | - fd_flag_v6only = 0x80, | ||
| 103 | - fd_flag_all = 0xff, | ||
| 104 | + fd_flag_datagram = 0x10, | ||
| 105 | + fd_flag_nonblock = 0x20, | ||
| 106 | + fd_flag_reuse_address = 0x40, | ||
| 107 | + fd_flag_v4only = 0x80, | ||
| 108 | + fd_flag_v6only = 0x100, | ||
| 109 | + fd_flag_all = 0x1ff, | ||
| 110 | }; | ||
| 111 | |||
| 112 | constexpr bool fd_valid_flags(fd_flags flags); | ||
| 113 | @@ -53,7 +54,8 @@ operator |=(fd_flags& lhs, fd_flags rhs) { | ||
| 114 | constexpr bool | ||
| 115 | fd_valid_flags(fd_flags flags) { | ||
| 116 | return | ||
| 117 | - (flags & fd_flag_stream) && | ||
| 118 | + ((flags & fd_flag_stream) || (flags & fd_flag_datagram)) && | ||
| 119 | + !((flags & fd_flag_stream) && (flags & fd_flag_datagram)) && | ||
| 120 | !((flags & fd_flag_v4only) && (flags & fd_flag_v6only)) && | ||
| 121 | !(flags & ~(fd_flag_all)); | ||
| 122 | } | ||
| 123 | diff --git a/src/torrent/net/socket_address.cc b/src/torrent/net/socket_address.cc | ||
| 124 | index c36ba0ae..078bee25 100644 | ||
| 125 | --- a/src/torrent/net/socket_address.cc | ||
| 126 | +++ b/src/torrent/net/socket_address.cc | ||
| 127 | @@ -135,7 +135,7 @@ sa_unique_ptr | ||
| 128 | sa_make_unspec() { | ||
| 129 | sa_unique_ptr sa(new sockaddr); | ||
| 130 | |||
| 131 | - std::memset(sa.get(), 0, sizeof(sa)); | ||
| 132 | + std::memset(sa.get(), 0, sizeof(sockaddr)); | ||
| 133 | sa.get()->sa_family = AF_UNSPEC; | ||
| 134 | |||
| 135 | return sa; | ||
| 136 | diff --git a/src/torrent/net/socket_address.h b/src/torrent/net/socket_address.h | ||
| 137 | index f64aee68..b9586ca1 100644 | ||
| 138 | --- a/src/torrent/net/socket_address.h | ||
| 139 | +++ b/src/torrent/net/socket_address.h | ||
| 140 | @@ -102,8 +102,8 @@ bool fd_sap_equal(const fd_sap_tuple& lhs, const fd_sap_tuple& rhs) LIBTORRENT_E | ||
| 141 | |||
| 142 | inline bool sap_is_unspec(const sa_unique_ptr& sap) { return sa_is_unspec(sap.get()); } | ||
| 143 | inline bool sap_is_unspec(const c_sa_unique_ptr& sap) { return sa_is_unspec(sap.get()); } | ||
| 144 | -inline bool sap_is_inet(const c_sa_unique_ptr& sap) { return sa_is_inet(sap.get()); } | ||
| 145 | inline bool sap_is_inet(const sa_unique_ptr& sap) { return sa_is_inet(sap.get()); } | ||
| 146 | +inline bool sap_is_inet(const c_sa_unique_ptr& sap) { return sa_is_inet(sap.get()); } | ||
| 147 | inline bool sap_is_inet6(const sa_unique_ptr& sap) { return sa_is_inet6(sap.get()); } | ||
| 148 | inline bool sap_is_inet6(const c_sa_unique_ptr& sap) { return sa_is_inet6(sap.get()); } | ||
| 149 | inline bool sap_is_inet_inet6(const sa_unique_ptr& sap) { return sa_is_inet_inet6(sap.get()); } | ||
| 150 | diff --git a/src/torrent/net/utils.cc b/src/torrent/net/utils.cc | ||
| 151 | new file mode 100755 | ||
| 152 | index 00000000..4cb85924 | ||
| 153 | --- /dev/null | ||
| 154 | +++ b/src/torrent/net/utils.cc | ||
| 155 | @@ -0,0 +1,104 @@ | ||
| 156 | +#import <torrent/net/utils.h> | ||
| 157 | + | ||
| 158 | +#import <cerrno> | ||
| 159 | +#import <cstring> | ||
| 160 | +#import <torrent/net/fd.h> | ||
| 161 | +#import <torrent/net/socket_address.h> | ||
| 162 | +#import <torrent/utils/log.h> | ||
| 163 | + | ||
| 164 | +#define LT_LOG_ERROR(log_fmt) \ | ||
| 165 | + lt_log_print(LOG_CONNECTION_FD, "fd: " log_fmt " (errno:%i message:'%s')", \ | ||
| 166 | + errno, std::strerror(errno)); | ||
| 167 | +#define LT_LOG_FD(log_fmt) \ | ||
| 168 | + lt_log_print(LOG_CONNECTION_FD, "fd->%i: " log_fmt, fd); | ||
| 169 | +#define LT_LOG_FD_ERROR(log_fmt) \ | ||
| 170 | + lt_log_print(LOG_CONNECTION_FD, "fd->%i: " log_fmt " (errno:%i message:'%s')", \ | ||
| 171 | + fd, errno, std::strerror(errno)); | ||
| 172 | +#define LT_LOG_FD_SIN(log_fmt) \ | ||
| 173 | + lt_log_print(LOG_CONNECTION_FD, "fd->%i: " log_fmt " (address:%s)", \ | ||
| 174 | + fd, sin_pretty_str(sa.get()).c_str()); | ||
| 175 | +#define LT_LOG_FD_SIN6(log_fmt) \ | ||
| 176 | + lt_log_print(LOG_CONNECTION_FD, "fd->%i: " log_fmt " (address:%s)", \ | ||
| 177 | + fd, sin6_pretty_str(sa.get()).c_str()); | ||
| 178 | + | ||
| 179 | +namespace torrent { | ||
| 180 | + | ||
| 181 | +auto detect_local_sin_addr() -> sin_unique_ptr { | ||
| 182 | + int fd = fd_open(fd_flag_v4only | fd_flag_datagram); | ||
| 183 | + if (fd == -1) { | ||
| 184 | + LT_LOG_ERROR("detect_local_sin_addr: open failed"); | ||
| 185 | + return sin_unique_ptr(); | ||
| 186 | + } | ||
| 187 | + | ||
| 188 | + // TODO: Check if unique_ptr works. | ||
| 189 | + std::shared_ptr<void> _fd(nullptr, [fd](...){ fd_close(fd); }); | ||
| 190 | + | ||
| 191 | + auto connectAddress = sin_make(); | ||
| 192 | + connectAddress.get()->sin_addr.s_addr = htonl(0x04000001); | ||
| 193 | + connectAddress.get()->sin_port = 80; | ||
| 194 | + | ||
| 195 | + if (!fd_connect(fd, reinterpret_cast<sockaddr*>(connectAddress.get())) && errno != EINPROGRESS) { | ||
| 196 | + LT_LOG_FD_ERROR("detect_local_sin_addr: connect failed"); | ||
| 197 | + return sin_unique_ptr(); | ||
| 198 | + } | ||
| 199 | + | ||
| 200 | + // TODO: Make sa function. | ||
| 201 | + socklen_t socklen = sizeof(sockaddr_in); | ||
| 202 | + | ||
| 203 | + auto sa = sin_make(); | ||
| 204 | + | ||
| 205 | + if (::getsockname(fd, reinterpret_cast<sockaddr*>(sa.get()), &socklen) != 0) { | ||
| 206 | + LT_LOG_FD_ERROR("detect_local_sin_addr: getsockname failed"); | ||
| 207 | + return sin_unique_ptr(); | ||
| 208 | + } | ||
| 209 | + if (socklen != sizeof(sockaddr_in)) { | ||
| 210 | + LT_LOG_FD("detect_local_sin_addr: getsockname failed, invalid socklen"); | ||
| 211 | + return sin_unique_ptr(); | ||
| 212 | + } | ||
| 213 | + | ||
| 214 | + LT_LOG_FD_SIN("detect_local_sin_addr: success"); | ||
| 215 | + | ||
| 216 | + return sa; | ||
| 217 | +} | ||
| 218 | + | ||
| 219 | +auto detect_local_sin6_addr() -> sin6_unique_ptr { | ||
| 220 | + int fd = fd_open(fd_flag_v6only | fd_flag_datagram); | ||
| 221 | + if (fd == -1) { | ||
| 222 | + LT_LOG_ERROR("detect_local_sin6_addr: open failed"); | ||
| 223 | + return sin6_unique_ptr(); | ||
| 224 | + } | ||
| 225 | + | ||
| 226 | + // TODO: Check if unique_ptr works. | ||
| 227 | + std::shared_ptr<void> _fd(nullptr, [fd](...){ fd_close(fd); }); | ||
| 228 | + | ||
| 229 | + auto connectAddress = sin6_make(); | ||
| 230 | + connectAddress.get()->sin6_addr.s6_addr[0] = 0x20; | ||
| 231 | + connectAddress.get()->sin6_addr.s6_addr[1] = 0x01; | ||
| 232 | + connectAddress.get()->sin6_addr.s6_addr[15] = 0x01; | ||
| 233 | + connectAddress.get()->sin6_port = 80; | ||
| 234 | + | ||
| 235 | + if (!fd_connect(fd, reinterpret_cast<sockaddr*>(connectAddress.get())) && errno != EINPROGRESS) { | ||
| 236 | + LT_LOG_FD_ERROR("detect_local_sin6_addr: connect failed"); | ||
| 237 | + return sin6_unique_ptr(); | ||
| 238 | + } | ||
| 239 | + | ||
| 240 | + // TODO: Make sa function. | ||
| 241 | + socklen_t socklen = sizeof(sockaddr_in6); | ||
| 242 | + | ||
| 243 | + auto sa = sin6_make(); | ||
| 244 | + | ||
| 245 | + if (::getsockname(fd, reinterpret_cast<sockaddr*>(sa.get()), &socklen) != 0) { | ||
| 246 | + LT_LOG_FD_ERROR("detect_local_sin6_addr: getsockname failed"); | ||
| 247 | + return sin6_unique_ptr(); | ||
| 248 | + } | ||
| 249 | + if (socklen != sizeof(sockaddr_in6)) { | ||
| 250 | + LT_LOG_FD("detect_local_sin6_addr: getsockname failed, invalid socklen"); | ||
| 251 | + return sin6_unique_ptr(); | ||
| 252 | + } | ||
| 253 | + | ||
| 254 | + LT_LOG_FD_SIN6("detect_local_sin6_addr: success"); | ||
| 255 | + | ||
| 256 | + return sa; | ||
| 257 | +} | ||
| 258 | + | ||
| 259 | +} | ||
| 260 | diff --git a/src/torrent/net/utils.h b/src/torrent/net/utils.h | ||
| 261 | new file mode 100755 | ||
| 262 | index 00000000..1d550c51 | ||
| 263 | --- /dev/null | ||
| 264 | +++ b/src/torrent/net/utils.h | ||
| 265 | @@ -0,0 +1,9 @@ | ||
| 266 | +#import <torrent/common.h> | ||
| 267 | +#import <torrent/net/socket_address.h> | ||
| 268 | + | ||
| 269 | +namespace torrent { | ||
| 270 | + | ||
| 271 | +auto detect_local_sin_addr() -> sin_unique_ptr; | ||
| 272 | +auto detect_local_sin6_addr() -> sin6_unique_ptr; | ||
| 273 | + | ||
| 274 | +} | ||
| 275 | diff --git a/src/tracker/tracker_http.cc b/src/tracker/tracker_http.cc | ||
| 276 | index 1bf94107..de3a39ab 100644 | ||
| 277 | --- a/src/tracker/tracker_http.cc | ||
| 278 | +++ b/src/tracker/tracker_http.cc | ||
| 279 | @@ -1,63 +1,29 @@ | ||
| 280 | -// libTorrent - BitTorrent library | ||
| 281 | -// Copyright (C) 2005-2011, Jari Sundell | ||
| 282 | -// | ||
| 283 | -// This program is free software; you can redistribute it and/or modify | ||
| 284 | -// it under the terms of the GNU General Public License as published by | ||
| 285 | -// the Free Software Foundation; either version 2 of the License, or | ||
| 286 | -// (at your option) any later version. | ||
| 287 | -// | ||
| 288 | -// This program is distributed in the hope that it will be useful, | ||
| 289 | -// but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
| 290 | -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
| 291 | -// GNU General Public License for more details. | ||
| 292 | -// | ||
| 293 | -// You should have received a copy of the GNU General Public License | ||
| 294 | -// along with this program; if not, write to the Free Software | ||
| 295 | -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | ||
| 296 | -// | ||
| 297 | -// In addition, as a special exception, the copyright holders give | ||
| 298 | -// permission to link the code of portions of this program with the | ||
| 299 | -// OpenSSL library under certain conditions as described in each | ||
| 300 | -// individual source file, and distribute linked combinations | ||
| 301 | -// including the two. | ||
| 302 | -// | ||
| 303 | -// You must obey the GNU General Public License in all respects for | ||
| 304 | -// all of the code used other than OpenSSL. If you modify file(s) | ||
| 305 | -// with this exception, you may extend this exception to your version | ||
| 306 | -// of the file(s), but you are not obligated to do so. If you do not | ||
| 307 | -// wish to do so, delete this exception statement from your version. | ||
| 308 | -// If you delete this exception statement from all source files in the | ||
| 309 | -// program, then also delete it here. | ||
| 310 | -// | ||
| 311 | -// Contact: Jari Sundell <jaris@ifi.uio.no> | ||
| 312 | -// | ||
| 313 | -// Skomakerveien 33 | ||
| 314 | -// 3185 Skoppum, NORWAY | ||
| 315 | - | ||
| 316 | -#include "config.h" | ||
| 317 | +#import "config.h" | ||
| 318 | |||
| 319 | #define __STDC_FORMAT_MACROS | ||
| 320 | |||
| 321 | -#include <iomanip> | ||
| 322 | -#include <sstream> | ||
| 323 | -#include <rak/functional.h> | ||
| 324 | -#include <rak/string_manip.h> | ||
| 325 | - | ||
| 326 | -#include "net/address_list.h" | ||
| 327 | -#include "net/local_addr.h" | ||
| 328 | -#include "torrent/connection_manager.h" | ||
| 329 | -#include "torrent/download_info.h" | ||
| 330 | -#include "torrent/exceptions.h" | ||
| 331 | -#include "torrent/http.h" | ||
| 332 | -#include "torrent/object_stream.h" | ||
| 333 | -#include "torrent/tracker_list.h" | ||
| 334 | -#include "torrent/utils/log.h" | ||
| 335 | -#include "torrent/utils/option_strings.h" | ||
| 336 | - | ||
| 337 | -#include "tracker_http.h" | ||
| 338 | - | ||
| 339 | -#include "globals.h" | ||
| 340 | -#include "manager.h" | ||
| 341 | +#import <iomanip> | ||
| 342 | +#import <sstream> | ||
| 343 | +#import <rak/functional.h> | ||
| 344 | +#import <rak/string_manip.h> | ||
| 345 | + | ||
| 346 | +#import "net/address_list.h" | ||
| 347 | +#import "net/local_addr.h" | ||
| 348 | +#import "torrent/connection_manager.h" | ||
| 349 | +#import "torrent/download_info.h" | ||
| 350 | +#import "torrent/exceptions.h" | ||
| 351 | +#import "torrent/http.h" | ||
| 352 | +#import "torrent/net/utils.h" | ||
| 353 | +#import "torrent/net/socket_address.h" | ||
| 354 | +#import "torrent/object_stream.h" | ||
| 355 | +#import "torrent/tracker_list.h" | ||
| 356 | +#import "torrent/utils/log.h" | ||
| 357 | +#import "torrent/utils/option_strings.h" | ||
| 358 | + | ||
| 359 | +#import "tracker_http.h" | ||
| 360 | + | ||
| 361 | +#import "globals.h" | ||
| 362 | +#import "manager.h" | ||
| 363 | |||
| 364 | #define LT_LOG_TRACKER(log_level, log_fmt, ...) \ | ||
| 365 | lt_log_print_info(LOG_TRACKER_##log_level, m_parent->info(), "tracker", "[%u] " log_fmt, group(), __VA_ARGS__); | ||
| 366 | @@ -142,19 +108,19 @@ TrackerHttp::send_state(int state) { | ||
| 367 | |||
| 368 | const rak::socket_address* localAddress = rak::socket_address::cast_from(manager->connection_manager()->local_address()); | ||
| 369 | |||
| 370 | - if (!localAddress->is_address_any()) | ||
| 371 | - s << "&ip=" << localAddress->address_str(); | ||
| 372 | - | ||
| 373 | - if (localAddress->is_address_any() && localAddress->family() == rak::socket_address::pf_inet) { | ||
| 374 | - rak::socket_address local_v6; | ||
| 375 | - if (get_local_address(rak::socket_address::af_inet6, &local_v6)) | ||
| 376 | - s << "&ipv6=" << rak::copy_escape_html(local_v6.address_str()); | ||
| 377 | - } | ||
| 378 | + if (localAddress->is_address_any()) { | ||
| 379 | + auto ipv4_address = detect_local_sin_addr(); | ||
| 380 | + auto ipv6_address = detect_local_sin6_addr(); | ||
| 381 | |||
| 382 | - if (localAddress->is_address_any() && localAddress->family() == rak::socket_address::pf_inet6) { | ||
| 383 | - rak::socket_address local_v4; | ||
| 384 | - if (get_local_address(rak::socket_address::af_inet, &local_v4)) | ||
| 385 | - s << "&ipv4=" << local_v4.address_str(); | ||
| 386 | + if (ipv4_address != nullptr) { | ||
| 387 | + s << "&ipv4=" << sin_addr_str(ipv4_address.get()); | ||
| 388 | + } | ||
| 389 | + if (ipv6_address != nullptr) { | ||
| 390 | + s << "&ipv6=" << sin6_addr_str(ipv6_address.get()); | ||
| 391 | + } | ||
| 392 | + | ||
| 393 | + } else { | ||
| 394 | + s << "&ip=" << localAddress->address_str(); | ||
| 395 | } | ||
| 396 | |||
| 397 | if (info->is_compact()) | ||
| 398 | diff --git a/test/helpers/network.h b/test/helpers/network.h | ||
| 399 | index 6cf2f870..eb188426 100644 | ||
| 400 | --- a/test/helpers/network.h | ||
| 401 | +++ b/test/helpers/network.h | ||
| 402 | @@ -112,6 +112,7 @@ wrap_ai_get_first_sa(const char* nodename, const char* servname = nullptr, const | ||
| 403 | |||
| 404 | CPPUNIT_ASSERT_MESSAGE(("wrap_ai_get_first_sa: nodename:'" + std::string(nodename) + "'").c_str(), | ||
| 405 | sa != nullptr); | ||
| 406 | + | ||
| 407 | return sa; | ||
| 408 | } | ||
| 409 | |||
| 410 | @@ -121,6 +122,7 @@ wrap_ai_get_first_c_sa(const char* nodename, const char* servname = nullptr, con | ||
| 411 | |||
| 412 | CPPUNIT_ASSERT_MESSAGE(("wrap_ai_get_first_sa: nodename:'" + std::string(nodename) + "'").c_str(), | ||
| 413 | sa != nullptr); | ||
| 414 | + | ||
| 415 | return torrent::c_sa_unique_ptr(sa.release()); | ||
| 416 | } | ||
| 417 | |||
| 418 | diff --git a/test/torrent/net/test_fd.cc b/test/torrent/net/test_fd.cc | ||
| 419 | index 5e56f0f3..0a00ccd4 100644 | ||
| 420 | --- a/test/torrent/net/test_fd.cc | ||
| 421 | +++ b/test/torrent/net/test_fd.cc | ||
| 422 | @@ -9,13 +9,22 @@ CPPUNIT_TEST_SUITE_NAMED_REGISTRATION(test_fd, "torrent/net"); | ||
| 423 | void | ||
| 424 | test_fd::test_valid_flags() { | ||
| 425 | CPPUNIT_ASSERT(torrent::fd_valid_flags(torrent::fd_flag_stream)); | ||
| 426 | + CPPUNIT_ASSERT(torrent::fd_valid_flags(torrent::fd_flag_datagram)); | ||
| 427 | + CPPUNIT_ASSERT(!torrent::fd_valid_flags(torrent::fd_flag_stream | torrent::fd_flag_datagram)); | ||
| 428 | + | ||
| 429 | CPPUNIT_ASSERT(torrent::fd_valid_flags(torrent::fd_flag_stream | torrent::fd_flag_nonblock)); | ||
| 430 | CPPUNIT_ASSERT(torrent::fd_valid_flags(torrent::fd_flag_stream | torrent::fd_flag_reuse_address)); | ||
| 431 | CPPUNIT_ASSERT(torrent::fd_valid_flags(torrent::fd_flag_stream | torrent::fd_flag_v4only)); | ||
| 432 | CPPUNIT_ASSERT(torrent::fd_valid_flags(torrent::fd_flag_stream | torrent::fd_flag_v6only)); | ||
| 433 | |||
| 434 | + CPPUNIT_ASSERT(torrent::fd_valid_flags(torrent::fd_flag_datagram | torrent::fd_flag_nonblock)); | ||
| 435 | + CPPUNIT_ASSERT(torrent::fd_valid_flags(torrent::fd_flag_datagram | torrent::fd_flag_reuse_address)); | ||
| 436 | + CPPUNIT_ASSERT(torrent::fd_valid_flags(torrent::fd_flag_datagram | torrent::fd_flag_v4only)); | ||
| 437 | + CPPUNIT_ASSERT(torrent::fd_valid_flags(torrent::fd_flag_datagram | torrent::fd_flag_v6only)); | ||
| 438 | + | ||
| 439 | CPPUNIT_ASSERT(!torrent::fd_valid_flags(torrent::fd_flag_v4only | torrent::fd_flag_v6only)); | ||
| 440 | CPPUNIT_ASSERT(!torrent::fd_valid_flags(torrent::fd_flag_stream | torrent::fd_flag_v4only | torrent::fd_flag_v6only)); | ||
| 441 | + CPPUNIT_ASSERT(!torrent::fd_valid_flags(torrent::fd_flag_datagram | torrent::fd_flag_v4only | torrent::fd_flag_v6only)); | ||
| 442 | |||
| 443 | CPPUNIT_ASSERT(!torrent::fd_valid_flags(torrent::fd_flags())); | ||
| 444 | CPPUNIT_ASSERT(!torrent::fd_valid_flags(torrent::fd_flags(~torrent::fd_flag_all))); | ||
| 445 | diff --git a/test/torrent/net/test_socket_address.cc b/test/torrent/net/test_socket_address.cc | ||
| 446 | index 8a1b0c8a..a27b38bc 100644 | ||
| 447 | --- a/test/torrent/net/test_socket_address.cc | ||
| 448 | +++ b/test/torrent/net/test_socket_address.cc | ||
| 449 | @@ -83,7 +83,7 @@ test_socket_address::test_make() { | ||
| 450 | CPPUNIT_ASSERT(sin6_inet6->sin6_family == AF_INET6); | ||
| 451 | CPPUNIT_ASSERT(sin6_inet6->sin6_port == 0); | ||
| 452 | CPPUNIT_ASSERT(sin6_inet6->sin6_flowinfo == 0); | ||
| 453 | - CPPUNIT_ASSERT(compare_sin6_addr(sin6_inet6->sin6_addr, in6_addr{0})); | ||
| 454 | + CPPUNIT_ASSERT(compare_sin6_addr(sin6_inet6->sin6_addr, (in6_addr{0}))); | ||
| 455 | CPPUNIT_ASSERT(sin6_inet6->sin6_scope_id == 0); | ||
| 456 | |||
| 457 | torrent::sa_unique_ptr sa_unix = torrent::sa_make_unix(""); | ||
diff --git a/meta-oe/recipes-connectivity/libtorrent/libtorrent/0041-Added-ipv6-options.patch b/meta-oe/recipes-connectivity/libtorrent/libtorrent/0041-Added-ipv6-options.patch new file mode 100644 index 0000000000..923f5c97cd --- /dev/null +++ b/meta-oe/recipes-connectivity/libtorrent/libtorrent/0041-Added-ipv6-options.patch | |||
| @@ -0,0 +1,85 @@ | |||
| 1 | From e646ed5427b690b75208510d328457af66b208e8 Mon Sep 17 00:00:00 2001 | ||
| 2 | From: rakshasa <sundell.software@gmail.com> | ||
| 3 | Date: Mon, 21 Jun 2021 21:12:56 +0900 | ||
| 4 | Subject: [PATCH] Added ipv6 options. | ||
| 5 | |||
| 6 | --- | ||
| 7 | src/torrent/connection_manager.cc | 6 +++++- | ||
| 8 | src/torrent/connection_manager.h | 13 +++++++++++++ | ||
| 9 | src/tracker/tracker_http.cc | 13 +++++-------- | ||
| 10 | 3 files changed, 23 insertions(+), 9 deletions(-) | ||
| 11 | |||
| 12 | diff --git a/src/torrent/connection_manager.cc b/src/torrent/connection_manager.cc | ||
| 13 | index 972dcbfc..ea5efc58 100644 | ||
| 14 | --- a/src/torrent/connection_manager.cc | ||
| 15 | +++ b/src/torrent/connection_manager.cc | ||
| 16 | @@ -89,7 +89,11 @@ ConnectionManager::ConnectionManager() : | ||
| 17 | |||
| 18 | m_listen(new Listen), | ||
| 19 | m_listen_port(0), | ||
| 20 | - m_listen_backlog(SOMAXCONN) { | ||
| 21 | + m_listen_backlog(SOMAXCONN), | ||
| 22 | + | ||
| 23 | + m_block_ipv4(false), | ||
| 24 | + m_block_ipv6(false), | ||
| 25 | + m_prefer_ipv6(false) { | ||
| 26 | |||
| 27 | m_bindAddress = (new rak::socket_address())->c_sockaddr(); | ||
| 28 | m_localAddress = (new rak::socket_address())->c_sockaddr(); | ||
| 29 | diff --git a/src/torrent/connection_manager.h b/src/torrent/connection_manager.h | ||
| 30 | index cf43b0bf..09ccdd28 100644 | ||
| 31 | --- a/src/torrent/connection_manager.h | ||
| 32 | +++ b/src/torrent/connection_manager.h | ||
| 33 | @@ -167,6 +167,15 @@ public: | ||
| 34 | // For internal usage. | ||
| 35 | Listen* listen() { return m_listen; } | ||
| 36 | |||
| 37 | + bool is_block_ipv4() const { return m_block_ipv4; } | ||
| 38 | + void set_block_ipv4(bool v) { m_block_ipv4 = v; } | ||
| 39 | + | ||
| 40 | + bool is_block_ipv6() const { return m_block_ipv6; } | ||
| 41 | + void set_block_ipv6(bool v) { m_block_ipv6 = v; } | ||
| 42 | + | ||
| 43 | + bool is_prefer_ipv6() const { return m_prefer_ipv6; } | ||
| 44 | + void set_prefer_ipv6(bool v) { m_prefer_ipv6 = v; } | ||
| 45 | + | ||
| 46 | private: | ||
| 47 | ConnectionManager(const ConnectionManager&); | ||
| 48 | void operator = (const ConnectionManager&); | ||
| 49 | @@ -190,6 +199,10 @@ private: | ||
| 50 | slot_filter_type m_slot_filter; | ||
| 51 | slot_resolver_type m_slot_resolver; | ||
| 52 | slot_throttle_type m_slot_address_throttle; | ||
| 53 | + | ||
| 54 | + bool m_block_ipv4; | ||
| 55 | + bool m_block_ipv6; | ||
| 56 | + bool m_prefer_ipv6; | ||
| 57 | }; | ||
| 58 | |||
| 59 | } | ||
| 60 | diff --git a/src/tracker/tracker_http.cc b/src/tracker/tracker_http.cc | ||
| 61 | index de3a39ab..fdbbd58a 100644 | ||
| 62 | --- a/src/tracker/tracker_http.cc | ||
| 63 | +++ b/src/tracker/tracker_http.cc | ||
| 64 | @@ -109,16 +109,13 @@ TrackerHttp::send_state(int state) { | ||
| 65 | const rak::socket_address* localAddress = rak::socket_address::cast_from(manager->connection_manager()->local_address()); | ||
| 66 | |||
| 67 | if (localAddress->is_address_any()) { | ||
| 68 | - auto ipv4_address = detect_local_sin_addr(); | ||
| 69 | - auto ipv6_address = detect_local_sin6_addr(); | ||
| 70 | + if (manager->connection_manager()->is_prefer_ipv6()) { | ||
| 71 | + auto ipv6_address = detect_local_sin6_addr(); | ||
| 72 | |||
| 73 | - if (ipv4_address != nullptr) { | ||
| 74 | - s << "&ipv4=" << sin_addr_str(ipv4_address.get()); | ||
| 75 | + if (ipv6_address != nullptr) { | ||
| 76 | + s << "&ip=" << sin6_addr_str(ipv6_address.get()); | ||
| 77 | + } | ||
| 78 | } | ||
| 79 | - if (ipv6_address != nullptr) { | ||
| 80 | - s << "&ipv6=" << sin6_addr_str(ipv6_address.get()); | ||
| 81 | - } | ||
| 82 | - | ||
| 83 | } else { | ||
| 84 | s << "&ip=" << localAddress->address_str(); | ||
| 85 | } | ||
diff --git a/meta-oe/recipes-connectivity/libtorrent/libtorrent/0042-Removed-obsolete-files.patch b/meta-oe/recipes-connectivity/libtorrent/libtorrent/0042-Removed-obsolete-files.patch new file mode 100644 index 0000000000..383984179d --- /dev/null +++ b/meta-oe/recipes-connectivity/libtorrent/libtorrent/0042-Removed-obsolete-files.patch | |||
| @@ -0,0 +1,444 @@ | |||
| 1 | From 54caef85baca975e0be30b4f3f6de01db19c8e19 Mon Sep 17 00:00:00 2001 | ||
| 2 | From: rakshasa <sundell.software@gmail.com> | ||
| 3 | Date: Mon, 21 Jun 2021 21:28:02 +0900 | ||
| 4 | Subject: [PATCH] Removed obsolete files. | ||
| 5 | |||
| 6 | --- | ||
| 7 | src/Makefile.am | 2 - | ||
| 8 | src/net/local_addr.cc | 329 ------------------------------------ | ||
| 9 | src/net/local_addr.h | 64 ------- | ||
| 10 | src/tracker/tracker_http.cc | 1 - | ||
| 11 | 4 files changed, 396 deletions(-) | ||
| 12 | delete mode 100644 src/net/local_addr.cc | ||
| 13 | delete mode 100644 src/net/local_addr.h | ||
| 14 | |||
| 15 | diff --git a/src/Makefile.am b/src/Makefile.am | ||
| 16 | index 95e6a7ae..925e7e15 100644 | ||
| 17 | --- a/src/Makefile.am | ||
| 18 | +++ b/src/Makefile.am | ||
| 19 | @@ -76,8 +76,6 @@ libtorrent_other_la_SOURCES = \ | ||
| 20 | net/address_list.cc \ | ||
| 21 | net/address_list.h \ | ||
| 22 | net/data_buffer.h \ | ||
| 23 | - net/local_addr.cc \ | ||
| 24 | - net/local_addr.h \ | ||
| 25 | net/listen.cc \ | ||
| 26 | net/listen.h \ | ||
| 27 | net/protocol_buffer.h \ | ||
| 28 | diff --git a/src/net/local_addr.cc b/src/net/local_addr.cc | ||
| 29 | deleted file mode 100644 | ||
| 30 | index 0c7116cb..00000000 | ||
| 31 | --- a/src/net/local_addr.cc | ||
| 32 | +++ /dev/null | ||
| 33 | @@ -1,329 +0,0 @@ | ||
| 34 | -// libTorrent - BitTorrent library | ||
| 35 | -// Copyright (C) 2005-2007, Jari Sundell | ||
| 36 | -// | ||
| 37 | -// This program is free software; you can redistribute it and/or modify | ||
| 38 | -// it under the terms of the GNU General Public License as published by | ||
| 39 | -// the Free Software Foundation; either version 2 of the License, or | ||
| 40 | -// (at your option) any later version. | ||
| 41 | -// | ||
| 42 | -// This program is distributed in the hope that it will be useful, | ||
| 43 | -// but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
| 44 | -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
| 45 | -// GNU General Public License for more details. | ||
| 46 | -// | ||
| 47 | -// You should have received a copy of the GNU General Public License | ||
| 48 | -// along with this program; if not, write to the Free Software | ||
| 49 | -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | ||
| 50 | -// | ||
| 51 | -// In addition, as a special exception, the copyright holders give | ||
| 52 | -// permission to link the code of portions of this program with the | ||
| 53 | -// OpenSSL library under certain conditions as described in each | ||
| 54 | -// individual source file, and distribute linked combinations | ||
| 55 | -// including the two. | ||
| 56 | -// | ||
| 57 | -// You must obey the GNU General Public License in all respects for | ||
| 58 | -// all of the code used other than OpenSSL. If you modify file(s) | ||
| 59 | -// with this exception, you may extend this exception to your version | ||
| 60 | -// of the file(s), but you are not obligated to do so. If you do not | ||
| 61 | -// wish to do so, delete this exception statement from your version. | ||
| 62 | -// If you delete this exception statement from all source files in the | ||
| 63 | -// program, then also delete it here. | ||
| 64 | -// | ||
| 65 | -// Contact: Jari Sundell <jaris@ifi.uio.no> | ||
| 66 | -// | ||
| 67 | -// Skomakerveien 33 | ||
| 68 | -// 3185 Skoppum, NORWAY | ||
| 69 | - | ||
| 70 | -// TODO: Remove. | ||
| 71 | - | ||
| 72 | -#include "config.h" | ||
| 73 | - | ||
| 74 | -#include <stdio.h> | ||
| 75 | -#include <rak/socket_address.h> | ||
| 76 | -#include <sys/types.h> | ||
| 77 | -#include <errno.h> | ||
| 78 | - | ||
| 79 | -#ifdef __linux__ | ||
| 80 | -#include <linux/netlink.h> | ||
| 81 | -#include <linux/rtnetlink.h> | ||
| 82 | -#endif | ||
| 83 | - | ||
| 84 | -#include "torrent/exceptions.h" | ||
| 85 | -#include "socket_fd.h" | ||
| 86 | -#include "local_addr.h" | ||
| 87 | - | ||
| 88 | -namespace torrent { | ||
| 89 | - | ||
| 90 | -#ifdef __linux__ | ||
| 91 | - | ||
| 92 | -namespace { | ||
| 93 | - | ||
| 94 | -// IPv4 priority, from highest to lowest: | ||
| 95 | -// | ||
| 96 | -// 1. Everything else (global address) | ||
| 97 | -// 2. Private address space (10.0.0.0/8, 172.16.0.0/12, 192.168.0.0/16) | ||
| 98 | -// 3. Empty/INADDR_ANY (0.0.0.0) | ||
| 99 | -// 4. Link-local address (169.254.0.0/16) | ||
| 100 | -// 5. Localhost (127.0.0.0/8) | ||
| 101 | -int | ||
| 102 | -get_priority_ipv4(const in_addr& addr) { | ||
| 103 | - if ((addr.s_addr & htonl(0xff000000U)) == htonl(0x7f000000U)) { | ||
| 104 | - return 5; | ||
| 105 | - } | ||
| 106 | - if ((addr.s_addr & htonl(0xffff0000U)) == htonl(0xa9fe0000U)) { | ||
| 107 | - return 4; | ||
| 108 | - } | ||
| 109 | - if (addr.s_addr == htonl(0)) { | ||
| 110 | - return 3; | ||
| 111 | - } | ||
| 112 | - if ((addr.s_addr & htonl(0xff000000U)) == htonl(0x0a000000U) || | ||
| 113 | - (addr.s_addr & htonl(0xfff00000U)) == htonl(0xac100000U) || | ||
| 114 | - (addr.s_addr & htonl(0xffff0000U)) == htonl(0xc0a80000U)) { | ||
| 115 | - return 2; | ||
| 116 | - } | ||
| 117 | - return 1; | ||
| 118 | -} | ||
| 119 | - | ||
| 120 | -// IPv6 priority, from highest to lowest: | ||
| 121 | -// | ||
| 122 | -// 1. Global address (2000::/16 not in 6to4 or Teredo) | ||
| 123 | -// 2. 6to4 (2002::/16) | ||
| 124 | -// 3. Teredo (2001::/32) | ||
| 125 | -// 4. Empty/INADDR_ANY (::) | ||
| 126 | -// 5. Everything else (link-local, ULA, etc.) | ||
| 127 | -int | ||
| 128 | -get_priority_ipv6(const in6_addr& addr) { | ||
| 129 | - const uint32_t *addr32 = reinterpret_cast<const uint32_t *>(addr.s6_addr); | ||
| 130 | - if (addr32[0] == htonl(0) && | ||
| 131 | - addr32[1] == htonl(0) && | ||
| 132 | - addr32[2] == htonl(0) && | ||
| 133 | - addr32[3] == htonl(0)) { | ||
| 134 | - return 4; | ||
| 135 | - } | ||
| 136 | - if (addr32[0] == htonl(0x20010000)) { | ||
| 137 | - return 3; | ||
| 138 | - } | ||
| 139 | - if ((addr32[0] & htonl(0xffff0000)) == htonl(0x20020000)) { | ||
| 140 | - return 2; | ||
| 141 | - } | ||
| 142 | - if ((addr32[0] & htonl(0xe0000000)) == htonl(0x20000000)) { | ||
| 143 | - return 1; | ||
| 144 | - } | ||
| 145 | - return 5; | ||
| 146 | -} | ||
| 147 | - | ||
| 148 | -int | ||
| 149 | -get_priority(const rak::socket_address& addr) { | ||
| 150 | - switch (addr.family()) { | ||
| 151 | - case AF_INET: | ||
| 152 | - return get_priority_ipv4(addr.c_sockaddr_inet()->sin_addr); | ||
| 153 | - case AF_INET6: | ||
| 154 | - return get_priority_ipv6(addr.c_sockaddr_inet6()->sin6_addr); | ||
| 155 | - default: | ||
| 156 | - throw torrent::internal_error("Unknown address family given to compare"); | ||
| 157 | - } | ||
| 158 | -} | ||
| 159 | - | ||
| 160 | -} | ||
| 161 | - | ||
| 162 | -// Linux-specific implementation that understands how to filter away | ||
| 163 | -// understands how to filter away secondary addresses. | ||
| 164 | -bool get_local_address(sa_family_t family, rak::socket_address *address) { | ||
| 165 | - rak::socket_address best_addr; | ||
| 166 | - switch (family) { | ||
| 167 | - case AF_INET: | ||
| 168 | - best_addr.sa_inet()->clear(); | ||
| 169 | - break; | ||
| 170 | - case AF_INET6: | ||
| 171 | - best_addr.sa_inet6()->clear(); | ||
| 172 | - break; | ||
| 173 | - default: | ||
| 174 | - throw torrent::internal_error("Unknown address family given to get_local_address"); | ||
| 175 | - } | ||
| 176 | - | ||
| 177 | - // The bottom bit of the priority is used to hold if the address is | ||
| 178 | - // a secondary address (e.g. with IPv6 privacy extensions) or not; | ||
| 179 | - // secondary addresses have lower priority (higher number). | ||
| 180 | - int best_addr_pri = get_priority(best_addr) * 2; | ||
| 181 | - | ||
| 182 | - // Get all the addresses via Linux' netlink interface. | ||
| 183 | - int fd = ::socket(PF_NETLINK, SOCK_RAW, NETLINK_ROUTE); | ||
| 184 | - if (fd == -1) { | ||
| 185 | - return false; | ||
| 186 | - } | ||
| 187 | - | ||
| 188 | - struct sockaddr_nl nladdr; | ||
| 189 | - memset(&nladdr, 0, sizeof(nladdr)); | ||
| 190 | - nladdr.nl_family = AF_NETLINK; | ||
| 191 | - if (::bind(fd, (sockaddr *)&nladdr, sizeof(nladdr))) { | ||
| 192 | - ::close(fd); | ||
| 193 | - return false; | ||
| 194 | - } | ||
| 195 | - | ||
| 196 | - const int seq_no = 1; | ||
| 197 | - struct { | ||
| 198 | - nlmsghdr nh; | ||
| 199 | - rtgenmsg g; | ||
| 200 | - } req; | ||
| 201 | - memset(&req, 0, sizeof(req)); | ||
| 202 | - | ||
| 203 | - req.nh.nlmsg_len = sizeof(req); | ||
| 204 | - req.nh.nlmsg_type = RTM_GETADDR; | ||
| 205 | - req.nh.nlmsg_flags = NLM_F_ROOT | NLM_F_MATCH | NLM_F_REQUEST; | ||
| 206 | - req.nh.nlmsg_pid = getpid(); | ||
| 207 | - req.nh.nlmsg_seq = seq_no; | ||
| 208 | - req.g.rtgen_family = AF_UNSPEC; | ||
| 209 | - | ||
| 210 | - int ret; | ||
| 211 | - do { | ||
| 212 | - ret = ::sendto(fd, &req, sizeof(req), 0, (sockaddr *)&nladdr, sizeof(nladdr)); | ||
| 213 | - } while (ret == -1 && errno == EINTR); | ||
| 214 | - | ||
| 215 | - if (ret == -1) { | ||
| 216 | - ::close(fd); | ||
| 217 | - return false; | ||
| 218 | - } | ||
| 219 | - | ||
| 220 | - bool done = false; | ||
| 221 | - do { | ||
| 222 | - char buf[4096]; | ||
| 223 | - socklen_t len = sizeof(nladdr); | ||
| 224 | - do { | ||
| 225 | - ret = ::recvfrom(fd, buf, sizeof(buf), 0, (sockaddr *)&nladdr, &len); | ||
| 226 | - } while (ret == -1 && errno == EINTR); | ||
| 227 | - | ||
| 228 | - if (ret < 0) { | ||
| 229 | - ::close(fd); | ||
| 230 | - return false; | ||
| 231 | - } | ||
| 232 | - | ||
| 233 | - for (const nlmsghdr *nlmsg = (const nlmsghdr *)buf; | ||
| 234 | - NLMSG_OK(nlmsg, ret); | ||
| 235 | - nlmsg = NLMSG_NEXT(nlmsg, ret)) { | ||
| 236 | - if (nlmsg->nlmsg_seq != seq_no) | ||
| 237 | - continue; | ||
| 238 | - if (nlmsg->nlmsg_type == NLMSG_DONE) { | ||
| 239 | - done = true; | ||
| 240 | - break; | ||
| 241 | - } | ||
| 242 | - if (nlmsg->nlmsg_type == NLMSG_ERROR) { | ||
| 243 | - ::close(fd); | ||
| 244 | - return false; | ||
| 245 | - } | ||
| 246 | - if (nlmsg->nlmsg_type != RTM_NEWADDR) | ||
| 247 | - continue; | ||
| 248 | - | ||
| 249 | - const ifaddrmsg *ifa = (const ifaddrmsg *)NLMSG_DATA(nlmsg); | ||
| 250 | - | ||
| 251 | - if (ifa->ifa_family != family) | ||
| 252 | - continue; | ||
| 253 | - | ||
| 254 | -#ifdef IFA_F_OPTIMISTIC | ||
| 255 | - if ((ifa->ifa_flags & IFA_F_OPTIMISTIC) != 0) | ||
| 256 | - continue; | ||
| 257 | -#endif | ||
| 258 | -#ifdef IFA_F_DADFAILED | ||
| 259 | - if ((ifa->ifa_flags & IFA_F_DADFAILED) != 0) | ||
| 260 | - continue; | ||
| 261 | -#endif | ||
| 262 | -#ifdef IFA_F_DEPRECATED | ||
| 263 | - if ((ifa->ifa_flags & IFA_F_DEPRECATED) != 0) | ||
| 264 | - continue; | ||
| 265 | -#endif | ||
| 266 | -#ifdef IFA_F_TENTATIVE | ||
| 267 | - if ((ifa->ifa_flags & IFA_F_TENTATIVE) != 0) | ||
| 268 | - continue; | ||
| 269 | -#endif | ||
| 270 | - | ||
| 271 | - // Since there can be point-to-point links on the machine, we need to keep | ||
| 272 | - // track of the addresses we've seen for this interface; if we see both | ||
| 273 | - // IFA_LOCAL and IFA_ADDRESS for an interface, keep only the IFA_LOCAL. | ||
| 274 | - rak::socket_address this_addr; | ||
| 275 | - bool seen_addr = false; | ||
| 276 | - int plen = IFA_PAYLOAD(nlmsg); | ||
| 277 | - for (const rtattr *rta = IFA_RTA(ifa); | ||
| 278 | - RTA_OK(rta, plen); | ||
| 279 | - rta = RTA_NEXT(rta, plen)) { | ||
| 280 | - if (rta->rta_type != IFA_LOCAL && | ||
| 281 | - rta->rta_type != IFA_ADDRESS) { | ||
| 282 | - continue; | ||
| 283 | - } | ||
| 284 | - if (rta->rta_type == IFA_ADDRESS && seen_addr) { | ||
| 285 | - continue; | ||
| 286 | - } | ||
| 287 | - seen_addr = true; | ||
| 288 | - switch (ifa->ifa_family) { | ||
| 289 | - case AF_INET: | ||
| 290 | - this_addr.sa_inet()->clear(); | ||
| 291 | - this_addr.sa_inet()->set_address(*(const in_addr *)RTA_DATA(rta)); | ||
| 292 | - break; | ||
| 293 | - case AF_INET6: | ||
| 294 | - this_addr.sa_inet6()->clear(); | ||
| 295 | - this_addr.sa_inet6()->set_address(*(const in6_addr *)RTA_DATA(rta)); | ||
| 296 | - break; | ||
| 297 | - } | ||
| 298 | - } | ||
| 299 | - if (!seen_addr) | ||
| 300 | - continue; | ||
| 301 | - | ||
| 302 | - int this_addr_pri = get_priority(this_addr) * 2; | ||
| 303 | - if ((ifa->ifa_flags & IFA_F_SECONDARY) == IFA_F_SECONDARY) { | ||
| 304 | - ++this_addr_pri; | ||
| 305 | - } | ||
| 306 | - | ||
| 307 | - if (this_addr_pri < best_addr_pri) { | ||
| 308 | - best_addr = this_addr; | ||
| 309 | - best_addr_pri = this_addr_pri; | ||
| 310 | - } | ||
| 311 | - } | ||
| 312 | - } while (!done); | ||
| 313 | - | ||
| 314 | - ::close(fd); | ||
| 315 | - if (!best_addr.is_address_any()) { | ||
| 316 | - *address = best_addr; | ||
| 317 | - return true; | ||
| 318 | - } else { | ||
| 319 | - return false; | ||
| 320 | - } | ||
| 321 | -} | ||
| 322 | - | ||
| 323 | -#else | ||
| 324 | - | ||
| 325 | -// Generic POSIX variant. | ||
| 326 | -bool | ||
| 327 | -get_local_address(sa_family_t family, rak::socket_address *address) { | ||
| 328 | - SocketFd sock; | ||
| 329 | - if (!sock.open_datagram()) { | ||
| 330 | - return false; | ||
| 331 | - } | ||
| 332 | - | ||
| 333 | - rak::socket_address dummy_dest; | ||
| 334 | - dummy_dest.clear(); | ||
| 335 | - | ||
| 336 | - switch (family) { | ||
| 337 | - case rak::socket_address::af_inet: | ||
| 338 | - dummy_dest.set_address_c_str("4.0.0.0"); | ||
| 339 | - break; | ||
| 340 | - case rak::socket_address::af_inet6: | ||
| 341 | - dummy_dest.set_address_c_str("2001:1::"); | ||
| 342 | - break; | ||
| 343 | - default: | ||
| 344 | - throw internal_error("Unknown address family"); | ||
| 345 | - } | ||
| 346 | - | ||
| 347 | - dummy_dest.set_port(80); | ||
| 348 | - | ||
| 349 | - if (!sock.connect(dummy_dest)) { | ||
| 350 | - sock.close(); | ||
| 351 | - return false; | ||
| 352 | - } | ||
| 353 | - | ||
| 354 | - bool ret = sock.getsockname(address); | ||
| 355 | - sock.close(); | ||
| 356 | - | ||
| 357 | - return ret; | ||
| 358 | -} | ||
| 359 | - | ||
| 360 | -#endif | ||
| 361 | - | ||
| 362 | -} | ||
| 363 | diff --git a/src/net/local_addr.h b/src/net/local_addr.h | ||
| 364 | deleted file mode 100644 | ||
| 365 | index 43bc8206..00000000 | ||
| 366 | --- a/src/net/local_addr.h | ||
| 367 | +++ /dev/null | ||
| 368 | @@ -1,64 +0,0 @@ | ||
| 369 | -// libTorrent - BitTorrent library | ||
| 370 | -// Copyright (C) 2005-2007, Jari Sundell | ||
| 371 | -// | ||
| 372 | -// This program is free software; you can redistribute it and/or modify | ||
| 373 | -// it under the terms of the GNU General Public License as published by | ||
| 374 | -// the Free Software Foundation; either version 2 of the License, or | ||
| 375 | -// (at your option) any later version. | ||
| 376 | -// | ||
| 377 | -// This program is distributed in the hope that it will be useful, | ||
| 378 | -// but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
| 379 | -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
| 380 | -// GNU General Public License for more details. | ||
| 381 | -// | ||
| 382 | -// You should have received a copy of the GNU General Public License | ||
| 383 | -// along with this program; if not, write to the Free Software | ||
| 384 | -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | ||
| 385 | -// | ||
| 386 | -// In addition, as a special exception, the copyright holders give | ||
| 387 | -// permission to link the code of portions of this program with the | ||
| 388 | -// OpenSSL library under certain conditions as described in each | ||
| 389 | -// individual source file, and distribute linked combinations | ||
| 390 | -// including the two. | ||
| 391 | -// | ||
| 392 | -// You must obey the GNU General Public License in all respects for | ||
| 393 | -// all of the code used other than OpenSSL. If you modify file(s) | ||
| 394 | -// with this exception, you may extend this exception to your version | ||
| 395 | -// of the file(s), but you are not obligated to do so. If you do not | ||
| 396 | -// wish to do so, delete this exception statement from your version. | ||
| 397 | -// If you delete this exception statement from all source files in the | ||
| 398 | -// program, then also delete it here. | ||
| 399 | -// | ||
| 400 | -// Contact: Jari Sundell <jaris@ifi.uio.no> | ||
| 401 | -// | ||
| 402 | -// Skomakerveien 33 | ||
| 403 | -// 3185 Skoppum, NORWAY | ||
| 404 | - | ||
| 405 | -// A routine to get a local IP address that can be presented to a tracker. | ||
| 406 | -// (Does not use UPnP etc., so will not understand NAT.) | ||
| 407 | -// On a machine with multiple network cards, address selection can be a | ||
| 408 | -// complex process, and in general what's selected is a source/destination | ||
| 409 | -// address pair. However, this routine will give an approximation that will | ||
| 410 | -// be good enough for most purposes and users. | ||
| 411 | - | ||
| 412 | -#ifndef LIBTORRENT_NET_LOCAL_ADDR_H | ||
| 413 | -#define LIBTORRENT_NET_LOCAL_ADDR_H | ||
| 414 | - | ||
| 415 | -#include <unistd.h> | ||
| 416 | - | ||
| 417 | -namespace rak { | ||
| 418 | - class socket_address; | ||
| 419 | -} | ||
| 420 | - | ||
| 421 | -namespace torrent { | ||
| 422 | - | ||
| 423 | -// Note: family must currently be rak::af_inet or rak::af_inet6 | ||
| 424 | -// (rak::af_unspec won't do); anything else will throw an exception. | ||
| 425 | -// Returns false if no address of the given family could be found, | ||
| 426 | -// either because there are none, or because something went wrong in | ||
| 427 | -// the process (e.g., no free file descriptors). | ||
| 428 | -bool get_local_address(sa_family_t family, rak::socket_address *address); | ||
| 429 | - | ||
| 430 | -} | ||
| 431 | - | ||
| 432 | -#endif /* LIBTORRENT_NET_LOCAL_ADDR_H */ | ||
| 433 | diff --git a/src/tracker/tracker_http.cc b/src/tracker/tracker_http.cc | ||
| 434 | index fdbbd58a..22c409a1 100644 | ||
| 435 | --- a/src/tracker/tracker_http.cc | ||
| 436 | +++ b/src/tracker/tracker_http.cc | ||
| 437 | @@ -8,7 +8,6 @@ | ||
| 438 | #import <rak/string_manip.h> | ||
| 439 | |||
| 440 | #import "net/address_list.h" | ||
| 441 | -#import "net/local_addr.h" | ||
| 442 | #import "torrent/connection_manager.h" | ||
| 443 | #import "torrent/download_info.h" | ||
| 444 | #import "torrent/exceptions.h" | ||
diff --git a/meta-oe/recipes-connectivity/libtorrent/libtorrent/0043-Updated-and-cleaned-up-automake.-224.patch b/meta-oe/recipes-connectivity/libtorrent/libtorrent/0043-Updated-and-cleaned-up-automake.-224.patch new file mode 100644 index 0000000000..965f61a4e6 --- /dev/null +++ b/meta-oe/recipes-connectivity/libtorrent/libtorrent/0043-Updated-and-cleaned-up-automake.-224.patch | |||
| @@ -0,0 +1,2979 @@ | |||
| 1 | From 4cfe9b1dc1349ad167969d6cf87f557600f34a2e Mon Sep 17 00:00:00 2001 | ||
| 2 | From: Jari Sundell <sundell.software@gmail.com> | ||
| 3 | Date: Sat, 7 Aug 2021 17:49:35 +0900 | ||
| 4 | Subject: [PATCH] Updated and cleaned up automake. (#224) | ||
| 5 | |||
| 6 | --- | ||
| 7 | INSTALL | 371 +++++++---- | ||
| 8 | autogen.sh | 51 -- | ||
| 9 | configure.ac | 32 +- | ||
| 10 | scripts/ax_check_zlib.m4 | 11 +- | ||
| 11 | scripts/ax_cxx_compile_stdcxx.m4 | 962 ++++++++++++++++++++++++++++ | ||
| 12 | scripts/ax_cxx_compile_stdcxx_0x.m4 | 106 --- | ||
| 13 | scripts/ax_cxx_compile_stdcxx_11.m4 | 147 ----- | ||
| 14 | scripts/ax_pthread.m4 | 453 +++++++++---- | ||
| 15 | scripts/checks.m4 | 104 ++- | ||
| 16 | scripts/common.m4 | 29 +- | ||
| 17 | scripts/rak_compiler.m4 | 6 +- | ||
| 18 | scripts/rak_cxx.m4 | 14 - | ||
| 19 | 12 files changed, 1642 insertions(+), 644 deletions(-) | ||
| 20 | delete mode 100755 autogen.sh | ||
| 21 | mode change 100644 => 100755 scripts/ax_check_zlib.m4 | ||
| 22 | create mode 100755 scripts/ax_cxx_compile_stdcxx.m4 | ||
| 23 | delete mode 100644 scripts/ax_cxx_compile_stdcxx_0x.m4 | ||
| 24 | delete mode 100644 scripts/ax_cxx_compile_stdcxx_11.m4 | ||
| 25 | mode change 100644 => 100755 scripts/ax_pthread.m4 | ||
| 26 | delete mode 100644 scripts/rak_cxx.m4 | ||
| 27 | |||
| 28 | diff --git a/INSTALL b/INSTALL | ||
| 29 | index 54caf7c1..8865734f 100644 | ||
| 30 | --- a/INSTALL | ||
| 31 | +++ b/INSTALL | ||
| 32 | @@ -1,81 +1,109 @@ | ||
| 33 | -Copyright (C) 1994, 1995, 1996, 1999, 2000, 2001, 2002 Free Software | ||
| 34 | +Installation Instructions | ||
| 35 | +************************* | ||
| 36 | + | ||
| 37 | + Copyright (C) 1994-1996, 1999-2002, 2004-2016 Free Software | ||
| 38 | Foundation, Inc. | ||
| 39 | |||
| 40 | - This file is free documentation; the Free Software Foundation gives | ||
| 41 | -unlimited permission to copy, distribute and modify it. | ||
| 42 | + Copying and distribution of this file, with or without modification, | ||
| 43 | +are permitted in any medium without royalty provided the copyright | ||
| 44 | +notice and this notice are preserved. This file is offered as-is, | ||
| 45 | +without warranty of any kind. | ||
| 46 | |||
| 47 | Basic Installation | ||
| 48 | ================== | ||
| 49 | |||
| 50 | - These are generic installation instructions. | ||
| 51 | + Briefly, the shell command './configure && make && make install' | ||
| 52 | +should configure, build, and install this package. The following | ||
| 53 | +more-detailed instructions are generic; see the 'README' file for | ||
| 54 | +instructions specific to this package. Some packages provide this | ||
| 55 | +'INSTALL' file but do not implement all of the features documented | ||
| 56 | +below. The lack of an optional feature in a given package is not | ||
| 57 | +necessarily a bug. More recommendations for GNU packages can be found | ||
| 58 | +in *note Makefile Conventions: (standards)Makefile Conventions. | ||
| 59 | |||
| 60 | - The `configure' shell script attempts to guess correct values for | ||
| 61 | + The 'configure' shell script attempts to guess correct values for | ||
| 62 | various system-dependent variables used during compilation. It uses | ||
| 63 | -those values to create a `Makefile' in each directory of the package. | ||
| 64 | -It may also create one or more `.h' files containing system-dependent | ||
| 65 | -definitions. Finally, it creates a shell script `config.status' that | ||
| 66 | +those values to create a 'Makefile' in each directory of the package. | ||
| 67 | +It may also create one or more '.h' files containing system-dependent | ||
| 68 | +definitions. Finally, it creates a shell script 'config.status' that | ||
| 69 | you can run in the future to recreate the current configuration, and a | ||
| 70 | -file `config.log' containing compiler output (useful mainly for | ||
| 71 | -debugging `configure'). | ||
| 72 | +file 'config.log' containing compiler output (useful mainly for | ||
| 73 | +debugging 'configure'). | ||
| 74 | |||
| 75 | - It can also use an optional file (typically called `config.cache' | ||
| 76 | -and enabled with `--cache-file=config.cache' or simply `-C') that saves | ||
| 77 | -the results of its tests to speed up reconfiguring. (Caching is | ||
| 78 | -disabled by default to prevent problems with accidental use of stale | ||
| 79 | -cache files.) | ||
| 80 | + It can also use an optional file (typically called 'config.cache' and | ||
| 81 | +enabled with '--cache-file=config.cache' or simply '-C') that saves the | ||
| 82 | +results of its tests to speed up reconfiguring. Caching is disabled by | ||
| 83 | +default to prevent problems with accidental use of stale cache files. | ||
| 84 | |||
| 85 | If you need to do unusual things to compile the package, please try | ||
| 86 | -to figure out how `configure' could check whether to do them, and mail | ||
| 87 | -diffs or instructions to the address given in the `README' so they can | ||
| 88 | +to figure out how 'configure' could check whether to do them, and mail | ||
| 89 | +diffs or instructions to the address given in the 'README' so they can | ||
| 90 | be considered for the next release. If you are using the cache, and at | ||
| 91 | -some point `config.cache' contains results you don't want to keep, you | ||
| 92 | +some point 'config.cache' contains results you don't want to keep, you | ||
| 93 | may remove or edit it. | ||
| 94 | |||
| 95 | - The file `configure.ac' (or `configure.in') is used to create | ||
| 96 | -`configure' by a program called `autoconf'. You only need | ||
| 97 | -`configure.ac' if you want to change it or regenerate `configure' using | ||
| 98 | -a newer version of `autoconf'. | ||
| 99 | + The file 'configure.ac' (or 'configure.in') is used to create | ||
| 100 | +'configure' by a program called 'autoconf'. You need 'configure.ac' if | ||
| 101 | +you want to change it or regenerate 'configure' using a newer version of | ||
| 102 | +'autoconf'. | ||
| 103 | + | ||
| 104 | + The simplest way to compile this package is: | ||
| 105 | |||
| 106 | -The simplest way to compile this package is: | ||
| 107 | + 1. 'cd' to the directory containing the package's source code and type | ||
| 108 | + './configure' to configure the package for your system. | ||
| 109 | |||
| 110 | - 1. `cd' to the directory containing the package's source code and type | ||
| 111 | - `./configure' to configure the package for your system. If you're | ||
| 112 | - using `csh' on an old version of System V, you might need to type | ||
| 113 | - `sh ./configure' instead to prevent `csh' from trying to execute | ||
| 114 | - `configure' itself. | ||
| 115 | + Running 'configure' might take a while. While running, it prints | ||
| 116 | + some messages telling which features it is checking for. | ||
| 117 | |||
| 118 | - Running `configure' takes awhile. While running, it prints some | ||
| 119 | - messages telling which features it is checking for. | ||
| 120 | + 2. Type 'make' to compile the package. | ||
| 121 | |||
| 122 | - 2. Type `make' to compile the package. | ||
| 123 | + 3. Optionally, type 'make check' to run any self-tests that come with | ||
| 124 | + the package, generally using the just-built uninstalled binaries. | ||
| 125 | |||
| 126 | - 3. Optionally, type `make check' to run any self-tests that come with | ||
| 127 | - the package. | ||
| 128 | + 4. Type 'make install' to install the programs and any data files and | ||
| 129 | + documentation. When installing into a prefix owned by root, it is | ||
| 130 | + recommended that the package be configured and built as a regular | ||
| 131 | + user, and only the 'make install' phase executed with root | ||
| 132 | + privileges. | ||
| 133 | |||
| 134 | - 4. Type `make install' to install the programs and any data files and | ||
| 135 | - documentation. | ||
| 136 | + 5. Optionally, type 'make installcheck' to repeat any self-tests, but | ||
| 137 | + this time using the binaries in their final installed location. | ||
| 138 | + This target does not install anything. Running this target as a | ||
| 139 | + regular user, particularly if the prior 'make install' required | ||
| 140 | + root privileges, verifies that the installation completed | ||
| 141 | + correctly. | ||
| 142 | |||
| 143 | - 5. You can remove the program binaries and object files from the | ||
| 144 | - source code directory by typing `make clean'. To also remove the | ||
| 145 | - files that `configure' created (so you can compile the package for | ||
| 146 | - a different kind of computer), type `make distclean'. There is | ||
| 147 | - also a `make maintainer-clean' target, but that is intended mainly | ||
| 148 | + 6. You can remove the program binaries and object files from the | ||
| 149 | + source code directory by typing 'make clean'. To also remove the | ||
| 150 | + files that 'configure' created (so you can compile the package for | ||
| 151 | + a different kind of computer), type 'make distclean'. There is | ||
| 152 | + also a 'make maintainer-clean' target, but that is intended mainly | ||
| 153 | for the package's developers. If you use it, you may have to get | ||
| 154 | all sorts of other programs in order to regenerate files that came | ||
| 155 | with the distribution. | ||
| 156 | |||
| 157 | + 7. Often, you can also type 'make uninstall' to remove the installed | ||
| 158 | + files again. In practice, not all packages have tested that | ||
| 159 | + uninstallation works correctly, even though it is required by the | ||
| 160 | + GNU Coding Standards. | ||
| 161 | + | ||
| 162 | + 8. Some packages, particularly those that use Automake, provide 'make | ||
| 163 | + distcheck', which can by used by developers to test that all other | ||
| 164 | + targets like 'make install' and 'make uninstall' work correctly. | ||
| 165 | + This target is generally not run by end users. | ||
| 166 | + | ||
| 167 | Compilers and Options | ||
| 168 | ===================== | ||
| 169 | |||
| 170 | Some systems require unusual options for compilation or linking that | ||
| 171 | -the `configure' script does not know about. Run `./configure --help' | ||
| 172 | +the 'configure' script does not know about. Run './configure --help' | ||
| 173 | for details on some of the pertinent environment variables. | ||
| 174 | |||
| 175 | - You can give `configure' initial values for configuration parameters | ||
| 176 | -by setting variables in the command line or in the environment. Here | ||
| 177 | -is an example: | ||
| 178 | + You can give 'configure' initial values for configuration parameters | ||
| 179 | +by setting variables in the command line or in the environment. Here is | ||
| 180 | +an example: | ||
| 181 | |||
| 182 | - ./configure CC=c89 CFLAGS=-O2 LIBS=-lposix | ||
| 183 | + ./configure CC=c99 CFLAGS=-g LIBS=-lposix | ||
| 184 | |||
| 185 | *Note Defining Variables::, for more details. | ||
| 186 | |||
| 187 | @@ -84,146 +112,257 @@ Compiling For Multiple Architectures | ||
| 188 | |||
| 189 | You can compile the package for more than one kind of computer at the | ||
| 190 | same time, by placing the object files for each architecture in their | ||
| 191 | -own directory. To do this, you must use a version of `make' that | ||
| 192 | -supports the `VPATH' variable, such as GNU `make'. `cd' to the | ||
| 193 | +own directory. To do this, you can use GNU 'make'. 'cd' to the | ||
| 194 | directory where you want the object files and executables to go and run | ||
| 195 | -the `configure' script. `configure' automatically checks for the | ||
| 196 | -source code in the directory that `configure' is in and in `..'. | ||
| 197 | +the 'configure' script. 'configure' automatically checks for the source | ||
| 198 | +code in the directory that 'configure' is in and in '..'. This is known | ||
| 199 | +as a "VPATH" build. | ||
| 200 | + | ||
| 201 | + With a non-GNU 'make', it is safer to compile the package for one | ||
| 202 | +architecture at a time in the source code directory. After you have | ||
| 203 | +installed the package for one architecture, use 'make distclean' before | ||
| 204 | +reconfiguring for another architecture. | ||
| 205 | + | ||
| 206 | + On MacOS X 10.5 and later systems, you can create libraries and | ||
| 207 | +executables that work on multiple system types--known as "fat" or | ||
| 208 | +"universal" binaries--by specifying multiple '-arch' options to the | ||
| 209 | +compiler but only a single '-arch' option to the preprocessor. Like | ||
| 210 | +this: | ||
| 211 | + | ||
| 212 | + ./configure CC="gcc -arch i386 -arch x86_64 -arch ppc -arch ppc64" \ | ||
| 213 | + CXX="g++ -arch i386 -arch x86_64 -arch ppc -arch ppc64" \ | ||
| 214 | + CPP="gcc -E" CXXCPP="g++ -E" | ||
| 215 | |||
| 216 | - If you have to use a `make' that does not support the `VPATH' | ||
| 217 | -variable, you have to compile the package for one architecture at a | ||
| 218 | -time in the source code directory. After you have installed the | ||
| 219 | -package for one architecture, use `make distclean' before reconfiguring | ||
| 220 | -for another architecture. | ||
| 221 | + This is not guaranteed to produce working output in all cases, you | ||
| 222 | +may have to build one architecture at a time and combine the results | ||
| 223 | +using the 'lipo' tool if you have problems. | ||
| 224 | |||
| 225 | Installation Names | ||
| 226 | ================== | ||
| 227 | |||
| 228 | - By default, `make install' will install the package's files in | ||
| 229 | -`/usr/local/bin', `/usr/local/man', etc. You can specify an | ||
| 230 | -installation prefix other than `/usr/local' by giving `configure' the | ||
| 231 | -option `--prefix=PATH'. | ||
| 232 | + By default, 'make install' installs the package's commands under | ||
| 233 | +'/usr/local/bin', include files under '/usr/local/include', etc. You | ||
| 234 | +can specify an installation prefix other than '/usr/local' by giving | ||
| 235 | +'configure' the option '--prefix=PREFIX', where PREFIX must be an | ||
| 236 | +absolute file name. | ||
| 237 | |||
| 238 | You can specify separate installation prefixes for | ||
| 239 | architecture-specific files and architecture-independent files. If you | ||
| 240 | -give `configure' the option `--exec-prefix=PATH', the package will use | ||
| 241 | -PATH as the prefix for installing programs and libraries. | ||
| 242 | -Documentation and other data files will still use the regular prefix. | ||
| 243 | +pass the option '--exec-prefix=PREFIX' to 'configure', the package uses | ||
| 244 | +PREFIX as the prefix for installing programs and libraries. | ||
| 245 | +Documentation and other data files still use the regular prefix. | ||
| 246 | |||
| 247 | In addition, if you use an unusual directory layout you can give | ||
| 248 | -options like `--bindir=PATH' to specify different values for particular | ||
| 249 | -kinds of files. Run `configure --help' for a list of the directories | ||
| 250 | -you can set and what kinds of files go in them. | ||
| 251 | - | ||
| 252 | - If the package supports it, you can cause programs to be installed | ||
| 253 | -with an extra prefix or suffix on their names by giving `configure' the | ||
| 254 | -option `--program-prefix=PREFIX' or `--program-suffix=SUFFIX'. | ||
| 255 | +options like '--bindir=DIR' to specify different values for particular | ||
| 256 | +kinds of files. Run 'configure --help' for a list of the directories | ||
| 257 | +you can set and what kinds of files go in them. In general, the default | ||
| 258 | +for these options is expressed in terms of '${prefix}', so that | ||
| 259 | +specifying just '--prefix' will affect all of the other directory | ||
| 260 | +specifications that were not explicitly provided. | ||
| 261 | + | ||
| 262 | + The most portable way to affect installation locations is to pass the | ||
| 263 | +correct locations to 'configure'; however, many packages provide one or | ||
| 264 | +both of the following shortcuts of passing variable assignments to the | ||
| 265 | +'make install' command line to change installation locations without | ||
| 266 | +having to reconfigure or recompile. | ||
| 267 | + | ||
| 268 | + The first method involves providing an override variable for each | ||
| 269 | +affected directory. For example, 'make install | ||
| 270 | +prefix=/alternate/directory' will choose an alternate location for all | ||
| 271 | +directory configuration variables that were expressed in terms of | ||
| 272 | +'${prefix}'. Any directories that were specified during 'configure', | ||
| 273 | +but not in terms of '${prefix}', must each be overridden at install time | ||
| 274 | +for the entire installation to be relocated. The approach of makefile | ||
| 275 | +variable overrides for each directory variable is required by the GNU | ||
| 276 | +Coding Standards, and ideally causes no recompilation. However, some | ||
| 277 | +platforms have known limitations with the semantics of shared libraries | ||
| 278 | +that end up requiring recompilation when using this method, particularly | ||
| 279 | +noticeable in packages that use GNU Libtool. | ||
| 280 | + | ||
| 281 | + The second method involves providing the 'DESTDIR' variable. For | ||
| 282 | +example, 'make install DESTDIR=/alternate/directory' will prepend | ||
| 283 | +'/alternate/directory' before all installation names. The approach of | ||
| 284 | +'DESTDIR' overrides is not required by the GNU Coding Standards, and | ||
| 285 | +does not work on platforms that have drive letters. On the other hand, | ||
| 286 | +it does better at avoiding recompilation issues, and works well even | ||
| 287 | +when some directory options were not specified in terms of '${prefix}' | ||
| 288 | +at 'configure' time. | ||
| 289 | |||
| 290 | Optional Features | ||
| 291 | ================= | ||
| 292 | |||
| 293 | - Some packages pay attention to `--enable-FEATURE' options to | ||
| 294 | -`configure', where FEATURE indicates an optional part of the package. | ||
| 295 | -They may also pay attention to `--with-PACKAGE' options, where PACKAGE | ||
| 296 | -is something like `gnu-as' or `x' (for the X Window System). The | ||
| 297 | -`README' should mention any `--enable-' and `--with-' options that the | ||
| 298 | + If the package supports it, you can cause programs to be installed | ||
| 299 | +with an extra prefix or suffix on their names by giving 'configure' the | ||
| 300 | +option '--program-prefix=PREFIX' or '--program-suffix=SUFFIX'. | ||
| 301 | + | ||
| 302 | + Some packages pay attention to '--enable-FEATURE' options to | ||
| 303 | +'configure', where FEATURE indicates an optional part of the package. | ||
| 304 | +They may also pay attention to '--with-PACKAGE' options, where PACKAGE | ||
| 305 | +is something like 'gnu-as' or 'x' (for the X Window System). The | ||
| 306 | +'README' should mention any '--enable-' and '--with-' options that the | ||
| 307 | package recognizes. | ||
| 308 | |||
| 309 | - For packages that use the X Window System, `configure' can usually | ||
| 310 | + For packages that use the X Window System, 'configure' can usually | ||
| 311 | find the X include and library files automatically, but if it doesn't, | ||
| 312 | -you can use the `configure' options `--x-includes=DIR' and | ||
| 313 | -`--x-libraries=DIR' to specify their locations. | ||
| 314 | +you can use the 'configure' options '--x-includes=DIR' and | ||
| 315 | +'--x-libraries=DIR' to specify their locations. | ||
| 316 | + | ||
| 317 | + Some packages offer the ability to configure how verbose the | ||
| 318 | +execution of 'make' will be. For these packages, running './configure | ||
| 319 | +--enable-silent-rules' sets the default to minimal output, which can be | ||
| 320 | +overridden with 'make V=1'; while running './configure | ||
| 321 | +--disable-silent-rules' sets the default to verbose, which can be | ||
| 322 | +overridden with 'make V=0'. | ||
| 323 | + | ||
| 324 | +Particular systems | ||
| 325 | +================== | ||
| 326 | + | ||
| 327 | + On HP-UX, the default C compiler is not ANSI C compatible. If GNU CC | ||
| 328 | +is not installed, it is recommended to use the following options in | ||
| 329 | +order to use an ANSI C compiler: | ||
| 330 | + | ||
| 331 | + ./configure CC="cc -Ae -D_XOPEN_SOURCE=500" | ||
| 332 | + | ||
| 333 | +and if that doesn't work, install pre-built binaries of GCC for HP-UX. | ||
| 334 | + | ||
| 335 | + HP-UX 'make' updates targets which have the same time stamps as their | ||
| 336 | +prerequisites, which makes it generally unusable when shipped generated | ||
| 337 | +files such as 'configure' are involved. Use GNU 'make' instead. | ||
| 338 | + | ||
| 339 | + On OSF/1 a.k.a. Tru64, some versions of the default C compiler cannot | ||
| 340 | +parse its '<wchar.h>' header file. The option '-nodtk' can be used as a | ||
| 341 | +workaround. If GNU CC is not installed, it is therefore recommended to | ||
| 342 | +try | ||
| 343 | + | ||
| 344 | + ./configure CC="cc" | ||
| 345 | + | ||
| 346 | +and if that doesn't work, try | ||
| 347 | + | ||
| 348 | + ./configure CC="cc -nodtk" | ||
| 349 | + | ||
| 350 | + On Solaris, don't put '/usr/ucb' early in your 'PATH'. This | ||
| 351 | +directory contains several dysfunctional programs; working variants of | ||
| 352 | +these programs are available in '/usr/bin'. So, if you need '/usr/ucb' | ||
| 353 | +in your 'PATH', put it _after_ '/usr/bin'. | ||
| 354 | + | ||
| 355 | + On Haiku, software installed for all users goes in '/boot/common', | ||
| 356 | +not '/usr/local'. It is recommended to use the following options: | ||
| 357 | + | ||
| 358 | + ./configure --prefix=/boot/common | ||
| 359 | |||
| 360 | Specifying the System Type | ||
| 361 | ========================== | ||
| 362 | |||
| 363 | - There may be some features `configure' cannot figure out | ||
| 364 | + There may be some features 'configure' cannot figure out | ||
| 365 | automatically, but needs to determine by the type of machine the package | ||
| 366 | will run on. Usually, assuming the package is built to be run on the | ||
| 367 | -_same_ architectures, `configure' can figure that out, but if it prints | ||
| 368 | +_same_ architectures, 'configure' can figure that out, but if it prints | ||
| 369 | a message saying it cannot guess the machine type, give it the | ||
| 370 | -`--build=TYPE' option. TYPE can either be a short name for the system | ||
| 371 | -type, such as `sun4', or a canonical name which has the form: | ||
| 372 | +'--build=TYPE' option. TYPE can either be a short name for the system | ||
| 373 | +type, such as 'sun4', or a canonical name which has the form: | ||
| 374 | |||
| 375 | CPU-COMPANY-SYSTEM | ||
| 376 | |||
| 377 | where SYSTEM can have one of these forms: | ||
| 378 | |||
| 379 | - OS KERNEL-OS | ||
| 380 | + OS | ||
| 381 | + KERNEL-OS | ||
| 382 | |||
| 383 | - See the file `config.sub' for the possible values of each field. If | ||
| 384 | -`config.sub' isn't included in this package, then this package doesn't | ||
| 385 | + See the file 'config.sub' for the possible values of each field. If | ||
| 386 | +'config.sub' isn't included in this package, then this package doesn't | ||
| 387 | need to know the machine type. | ||
| 388 | |||
| 389 | If you are _building_ compiler tools for cross-compiling, you should | ||
| 390 | -use the `--target=TYPE' option to select the type of system they will | ||
| 391 | +use the option '--target=TYPE' to select the type of system they will | ||
| 392 | produce code for. | ||
| 393 | |||
| 394 | If you want to _use_ a cross compiler, that generates code for a | ||
| 395 | platform different from the build platform, you should specify the | ||
| 396 | "host" platform (i.e., that on which the generated programs will | ||
| 397 | -eventually be run) with `--host=TYPE'. | ||
| 398 | +eventually be run) with '--host=TYPE'. | ||
| 399 | |||
| 400 | Sharing Defaults | ||
| 401 | ================ | ||
| 402 | |||
| 403 | - If you want to set default values for `configure' scripts to share, | ||
| 404 | -you can create a site shell script called `config.site' that gives | ||
| 405 | -default values for variables like `CC', `cache_file', and `prefix'. | ||
| 406 | -`configure' looks for `PREFIX/share/config.site' if it exists, then | ||
| 407 | -`PREFIX/etc/config.site' if it exists. Or, you can set the | ||
| 408 | -`CONFIG_SITE' environment variable to the location of the site script. | ||
| 409 | -A warning: not all `configure' scripts look for a site script. | ||
| 410 | + If you want to set default values for 'configure' scripts to share, | ||
| 411 | +you can create a site shell script called 'config.site' that gives | ||
| 412 | +default values for variables like 'CC', 'cache_file', and 'prefix'. | ||
| 413 | +'configure' looks for 'PREFIX/share/config.site' if it exists, then | ||
| 414 | +'PREFIX/etc/config.site' if it exists. Or, you can set the | ||
| 415 | +'CONFIG_SITE' environment variable to the location of the site script. | ||
| 416 | +A warning: not all 'configure' scripts look for a site script. | ||
| 417 | |||
| 418 | Defining Variables | ||
| 419 | ================== | ||
| 420 | |||
| 421 | Variables not defined in a site shell script can be set in the | ||
| 422 | -environment passed to `configure'. However, some packages may run | ||
| 423 | +environment passed to 'configure'. However, some packages may run | ||
| 424 | configure again during the build, and the customized values of these | ||
| 425 | variables may be lost. In order to avoid this problem, you should set | ||
| 426 | -them in the `configure' command line, using `VAR=value'. For example: | ||
| 427 | +them in the 'configure' command line, using 'VAR=value'. For example: | ||
| 428 | |||
| 429 | ./configure CC=/usr/local2/bin/gcc | ||
| 430 | |||
| 431 | -will cause the specified gcc to be used as the C compiler (unless it is | ||
| 432 | +causes the specified 'gcc' to be used as the C compiler (unless it is | ||
| 433 | overridden in the site shell script). | ||
| 434 | |||
| 435 | -`configure' Invocation | ||
| 436 | +Unfortunately, this technique does not work for 'CONFIG_SHELL' due to an | ||
| 437 | +Autoconf limitation. Until the limitation is lifted, you can use this | ||
| 438 | +workaround: | ||
| 439 | + | ||
| 440 | + CONFIG_SHELL=/bin/bash ./configure CONFIG_SHELL=/bin/bash | ||
| 441 | + | ||
| 442 | +'configure' Invocation | ||
| 443 | ====================== | ||
| 444 | |||
| 445 | - `configure' recognizes the following options to control how it | ||
| 446 | + 'configure' recognizes the following options to control how it | ||
| 447 | operates. | ||
| 448 | |||
| 449 | -`--help' | ||
| 450 | -`-h' | ||
| 451 | - Print a summary of the options to `configure', and exit. | ||
| 452 | +'--help' | ||
| 453 | +'-h' | ||
| 454 | + Print a summary of all of the options to 'configure', and exit. | ||
| 455 | + | ||
| 456 | +'--help=short' | ||
| 457 | +'--help=recursive' | ||
| 458 | + Print a summary of the options unique to this package's | ||
| 459 | + 'configure', and exit. The 'short' variant lists options used only | ||
| 460 | + in the top level, while the 'recursive' variant lists options also | ||
| 461 | + present in any nested packages. | ||
| 462 | |||
| 463 | -`--version' | ||
| 464 | -`-V' | ||
| 465 | - Print the version of Autoconf used to generate the `configure' | ||
| 466 | +'--version' | ||
| 467 | +'-V' | ||
| 468 | + Print the version of Autoconf used to generate the 'configure' | ||
| 469 | script, and exit. | ||
| 470 | |||
| 471 | -`--cache-file=FILE' | ||
| 472 | +'--cache-file=FILE' | ||
| 473 | Enable the cache: use and save the results of the tests in FILE, | ||
| 474 | - traditionally `config.cache'. FILE defaults to `/dev/null' to | ||
| 475 | + traditionally 'config.cache'. FILE defaults to '/dev/null' to | ||
| 476 | disable caching. | ||
| 477 | |||
| 478 | -`--config-cache' | ||
| 479 | -`-C' | ||
| 480 | - Alias for `--cache-file=config.cache'. | ||
| 481 | +'--config-cache' | ||
| 482 | +'-C' | ||
| 483 | + Alias for '--cache-file=config.cache'. | ||
| 484 | |||
| 485 | -`--quiet' | ||
| 486 | -`--silent' | ||
| 487 | -`-q' | ||
| 488 | +'--quiet' | ||
| 489 | +'--silent' | ||
| 490 | +'-q' | ||
| 491 | Do not print messages saying which checks are being made. To | ||
| 492 | - suppress all normal output, redirect it to `/dev/null' (any error | ||
| 493 | + suppress all normal output, redirect it to '/dev/null' (any error | ||
| 494 | messages will still be shown). | ||
| 495 | |||
| 496 | -`--srcdir=DIR' | ||
| 497 | +'--srcdir=DIR' | ||
| 498 | Look for the package's source code in directory DIR. Usually | ||
| 499 | - `configure' can determine that directory automatically. | ||
| 500 | + 'configure' can determine that directory automatically. | ||
| 501 | + | ||
| 502 | +'--prefix=DIR' | ||
| 503 | + Use DIR as the installation prefix. *note Installation Names:: for | ||
| 504 | + more details, including other options available for fine-tuning the | ||
| 505 | + installation locations. | ||
| 506 | |||
| 507 | -`configure' also accepts some other, not widely useful, options. Run | ||
| 508 | -`configure --help' for more details. | ||
| 509 | +'--no-create' | ||
| 510 | +'-n' | ||
| 511 | + Run the configure checks, but stop before creating any output | ||
| 512 | + files. | ||
| 513 | |||
| 514 | +'configure' also accepts some other, not widely useful, options. Run | ||
| 515 | +'configure --help' for more details. | ||
| 516 | diff --git a/autogen.sh b/autogen.sh | ||
| 517 | deleted file mode 100755 | ||
| 518 | index 6def96dd..00000000 | ||
| 519 | --- a/autogen.sh | ||
| 520 | +++ /dev/null | ||
| 521 | @@ -1,51 +0,0 @@ | ||
| 522 | -#! /bin/sh | ||
| 523 | - | ||
| 524 | -echo aclocal... | ||
| 525 | -(aclocal --version) < /dev/null > /dev/null 2>&1 || { | ||
| 526 | - echo aclocal not found | ||
| 527 | - exit 1 | ||
| 528 | -} | ||
| 529 | - | ||
| 530 | -aclocal -I ./scripts -I . ${ACLOCAL_FLAGS} || exit 1 | ||
| 531 | - | ||
| 532 | -echo autoheader... | ||
| 533 | -(autoheader --version) < /dev/null > /dev/null 2>&1 || { | ||
| 534 | - echo autoheader not found | ||
| 535 | - exit 1 | ||
| 536 | -} | ||
| 537 | - | ||
| 538 | -autoheader || exit 1 | ||
| 539 | - | ||
| 540 | -echo -n "libtoolize... " | ||
| 541 | -if ( (glibtoolize --version) < /dev/null > /dev/null 2>&1 ); then | ||
| 542 | - echo "using glibtoolize" | ||
| 543 | - glibtoolize --automake --copy --force || exit 1 | ||
| 544 | - | ||
| 545 | -elif ( (libtoolize --version) < /dev/null > /dev/null 2>&1 ) ; then | ||
| 546 | - echo "using libtoolize" | ||
| 547 | - libtoolize --automake --copy --force || exit 1 | ||
| 548 | - | ||
| 549 | -else | ||
| 550 | - echo "libtoolize nor glibtoolize not found" | ||
| 551 | - exit 1 | ||
| 552 | -fi | ||
| 553 | - | ||
| 554 | -echo automake... | ||
| 555 | -(automake --version) < /dev/null > /dev/null 2>&1 || { | ||
| 556 | - echo automake not found | ||
| 557 | - exit 1 | ||
| 558 | -} | ||
| 559 | - | ||
| 560 | -automake --add-missing --copy --foreign || exit 1 | ||
| 561 | - | ||
| 562 | -echo autoconf... | ||
| 563 | -(autoconf --version) < /dev/null > /dev/null 2>&1 || { | ||
| 564 | - echo autoconf not found | ||
| 565 | - exit 1 | ||
| 566 | -} | ||
| 567 | - | ||
| 568 | -autoconf || exit 1 | ||
| 569 | - | ||
| 570 | -echo ready to configure | ||
| 571 | - | ||
| 572 | -exit 0 | ||
| 573 | diff --git a/configure.ac b/configure.ac | ||
| 574 | index a4f051e4..453e2936 100644 | ||
| 575 | --- a/configure.ac | ||
| 576 | +++ b/configure.ac | ||
| 577 | @@ -1,10 +1,14 @@ | ||
| 578 | -AC_INIT(libtorrent, 0.13.8, sundell.software@gmail.com) | ||
| 579 | +AC_INIT([[libtorrent]],[[0.13.8]],[[sundell.software@gmail.com]]) | ||
| 580 | |||
| 581 | -LT_INIT([disable-static]) | ||
| 582 | +AC_CONFIG_HEADERS([config.h]) | ||
| 583 | +AC_CONFIG_MACRO_DIRS([scripts]) | ||
| 584 | +AM_INIT_AUTOMAKE([serial-tests subdir-objects foreign]) | ||
| 585 | + | ||
| 586 | +LT_INIT([[disable-static]]) | ||
| 587 | |||
| 588 | dnl Find a better way to do this | ||
| 589 | -AC_DEFINE(PEER_NAME, "-lt0D80-", Identifier that is part of the default peer id) | ||
| 590 | -AC_DEFINE(PEER_VERSION, "lt\x0D\x80", 4 byte client and version identifier for DHT) | ||
| 591 | +AC_DEFINE([[PEER_NAME]], [["-lt0D80-"]], [[Identifier that is part of the default peer id.]]) | ||
| 592 | +AC_DEFINE([[PEER_VERSION]], [["lt\x0D\x80"]], [[4 byte client and version identifier for DHT.]]) | ||
| 593 | |||
| 594 | LIBTORRENT_CURRENT=21 | ||
| 595 | LIBTORRENT_REVISION=0 | ||
| 596 | @@ -17,9 +21,6 @@ AC_SUBST(LIBTORRENT_CURRENT) | ||
| 597 | AC_SUBST(LIBTORRENT_INTERFACE_VERSION_INFO) | ||
| 598 | AC_SUBST(LIBTORRENT_INTERFACE_VERSION_NO) | ||
| 599 | |||
| 600 | -AM_INIT_AUTOMAKE([serial-tests subdir-objects]) | ||
| 601 | -AC_CONFIG_HEADERS(config.h) | ||
| 602 | - | ||
| 603 | AC_PROG_CXX | ||
| 604 | AC_SYS_LARGEFILE | ||
| 605 | |||
| 606 | @@ -29,14 +30,14 @@ AC_C_BIGENDIAN( | ||
| 607 | AC_MSG_ERROR([Could not determine endianness]) | ||
| 608 | ) | ||
| 609 | |||
| 610 | +AX_CXX_COMPILE_STDCXX(14, noext, mandatory) | ||
| 611 | + | ||
| 612 | RAK_CHECK_CFLAGS | ||
| 613 | RAK_CHECK_CXXFLAGS | ||
| 614 | RAK_ENABLE_DEBUG | ||
| 615 | RAK_ENABLE_EXTRA_DEBUG | ||
| 616 | RAK_ENABLE_WERROR | ||
| 617 | |||
| 618 | -RAK_CHECK_CXX11 | ||
| 619 | - | ||
| 620 | TORRENT_ENABLE_ALIGNED | ||
| 621 | TORRENT_ENABLE_INTERRUPT_SOCKET | ||
| 622 | |||
| 623 | @@ -55,7 +56,7 @@ TORRENT_WITHOUT_STATFS | ||
| 624 | TORRENT_WITH_INOTIFY | ||
| 625 | |||
| 626 | AC_ARG_ENABLE(attribute-visibility, | ||
| 627 | - AC_HELP_STRING([--disable-attribute-visibility], [disable symbol visibility attribute [[default=enable]]]), | ||
| 628 | + AS_HELP_STRING([--disable-attribute-visibility],[disable symbol visibility attribute [[default=enable]]]), | ||
| 629 | [ | ||
| 630 | if test "$enableval" = "yes"; then | ||
| 631 | CC_ATTRIBUTE_VISIBILITY | ||
| 632 | @@ -65,7 +66,7 @@ AC_ARG_ENABLE(attribute-visibility, | ||
| 633 | ]) | ||
| 634 | |||
| 635 | AC_ARG_ENABLE(execinfo, | ||
| 636 | - AC_HELP_STRING([--disable-execinfo], [disable libexecinfo [[default=enable]]]), | ||
| 637 | + AS_HELP_STRING([--disable-execinfo],[disable libexecinfo [[default=enable]]]), | ||
| 638 | [ | ||
| 639 | if test "$enableval" = "yes"; then | ||
| 640 | AX_EXECINFO | ||
| 641 | @@ -109,12 +110,13 @@ CC_ATTRIBUTE_UNUSED( | ||
| 642 | AC_DEFINE([__UNUSED], [], [Null-wrapper if unused attribute is unsupported]) | ||
| 643 | ) | ||
| 644 | |||
| 645 | -AC_OUTPUT([ | ||
| 646 | +AC_CONFIG_FILES([ | ||
| 647 | libtorrent.pc | ||
| 648 | Makefile | ||
| 649 | src/Makefile | ||
| 650 | src/torrent/Makefile | ||
| 651 | - test/Makefile | ||
| 652 | - test/torrent/net/Makefile | ||
| 653 | - test/net/Makefile | ||
| 654 | + test/Makefile | ||
| 655 | + test/torrent/net/Makefile | ||
| 656 | + test/net/Makefile | ||
| 657 | ]) | ||
| 658 | +AC_OUTPUT | ||
| 659 | diff --git a/scripts/ax_check_zlib.m4 b/scripts/ax_check_zlib.m4 | ||
| 660 | old mode 100644 | ||
| 661 | new mode 100755 | ||
| 662 | index ae5705f6..1a168430 | ||
| 663 | --- a/scripts/ax_check_zlib.m4 | ||
| 664 | +++ b/scripts/ax_check_zlib.m4 | ||
| 665 | @@ -1,5 +1,5 @@ | ||
| 666 | # =========================================================================== | ||
| 667 | -# http://www.gnu.org/software/autoconf-archive/ax_check_zlib.html | ||
| 668 | +# https://www.gnu.org/software/autoconf-archive/ax_check_zlib.html | ||
| 669 | # =========================================================================== | ||
| 670 | # | ||
| 671 | # SYNOPSIS | ||
| 672 | @@ -47,7 +47,7 @@ | ||
| 673 | # Public License for more details. | ||
| 674 | # | ||
| 675 | # You should have received a copy of the GNU General Public License along | ||
| 676 | -# with this program. If not, see <http://www.gnu.org/licenses/>. | ||
| 677 | +# with this program. If not, see <https://www.gnu.org/licenses/>. | ||
| 678 | # | ||
| 679 | # As a special exception, the respective Autoconf Macro's copyright owner | ||
| 680 | # gives unlimited permission to copy, distribute and modify the configure | ||
| 681 | @@ -62,7 +62,7 @@ | ||
| 682 | # modified version of the Autoconf Macro, you may extend this special | ||
| 683 | # exception to the GPL to apply to your modified version as well. | ||
| 684 | |||
| 685 | -#serial 14 | ||
| 686 | +#serial 16 | ||
| 687 | |||
| 688 | AU_ALIAS([CHECK_ZLIB], [AX_CHECK_ZLIB]) | ||
| 689 | AC_DEFUN([AX_CHECK_ZLIB], | ||
| 690 | @@ -108,11 +108,10 @@ then | ||
| 691 | LDFLAGS="$LDFLAGS -L${ZLIB_HOME}/lib" | ||
| 692 | CPPFLAGS="$CPPFLAGS -I${ZLIB_HOME}/include" | ||
| 693 | fi | ||
| 694 | - AC_LANG_SAVE | ||
| 695 | - AC_LANG_C | ||
| 696 | + AC_LANG_PUSH([C]) | ||
| 697 | AC_CHECK_LIB([z], [inflateEnd], [zlib_cv_libz=yes], [zlib_cv_libz=no]) | ||
| 698 | AC_CHECK_HEADER([zlib.h], [zlib_cv_zlib_h=yes], [zlib_cv_zlib_h=no]) | ||
| 699 | - AC_LANG_RESTORE | ||
| 700 | + AC_LANG_POP([C]) | ||
| 701 | if test "$zlib_cv_libz" = "yes" && test "$zlib_cv_zlib_h" = "yes" | ||
| 702 | then | ||
| 703 | # | ||
| 704 | diff --git a/scripts/ax_cxx_compile_stdcxx.m4 b/scripts/ax_cxx_compile_stdcxx.m4 | ||
| 705 | new file mode 100755 | ||
| 706 | index 00000000..9413da62 | ||
| 707 | --- /dev/null | ||
| 708 | +++ b/scripts/ax_cxx_compile_stdcxx.m4 | ||
| 709 | @@ -0,0 +1,962 @@ | ||
| 710 | +# =========================================================================== | ||
| 711 | +# https://www.gnu.org/software/autoconf-archive/ax_cxx_compile_stdcxx.html | ||
| 712 | +# =========================================================================== | ||
| 713 | +# | ||
| 714 | +# SYNOPSIS | ||
| 715 | +# | ||
| 716 | +# AX_CXX_COMPILE_STDCXX(VERSION, [ext|noext], [mandatory|optional]) | ||
| 717 | +# | ||
| 718 | +# DESCRIPTION | ||
| 719 | +# | ||
| 720 | +# Check for baseline language coverage in the compiler for the specified | ||
| 721 | +# version of the C++ standard. If necessary, add switches to CXX and | ||
| 722 | +# CXXCPP to enable support. VERSION may be '11' (for the C++11 standard) | ||
| 723 | +# or '14' (for the C++14 standard). | ||
| 724 | +# | ||
| 725 | +# The second argument, if specified, indicates whether you insist on an | ||
| 726 | +# extended mode (e.g. -std=gnu++11) or a strict conformance mode (e.g. | ||
| 727 | +# -std=c++11). If neither is specified, you get whatever works, with | ||
| 728 | +# preference for no added switch, and then for an extended mode. | ||
| 729 | +# | ||
| 730 | +# The third argument, if specified 'mandatory' or if left unspecified, | ||
| 731 | +# indicates that baseline support for the specified C++ standard is | ||
| 732 | +# required and that the macro should error out if no mode with that | ||
| 733 | +# support is found. If specified 'optional', then configuration proceeds | ||
| 734 | +# regardless, after defining HAVE_CXX${VERSION} if and only if a | ||
| 735 | +# supporting mode is found. | ||
| 736 | +# | ||
| 737 | +# LICENSE | ||
| 738 | +# | ||
| 739 | +# Copyright (c) 2008 Benjamin Kosnik <bkoz@redhat.com> | ||
| 740 | +# Copyright (c) 2012 Zack Weinberg <zackw@panix.com> | ||
| 741 | +# Copyright (c) 2013 Roy Stogner <roystgnr@ices.utexas.edu> | ||
| 742 | +# Copyright (c) 2014, 2015 Google Inc.; contributed by Alexey Sokolov <sokolov@google.com> | ||
| 743 | +# Copyright (c) 2015 Paul Norman <penorman@mac.com> | ||
| 744 | +# Copyright (c) 2015 Moritz Klammler <moritz@klammler.eu> | ||
| 745 | +# Copyright (c) 2016, 2018 Krzesimir Nowak <qdlacz@gmail.com> | ||
| 746 | +# Copyright (c) 2019 Enji Cooper <yaneurabeya@gmail.com> | ||
| 747 | +# Copyright (c) 2020 Jason Merrill <jason@redhat.com> | ||
| 748 | +# | ||
| 749 | +# Copying and distribution of this file, with or without modification, are | ||
| 750 | +# permitted in any medium without royalty provided the copyright notice | ||
| 751 | +# and this notice are preserved. This file is offered as-is, without any | ||
| 752 | +# warranty. | ||
| 753 | + | ||
| 754 | +#serial 12 | ||
| 755 | + | ||
| 756 | +dnl This macro is based on the code from the AX_CXX_COMPILE_STDCXX_11 macro | ||
| 757 | +dnl (serial version number 13). | ||
| 758 | + | ||
| 759 | +AC_DEFUN([AX_CXX_COMPILE_STDCXX], [dnl | ||
| 760 | + m4_if([$1], [11], [ax_cxx_compile_alternatives="11 0x"], | ||
| 761 | + [$1], [14], [ax_cxx_compile_alternatives="14 1y"], | ||
| 762 | + [$1], [17], [ax_cxx_compile_alternatives="17 1z"], | ||
| 763 | + [m4_fatal([invalid first argument `$1' to AX_CXX_COMPILE_STDCXX])])dnl | ||
| 764 | + m4_if([$2], [], [], | ||
| 765 | + [$2], [ext], [], | ||
| 766 | + [$2], [noext], [], | ||
| 767 | + [m4_fatal([invalid second argument `$2' to AX_CXX_COMPILE_STDCXX])])dnl | ||
| 768 | + m4_if([$3], [], [ax_cxx_compile_cxx$1_required=true], | ||
| 769 | + [$3], [mandatory], [ax_cxx_compile_cxx$1_required=true], | ||
| 770 | + [$3], [optional], [ax_cxx_compile_cxx$1_required=false], | ||
| 771 | + [m4_fatal([invalid third argument `$3' to AX_CXX_COMPILE_STDCXX])]) | ||
| 772 | + AC_LANG_PUSH([C++])dnl | ||
| 773 | + ac_success=no | ||
| 774 | + | ||
| 775 | + m4_if([$2], [], [dnl | ||
| 776 | + AC_CACHE_CHECK(whether $CXX supports C++$1 features by default, | ||
| 777 | + ax_cv_cxx_compile_cxx$1, | ||
| 778 | + [AC_COMPILE_IFELSE([AC_LANG_SOURCE([_AX_CXX_COMPILE_STDCXX_testbody_$1])], | ||
| 779 | + [ax_cv_cxx_compile_cxx$1=yes], | ||
| 780 | + [ax_cv_cxx_compile_cxx$1=no])]) | ||
| 781 | + if test x$ax_cv_cxx_compile_cxx$1 = xyes; then | ||
| 782 | + ac_success=yes | ||
| 783 | + fi]) | ||
| 784 | + | ||
| 785 | + m4_if([$2], [noext], [], [dnl | ||
| 786 | + if test x$ac_success = xno; then | ||
| 787 | + for alternative in ${ax_cxx_compile_alternatives}; do | ||
| 788 | + switch="-std=gnu++${alternative}" | ||
| 789 | + cachevar=AS_TR_SH([ax_cv_cxx_compile_cxx$1_$switch]) | ||
| 790 | + AC_CACHE_CHECK(whether $CXX supports C++$1 features with $switch, | ||
| 791 | + $cachevar, | ||
| 792 | + [ac_save_CXX="$CXX" | ||
| 793 | + CXX="$CXX $switch" | ||
| 794 | + AC_COMPILE_IFELSE([AC_LANG_SOURCE([_AX_CXX_COMPILE_STDCXX_testbody_$1])], | ||
| 795 | + [eval $cachevar=yes], | ||
| 796 | + [eval $cachevar=no]) | ||
| 797 | + CXX="$ac_save_CXX"]) | ||
| 798 | + if eval test x\$$cachevar = xyes; then | ||
| 799 | + CXX="$CXX $switch" | ||
| 800 | + if test -n "$CXXCPP" ; then | ||
| 801 | + CXXCPP="$CXXCPP $switch" | ||
| 802 | + fi | ||
| 803 | + ac_success=yes | ||
| 804 | + break | ||
| 805 | + fi | ||
| 806 | + done | ||
| 807 | + fi]) | ||
| 808 | + | ||
| 809 | + m4_if([$2], [ext], [], [dnl | ||
| 810 | + if test x$ac_success = xno; then | ||
| 811 | + dnl HP's aCC needs +std=c++11 according to: | ||
| 812 | + dnl http://h21007.www2.hp.com/portal/download/files/unprot/aCxx/PDF_Release_Notes/769149-001.pdf | ||
| 813 | + dnl Cray's crayCC needs "-h std=c++11" | ||
| 814 | + for alternative in ${ax_cxx_compile_alternatives}; do | ||
| 815 | + for switch in -std=c++${alternative} +std=c++${alternative} "-h std=c++${alternative}"; do | ||
| 816 | + cachevar=AS_TR_SH([ax_cv_cxx_compile_cxx$1_$switch]) | ||
| 817 | + AC_CACHE_CHECK(whether $CXX supports C++$1 features with $switch, | ||
| 818 | + $cachevar, | ||
| 819 | + [ac_save_CXX="$CXX" | ||
| 820 | + CXX="$CXX $switch" | ||
| 821 | + AC_COMPILE_IFELSE([AC_LANG_SOURCE([_AX_CXX_COMPILE_STDCXX_testbody_$1])], | ||
| 822 | + [eval $cachevar=yes], | ||
| 823 | + [eval $cachevar=no]) | ||
| 824 | + CXX="$ac_save_CXX"]) | ||
| 825 | + if eval test x\$$cachevar = xyes; then | ||
| 826 | + CXX="$CXX $switch" | ||
| 827 | + if test -n "$CXXCPP" ; then | ||
| 828 | + CXXCPP="$CXXCPP $switch" | ||
| 829 | + fi | ||
| 830 | + ac_success=yes | ||
| 831 | + break | ||
| 832 | + fi | ||
| 833 | + done | ||
| 834 | + if test x$ac_success = xyes; then | ||
| 835 | + break | ||
| 836 | + fi | ||
| 837 | + done | ||
| 838 | + fi]) | ||
| 839 | + AC_LANG_POP([C++]) | ||
| 840 | + if test x$ax_cxx_compile_cxx$1_required = xtrue; then | ||
| 841 | + if test x$ac_success = xno; then | ||
| 842 | + AC_MSG_ERROR([*** A compiler with support for C++$1 language features is required.]) | ||
| 843 | + fi | ||
| 844 | + fi | ||
| 845 | + if test x$ac_success = xno; then | ||
| 846 | + HAVE_CXX$1=0 | ||
| 847 | + AC_MSG_NOTICE([No compiler with C++$1 support was found]) | ||
| 848 | + else | ||
| 849 | + HAVE_CXX$1=1 | ||
| 850 | + AC_DEFINE(HAVE_CXX$1,1, | ||
| 851 | + [define if the compiler supports basic C++$1 syntax]) | ||
| 852 | + fi | ||
| 853 | + AC_SUBST(HAVE_CXX$1) | ||
| 854 | +]) | ||
| 855 | + | ||
| 856 | + | ||
| 857 | +dnl Test body for checking C++11 support | ||
| 858 | + | ||
| 859 | +m4_define([_AX_CXX_COMPILE_STDCXX_testbody_11], | ||
| 860 | + _AX_CXX_COMPILE_STDCXX_testbody_new_in_11 | ||
| 861 | +) | ||
| 862 | + | ||
| 863 | + | ||
| 864 | +dnl Test body for checking C++14 support | ||
| 865 | + | ||
| 866 | +m4_define([_AX_CXX_COMPILE_STDCXX_testbody_14], | ||
| 867 | + _AX_CXX_COMPILE_STDCXX_testbody_new_in_11 | ||
| 868 | + _AX_CXX_COMPILE_STDCXX_testbody_new_in_14 | ||
| 869 | +) | ||
| 870 | + | ||
| 871 | +m4_define([_AX_CXX_COMPILE_STDCXX_testbody_17], | ||
| 872 | + _AX_CXX_COMPILE_STDCXX_testbody_new_in_11 | ||
| 873 | + _AX_CXX_COMPILE_STDCXX_testbody_new_in_14 | ||
| 874 | + _AX_CXX_COMPILE_STDCXX_testbody_new_in_17 | ||
| 875 | +) | ||
| 876 | + | ||
| 877 | +dnl Tests for new features in C++11 | ||
| 878 | + | ||
| 879 | +m4_define([_AX_CXX_COMPILE_STDCXX_testbody_new_in_11], [[ | ||
| 880 | + | ||
| 881 | +// If the compiler admits that it is not ready for C++11, why torture it? | ||
| 882 | +// Hopefully, this will speed up the test. | ||
| 883 | + | ||
| 884 | +#ifndef __cplusplus | ||
| 885 | + | ||
| 886 | +#error "This is not a C++ compiler" | ||
| 887 | + | ||
| 888 | +#elif __cplusplus < 201103L | ||
| 889 | + | ||
| 890 | +#error "This is not a C++11 compiler" | ||
| 891 | + | ||
| 892 | +#else | ||
| 893 | + | ||
| 894 | +namespace cxx11 | ||
| 895 | +{ | ||
| 896 | + | ||
| 897 | + namespace test_static_assert | ||
| 898 | + { | ||
| 899 | + | ||
| 900 | + template <typename T> | ||
| 901 | + struct check | ||
| 902 | + { | ||
| 903 | + static_assert(sizeof(int) <= sizeof(T), "not big enough"); | ||
| 904 | + }; | ||
| 905 | + | ||
| 906 | + } | ||
| 907 | + | ||
| 908 | + namespace test_final_override | ||
| 909 | + { | ||
| 910 | + | ||
| 911 | + struct Base | ||
| 912 | + { | ||
| 913 | + virtual ~Base() {} | ||
| 914 | + virtual void f() {} | ||
| 915 | + }; | ||
| 916 | + | ||
| 917 | + struct Derived : public Base | ||
| 918 | + { | ||
| 919 | + virtual ~Derived() override {} | ||
| 920 | + virtual void f() override {} | ||
| 921 | + }; | ||
| 922 | + | ||
| 923 | + } | ||
| 924 | + | ||
| 925 | + namespace test_double_right_angle_brackets | ||
| 926 | + { | ||
| 927 | + | ||
| 928 | + template < typename T > | ||
| 929 | + struct check {}; | ||
| 930 | + | ||
| 931 | + typedef check<void> single_type; | ||
| 932 | + typedef check<check<void>> double_type; | ||
| 933 | + typedef check<check<check<void>>> triple_type; | ||
| 934 | + typedef check<check<check<check<void>>>> quadruple_type; | ||
| 935 | + | ||
| 936 | + } | ||
| 937 | + | ||
| 938 | + namespace test_decltype | ||
| 939 | + { | ||
| 940 | + | ||
| 941 | + int | ||
| 942 | + f() | ||
| 943 | + { | ||
| 944 | + int a = 1; | ||
| 945 | + decltype(a) b = 2; | ||
| 946 | + return a + b; | ||
| 947 | + } | ||
| 948 | + | ||
| 949 | + } | ||
| 950 | + | ||
| 951 | + namespace test_type_deduction | ||
| 952 | + { | ||
| 953 | + | ||
| 954 | + template < typename T1, typename T2 > | ||
| 955 | + struct is_same | ||
| 956 | + { | ||
| 957 | + static const bool value = false; | ||
| 958 | + }; | ||
| 959 | + | ||
| 960 | + template < typename T > | ||
| 961 | + struct is_same<T, T> | ||
| 962 | + { | ||
| 963 | + static const bool value = true; | ||
| 964 | + }; | ||
| 965 | + | ||
| 966 | + template < typename T1, typename T2 > | ||
| 967 | + auto | ||
| 968 | + add(T1 a1, T2 a2) -> decltype(a1 + a2) | ||
| 969 | + { | ||
| 970 | + return a1 + a2; | ||
| 971 | + } | ||
| 972 | + | ||
| 973 | + int | ||
| 974 | + test(const int c, volatile int v) | ||
| 975 | + { | ||
| 976 | + static_assert(is_same<int, decltype(0)>::value == true, ""); | ||
| 977 | + static_assert(is_same<int, decltype(c)>::value == false, ""); | ||
| 978 | + static_assert(is_same<int, decltype(v)>::value == false, ""); | ||
| 979 | + auto ac = c; | ||
| 980 | + auto av = v; | ||
| 981 | + auto sumi = ac + av + 'x'; | ||
| 982 | + auto sumf = ac + av + 1.0; | ||
| 983 | + static_assert(is_same<int, decltype(ac)>::value == true, ""); | ||
| 984 | + static_assert(is_same<int, decltype(av)>::value == true, ""); | ||
| 985 | + static_assert(is_same<int, decltype(sumi)>::value == true, ""); | ||
| 986 | + static_assert(is_same<int, decltype(sumf)>::value == false, ""); | ||
| 987 | + static_assert(is_same<int, decltype(add(c, v))>::value == true, ""); | ||
| 988 | + return (sumf > 0.0) ? sumi : add(c, v); | ||
| 989 | + } | ||
| 990 | + | ||
| 991 | + } | ||
| 992 | + | ||
| 993 | + namespace test_noexcept | ||
| 994 | + { | ||
| 995 | + | ||
| 996 | + int f() { return 0; } | ||
| 997 | + int g() noexcept { return 0; } | ||
| 998 | + | ||
| 999 | + static_assert(noexcept(f()) == false, ""); | ||
| 1000 | + static_assert(noexcept(g()) == true, ""); | ||
| 1001 | + | ||
| 1002 | + } | ||
| 1003 | + | ||
| 1004 | + namespace test_constexpr | ||
| 1005 | + { | ||
| 1006 | + | ||
| 1007 | + template < typename CharT > | ||
| 1008 | + unsigned long constexpr | ||
| 1009 | + strlen_c_r(const CharT *const s, const unsigned long acc) noexcept | ||
| 1010 | + { | ||
| 1011 | + return *s ? strlen_c_r(s + 1, acc + 1) : acc; | ||
| 1012 | + } | ||
| 1013 | + | ||
| 1014 | + template < typename CharT > | ||
| 1015 | + unsigned long constexpr | ||
| 1016 | + strlen_c(const CharT *const s) noexcept | ||
| 1017 | + { | ||
| 1018 | + return strlen_c_r(s, 0UL); | ||
| 1019 | + } | ||
| 1020 | + | ||
| 1021 | + static_assert(strlen_c("") == 0UL, ""); | ||
| 1022 | + static_assert(strlen_c("1") == 1UL, ""); | ||
| 1023 | + static_assert(strlen_c("example") == 7UL, ""); | ||
| 1024 | + static_assert(strlen_c("another\0example") == 7UL, ""); | ||
| 1025 | + | ||
| 1026 | + } | ||
| 1027 | + | ||
| 1028 | + namespace test_rvalue_references | ||
| 1029 | + { | ||
| 1030 | + | ||
| 1031 | + template < int N > | ||
| 1032 | + struct answer | ||
| 1033 | + { | ||
| 1034 | + static constexpr int value = N; | ||
| 1035 | + }; | ||
| 1036 | + | ||
| 1037 | + answer<1> f(int&) { return answer<1>(); } | ||
| 1038 | + answer<2> f(const int&) { return answer<2>(); } | ||
| 1039 | + answer<3> f(int&&) { return answer<3>(); } | ||
| 1040 | + | ||
| 1041 | + void | ||
| 1042 | + test() | ||
| 1043 | + { | ||
| 1044 | + int i = 0; | ||
| 1045 | + const int c = 0; | ||
| 1046 | + static_assert(decltype(f(i))::value == 1, ""); | ||
| 1047 | + static_assert(decltype(f(c))::value == 2, ""); | ||
| 1048 | + static_assert(decltype(f(0))::value == 3, ""); | ||
| 1049 | + } | ||
| 1050 | + | ||
| 1051 | + } | ||
| 1052 | + | ||
| 1053 | + namespace test_uniform_initialization | ||
| 1054 | + { | ||
| 1055 | + | ||
| 1056 | + struct test | ||
| 1057 | + { | ||
| 1058 | + static const int zero {}; | ||
| 1059 | + static const int one {1}; | ||
| 1060 | + }; | ||
| 1061 | + | ||
| 1062 | + static_assert(test::zero == 0, ""); | ||
| 1063 | + static_assert(test::one == 1, ""); | ||
| 1064 | + | ||
| 1065 | + } | ||
| 1066 | + | ||
| 1067 | + namespace test_lambdas | ||
| 1068 | + { | ||
| 1069 | + | ||
| 1070 | + void | ||
| 1071 | + test1() | ||
| 1072 | + { | ||
| 1073 | + auto lambda1 = [](){}; | ||
| 1074 | + auto lambda2 = lambda1; | ||
| 1075 | + lambda1(); | ||
| 1076 | + lambda2(); | ||
| 1077 | + } | ||
| 1078 | + | ||
| 1079 | + int | ||
| 1080 | + test2() | ||
| 1081 | + { | ||
| 1082 | + auto a = [](int i, int j){ return i + j; }(1, 2); | ||
| 1083 | + auto b = []() -> int { return '0'; }(); | ||
| 1084 | + auto c = [=](){ return a + b; }(); | ||
| 1085 | + auto d = [&](){ return c; }(); | ||
| 1086 | + auto e = [a, &b](int x) mutable { | ||
| 1087 | + const auto identity = [](int y){ return y; }; | ||
| 1088 | + for (auto i = 0; i < a; ++i) | ||
| 1089 | + a += b--; | ||
| 1090 | + return x + identity(a + b); | ||
| 1091 | + }(0); | ||
| 1092 | + return a + b + c + d + e; | ||
| 1093 | + } | ||
| 1094 | + | ||
| 1095 | + int | ||
| 1096 | + test3() | ||
| 1097 | + { | ||
| 1098 | + const auto nullary = [](){ return 0; }; | ||
| 1099 | + const auto unary = [](int x){ return x; }; | ||
| 1100 | + using nullary_t = decltype(nullary); | ||
| 1101 | + using unary_t = decltype(unary); | ||
| 1102 | + const auto higher1st = [](nullary_t f){ return f(); }; | ||
| 1103 | + const auto higher2nd = [unary](nullary_t f1){ | ||
| 1104 | + return [unary, f1](unary_t f2){ return f2(unary(f1())); }; | ||
| 1105 | + }; | ||
| 1106 | + return higher1st(nullary) + higher2nd(nullary)(unary); | ||
| 1107 | + } | ||
| 1108 | + | ||
| 1109 | + } | ||
| 1110 | + | ||
| 1111 | + namespace test_variadic_templates | ||
| 1112 | + { | ||
| 1113 | + | ||
| 1114 | + template <int...> | ||
| 1115 | + struct sum; | ||
| 1116 | + | ||
| 1117 | + template <int N0, int... N1toN> | ||
| 1118 | + struct sum<N0, N1toN...> | ||
| 1119 | + { | ||
| 1120 | + static constexpr auto value = N0 + sum<N1toN...>::value; | ||
| 1121 | + }; | ||
| 1122 | + | ||
| 1123 | + template <> | ||
| 1124 | + struct sum<> | ||
| 1125 | + { | ||
| 1126 | + static constexpr auto value = 0; | ||
| 1127 | + }; | ||
| 1128 | + | ||
| 1129 | + static_assert(sum<>::value == 0, ""); | ||
| 1130 | + static_assert(sum<1>::value == 1, ""); | ||
| 1131 | + static_assert(sum<23>::value == 23, ""); | ||
| 1132 | + static_assert(sum<1, 2>::value == 3, ""); | ||
| 1133 | + static_assert(sum<5, 5, 11>::value == 21, ""); | ||
| 1134 | + static_assert(sum<2, 3, 5, 7, 11, 13>::value == 41, ""); | ||
| 1135 | + | ||
| 1136 | + } | ||
| 1137 | + | ||
| 1138 | + // http://stackoverflow.com/questions/13728184/template-aliases-and-sfinae | ||
| 1139 | + // Clang 3.1 fails with headers of libstd++ 4.8.3 when using std::function | ||
| 1140 | + // because of this. | ||
| 1141 | + namespace test_template_alias_sfinae | ||
| 1142 | + { | ||
| 1143 | + | ||
| 1144 | + struct foo {}; | ||
| 1145 | + | ||
| 1146 | + template<typename T> | ||
| 1147 | + using member = typename T::member_type; | ||
| 1148 | + | ||
| 1149 | + template<typename T> | ||
| 1150 | + void func(...) {} | ||
| 1151 | + | ||
| 1152 | + template<typename T> | ||
| 1153 | + void func(member<T>*) {} | ||
| 1154 | + | ||
| 1155 | + void test(); | ||
| 1156 | + | ||
| 1157 | + void test() { func<foo>(0); } | ||
| 1158 | + | ||
| 1159 | + } | ||
| 1160 | + | ||
| 1161 | +} // namespace cxx11 | ||
| 1162 | + | ||
| 1163 | +#endif // __cplusplus >= 201103L | ||
| 1164 | + | ||
| 1165 | +]]) | ||
| 1166 | + | ||
| 1167 | + | ||
| 1168 | +dnl Tests for new features in C++14 | ||
| 1169 | + | ||
| 1170 | +m4_define([_AX_CXX_COMPILE_STDCXX_testbody_new_in_14], [[ | ||
| 1171 | + | ||
| 1172 | +// If the compiler admits that it is not ready for C++14, why torture it? | ||
| 1173 | +// Hopefully, this will speed up the test. | ||
| 1174 | + | ||
| 1175 | +#ifndef __cplusplus | ||
| 1176 | + | ||
| 1177 | +#error "This is not a C++ compiler" | ||
| 1178 | + | ||
| 1179 | +#elif __cplusplus < 201402L | ||
| 1180 | + | ||
| 1181 | +#error "This is not a C++14 compiler" | ||
| 1182 | + | ||
| 1183 | +#else | ||
| 1184 | + | ||
| 1185 | +namespace cxx14 | ||
| 1186 | +{ | ||
| 1187 | + | ||
| 1188 | + namespace test_polymorphic_lambdas | ||
| 1189 | + { | ||
| 1190 | + | ||
| 1191 | + int | ||
| 1192 | + test() | ||
| 1193 | + { | ||
| 1194 | + const auto lambda = [](auto&&... args){ | ||
| 1195 | + const auto istiny = [](auto x){ | ||
| 1196 | + return (sizeof(x) == 1UL) ? 1 : 0; | ||
| 1197 | + }; | ||
| 1198 | + const int aretiny[] = { istiny(args)... }; | ||
| 1199 | + return aretiny[0]; | ||
| 1200 | + }; | ||
| 1201 | + return lambda(1, 1L, 1.0f, '1'); | ||
| 1202 | + } | ||
| 1203 | + | ||
| 1204 | + } | ||
| 1205 | + | ||
| 1206 | + namespace test_binary_literals | ||
| 1207 | + { | ||
| 1208 | + | ||
| 1209 | + constexpr auto ivii = 0b0000000000101010; | ||
| 1210 | + static_assert(ivii == 42, "wrong value"); | ||
| 1211 | + | ||
| 1212 | + } | ||
| 1213 | + | ||
| 1214 | + namespace test_generalized_constexpr | ||
| 1215 | + { | ||
| 1216 | + | ||
| 1217 | + template < typename CharT > | ||
| 1218 | + constexpr unsigned long | ||
| 1219 | + strlen_c(const CharT *const s) noexcept | ||
| 1220 | + { | ||
| 1221 | + auto length = 0UL; | ||
| 1222 | + for (auto p = s; *p; ++p) | ||
| 1223 | + ++length; | ||
| 1224 | + return length; | ||
| 1225 | + } | ||
| 1226 | + | ||
| 1227 | + static_assert(strlen_c("") == 0UL, ""); | ||
| 1228 | + static_assert(strlen_c("x") == 1UL, ""); | ||
| 1229 | + static_assert(strlen_c("test") == 4UL, ""); | ||
| 1230 | + static_assert(strlen_c("another\0test") == 7UL, ""); | ||
| 1231 | + | ||
| 1232 | + } | ||
| 1233 | + | ||
| 1234 | + namespace test_lambda_init_capture | ||
| 1235 | + { | ||
| 1236 | + | ||
| 1237 | + int | ||
| 1238 | + test() | ||
| 1239 | + { | ||
| 1240 | + auto x = 0; | ||
| 1241 | + const auto lambda1 = [a = x](int b){ return a + b; }; | ||
| 1242 | + const auto lambda2 = [a = lambda1(x)](){ return a; }; | ||
| 1243 | + return lambda2(); | ||
| 1244 | + } | ||
| 1245 | + | ||
| 1246 | + } | ||
| 1247 | + | ||
| 1248 | + namespace test_digit_separators | ||
| 1249 | + { | ||
| 1250 | + | ||
| 1251 | + constexpr auto ten_million = 100'000'000; | ||
| 1252 | + static_assert(ten_million == 100000000, ""); | ||
| 1253 | + | ||
| 1254 | + } | ||
| 1255 | + | ||
| 1256 | + namespace test_return_type_deduction | ||
| 1257 | + { | ||
| 1258 | + | ||
| 1259 | + auto f(int& x) { return x; } | ||
| 1260 | + decltype(auto) g(int& x) { return x; } | ||
| 1261 | + | ||
| 1262 | + template < typename T1, typename T2 > | ||
| 1263 | + struct is_same | ||
| 1264 | + { | ||
| 1265 | + static constexpr auto value = false; | ||
| 1266 | + }; | ||
| 1267 | + | ||
| 1268 | + template < typename T > | ||
| 1269 | + struct is_same<T, T> | ||
| 1270 | + { | ||
| 1271 | + static constexpr auto value = true; | ||
| 1272 | + }; | ||
| 1273 | + | ||
| 1274 | + int | ||
| 1275 | + test() | ||
| 1276 | + { | ||
| 1277 | + auto x = 0; | ||
| 1278 | + static_assert(is_same<int, decltype(f(x))>::value, ""); | ||
| 1279 | + static_assert(is_same<int&, decltype(g(x))>::value, ""); | ||
| 1280 | + return x; | ||
| 1281 | + } | ||
| 1282 | + | ||
| 1283 | + } | ||
| 1284 | + | ||
| 1285 | +} // namespace cxx14 | ||
| 1286 | + | ||
| 1287 | +#endif // __cplusplus >= 201402L | ||
| 1288 | + | ||
| 1289 | +]]) | ||
| 1290 | + | ||
| 1291 | + | ||
| 1292 | +dnl Tests for new features in C++17 | ||
| 1293 | + | ||
| 1294 | +m4_define([_AX_CXX_COMPILE_STDCXX_testbody_new_in_17], [[ | ||
| 1295 | + | ||
| 1296 | +// If the compiler admits that it is not ready for C++17, why torture it? | ||
| 1297 | +// Hopefully, this will speed up the test. | ||
| 1298 | + | ||
| 1299 | +#ifndef __cplusplus | ||
| 1300 | + | ||
| 1301 | +#error "This is not a C++ compiler" | ||
| 1302 | + | ||
| 1303 | +#elif __cplusplus < 201703L | ||
| 1304 | + | ||
| 1305 | +#error "This is not a C++17 compiler" | ||
| 1306 | + | ||
| 1307 | +#else | ||
| 1308 | + | ||
| 1309 | +#include <initializer_list> | ||
| 1310 | +#include <utility> | ||
| 1311 | +#include <type_traits> | ||
| 1312 | + | ||
| 1313 | +namespace cxx17 | ||
| 1314 | +{ | ||
| 1315 | + | ||
| 1316 | + namespace test_constexpr_lambdas | ||
| 1317 | + { | ||
| 1318 | + | ||
| 1319 | + constexpr int foo = [](){return 42;}(); | ||
| 1320 | + | ||
| 1321 | + } | ||
| 1322 | + | ||
| 1323 | + namespace test::nested_namespace::definitions | ||
| 1324 | + { | ||
| 1325 | + | ||
| 1326 | + } | ||
| 1327 | + | ||
| 1328 | + namespace test_fold_expression | ||
| 1329 | + { | ||
| 1330 | + | ||
| 1331 | + template<typename... Args> | ||
| 1332 | + int multiply(Args... args) | ||
| 1333 | + { | ||
| 1334 | + return (args * ... * 1); | ||
| 1335 | + } | ||
| 1336 | + | ||
| 1337 | + template<typename... Args> | ||
| 1338 | + bool all(Args... args) | ||
| 1339 | + { | ||
| 1340 | + return (args && ...); | ||
| 1341 | + } | ||
| 1342 | + | ||
| 1343 | + } | ||
| 1344 | + | ||
| 1345 | + namespace test_extended_static_assert | ||
| 1346 | + { | ||
| 1347 | + | ||
| 1348 | + static_assert (true); | ||
| 1349 | + | ||
| 1350 | + } | ||
| 1351 | + | ||
| 1352 | + namespace test_auto_brace_init_list | ||
| 1353 | + { | ||
| 1354 | + | ||
| 1355 | + auto foo = {5}; | ||
| 1356 | + auto bar {5}; | ||
| 1357 | + | ||
| 1358 | + static_assert(std::is_same<std::initializer_list<int>, decltype(foo)>::value); | ||
| 1359 | + static_assert(std::is_same<int, decltype(bar)>::value); | ||
| 1360 | + } | ||
| 1361 | + | ||
| 1362 | + namespace test_typename_in_template_template_parameter | ||
| 1363 | + { | ||
| 1364 | + | ||
| 1365 | + template<template<typename> typename X> struct D; | ||
| 1366 | + | ||
| 1367 | + } | ||
| 1368 | + | ||
| 1369 | + namespace test_fallthrough_nodiscard_maybe_unused_attributes | ||
| 1370 | + { | ||
| 1371 | + | ||
| 1372 | + int f1() | ||
| 1373 | + { | ||
| 1374 | + return 42; | ||
| 1375 | + } | ||
| 1376 | + | ||
| 1377 | + [[nodiscard]] int f2() | ||
| 1378 | + { | ||
| 1379 | + [[maybe_unused]] auto unused = f1(); | ||
| 1380 | + | ||
| 1381 | + switch (f1()) | ||
| 1382 | + { | ||
| 1383 | + case 17: | ||
| 1384 | + f1(); | ||
| 1385 | + [[fallthrough]]; | ||
| 1386 | + case 42: | ||
| 1387 | + f1(); | ||
| 1388 | + } | ||
| 1389 | + return f1(); | ||
| 1390 | + } | ||
| 1391 | + | ||
| 1392 | + } | ||
| 1393 | + | ||
| 1394 | + namespace test_extended_aggregate_initialization | ||
| 1395 | + { | ||
| 1396 | + | ||
| 1397 | + struct base1 | ||
| 1398 | + { | ||
| 1399 | + int b1, b2 = 42; | ||
| 1400 | + }; | ||
| 1401 | + | ||
| 1402 | + struct base2 | ||
| 1403 | + { | ||
| 1404 | + base2() { | ||
| 1405 | + b3 = 42; | ||
| 1406 | + } | ||
| 1407 | + int b3; | ||
| 1408 | + }; | ||
| 1409 | + | ||
| 1410 | + struct derived : base1, base2 | ||
| 1411 | + { | ||
| 1412 | + int d; | ||
| 1413 | + }; | ||
| 1414 | + | ||
| 1415 | + derived d1 {{1, 2}, {}, 4}; // full initialization | ||
| 1416 | + derived d2 {{}, {}, 4}; // value-initialized bases | ||
| 1417 | + | ||
| 1418 | + } | ||
| 1419 | + | ||
| 1420 | + namespace test_general_range_based_for_loop | ||
| 1421 | + { | ||
| 1422 | + | ||
| 1423 | + struct iter | ||
| 1424 | + { | ||
| 1425 | + int i; | ||
| 1426 | + | ||
| 1427 | + int& operator* () | ||
| 1428 | + { | ||
| 1429 | + return i; | ||
| 1430 | + } | ||
| 1431 | + | ||
| 1432 | + const int& operator* () const | ||
| 1433 | + { | ||
| 1434 | + return i; | ||
| 1435 | + } | ||
| 1436 | + | ||
| 1437 | + iter& operator++() | ||
| 1438 | + { | ||
| 1439 | + ++i; | ||
| 1440 | + return *this; | ||
| 1441 | + } | ||
| 1442 | + }; | ||
| 1443 | + | ||
| 1444 | + struct sentinel | ||
| 1445 | + { | ||
| 1446 | + int i; | ||
| 1447 | + }; | ||
| 1448 | + | ||
| 1449 | + bool operator== (const iter& i, const sentinel& s) | ||
| 1450 | + { | ||
| 1451 | + return i.i == s.i; | ||
| 1452 | + } | ||
| 1453 | + | ||
| 1454 | + bool operator!= (const iter& i, const sentinel& s) | ||
| 1455 | + { | ||
| 1456 | + return !(i == s); | ||
| 1457 | + } | ||
| 1458 | + | ||
| 1459 | + struct range | ||
| 1460 | + { | ||
| 1461 | + iter begin() const | ||
| 1462 | + { | ||
| 1463 | + return {0}; | ||
| 1464 | + } | ||
| 1465 | + | ||
| 1466 | + sentinel end() const | ||
| 1467 | + { | ||
| 1468 | + return {5}; | ||
| 1469 | + } | ||
| 1470 | + }; | ||
| 1471 | + | ||
| 1472 | + void f() | ||
| 1473 | + { | ||
| 1474 | + range r {}; | ||
| 1475 | + | ||
| 1476 | + for (auto i : r) | ||
| 1477 | + { | ||
| 1478 | + [[maybe_unused]] auto v = i; | ||
| 1479 | + } | ||
| 1480 | + } | ||
| 1481 | + | ||
| 1482 | + } | ||
| 1483 | + | ||
| 1484 | + namespace test_lambda_capture_asterisk_this_by_value | ||
| 1485 | + { | ||
| 1486 | + | ||
| 1487 | + struct t | ||
| 1488 | + { | ||
| 1489 | + int i; | ||
| 1490 | + int foo() | ||
| 1491 | + { | ||
| 1492 | + return [*this]() | ||
| 1493 | + { | ||
| 1494 | + return i; | ||
| 1495 | + }(); | ||
| 1496 | + } | ||
| 1497 | + }; | ||
| 1498 | + | ||
| 1499 | + } | ||
| 1500 | + | ||
| 1501 | + namespace test_enum_class_construction | ||
| 1502 | + { | ||
| 1503 | + | ||
| 1504 | + enum class byte : unsigned char | ||
| 1505 | + {}; | ||
| 1506 | + | ||
| 1507 | + byte foo {42}; | ||
| 1508 | + | ||
| 1509 | + } | ||
| 1510 | + | ||
| 1511 | + namespace test_constexpr_if | ||
| 1512 | + { | ||
| 1513 | + | ||
| 1514 | + template <bool cond> | ||
| 1515 | + int f () | ||
| 1516 | + { | ||
| 1517 | + if constexpr(cond) | ||
| 1518 | + { | ||
| 1519 | + return 13; | ||
| 1520 | + } | ||
| 1521 | + else | ||
| 1522 | + { | ||
| 1523 | + return 42; | ||
| 1524 | + } | ||
| 1525 | + } | ||
| 1526 | + | ||
| 1527 | + } | ||
| 1528 | + | ||
| 1529 | + namespace test_selection_statement_with_initializer | ||
| 1530 | + { | ||
| 1531 | + | ||
| 1532 | + int f() | ||
| 1533 | + { | ||
| 1534 | + return 13; | ||
| 1535 | + } | ||
| 1536 | + | ||
| 1537 | + int f2() | ||
| 1538 | + { | ||
| 1539 | + if (auto i = f(); i > 0) | ||
| 1540 | + { | ||
| 1541 | + return 3; | ||
| 1542 | + } | ||
| 1543 | + | ||
| 1544 | + switch (auto i = f(); i + 4) | ||
| 1545 | + { | ||
| 1546 | + case 17: | ||
| 1547 | + return 2; | ||
| 1548 | + | ||
| 1549 | + default: | ||
| 1550 | + return 1; | ||
| 1551 | + } | ||
| 1552 | + } | ||
| 1553 | + | ||
| 1554 | + } | ||
| 1555 | + | ||
| 1556 | + namespace test_template_argument_deduction_for_class_templates | ||
| 1557 | + { | ||
| 1558 | + | ||
| 1559 | + template <typename T1, typename T2> | ||
| 1560 | + struct pair | ||
| 1561 | + { | ||
| 1562 | + pair (T1 p1, T2 p2) | ||
| 1563 | + : m1 {p1}, | ||
| 1564 | + m2 {p2} | ||
| 1565 | + {} | ||
| 1566 | + | ||
| 1567 | + T1 m1; | ||
| 1568 | + T2 m2; | ||
| 1569 | + }; | ||
| 1570 | + | ||
| 1571 | + void f() | ||
| 1572 | + { | ||
| 1573 | + [[maybe_unused]] auto p = pair{13, 42u}; | ||
| 1574 | + } | ||
| 1575 | + | ||
| 1576 | + } | ||
| 1577 | + | ||
| 1578 | + namespace test_non_type_auto_template_parameters | ||
| 1579 | + { | ||
| 1580 | + | ||
| 1581 | + template <auto n> | ||
| 1582 | + struct B | ||
| 1583 | + {}; | ||
| 1584 | + | ||
| 1585 | + B<5> b1; | ||
| 1586 | + B<'a'> b2; | ||
| 1587 | + | ||
| 1588 | + } | ||
| 1589 | + | ||
| 1590 | + namespace test_structured_bindings | ||
| 1591 | + { | ||
| 1592 | + | ||
| 1593 | + int arr[2] = { 1, 2 }; | ||
| 1594 | + std::pair<int, int> pr = { 1, 2 }; | ||
| 1595 | + | ||
| 1596 | + auto f1() -> int(&)[2] | ||
| 1597 | + { | ||
| 1598 | + return arr; | ||
| 1599 | + } | ||
| 1600 | + | ||
| 1601 | + auto f2() -> std::pair<int, int>& | ||
| 1602 | + { | ||
| 1603 | + return pr; | ||
| 1604 | + } | ||
| 1605 | + | ||
| 1606 | + struct S | ||
| 1607 | + { | ||
| 1608 | + int x1 : 2; | ||
| 1609 | + volatile double y1; | ||
| 1610 | + }; | ||
| 1611 | + | ||
| 1612 | + S f3() | ||
| 1613 | + { | ||
| 1614 | + return {}; | ||
| 1615 | + } | ||
| 1616 | + | ||
| 1617 | + auto [ x1, y1 ] = f1(); | ||
| 1618 | + auto& [ xr1, yr1 ] = f1(); | ||
| 1619 | + auto [ x2, y2 ] = f2(); | ||
| 1620 | + auto& [ xr2, yr2 ] = f2(); | ||
| 1621 | + const auto [ x3, y3 ] = f3(); | ||
| 1622 | + | ||
| 1623 | + } | ||
| 1624 | + | ||
| 1625 | + namespace test_exception_spec_type_system | ||
| 1626 | + { | ||
| 1627 | + | ||
| 1628 | + struct Good {}; | ||
| 1629 | + struct Bad {}; | ||
| 1630 | + | ||
| 1631 | + void g1() noexcept; | ||
| 1632 | + void g2(); | ||
| 1633 | + | ||
| 1634 | + template<typename T> | ||
| 1635 | + Bad | ||
| 1636 | + f(T*, T*); | ||
| 1637 | + | ||
| 1638 | + template<typename T1, typename T2> | ||
| 1639 | + Good | ||
| 1640 | + f(T1*, T2*); | ||
| 1641 | + | ||
| 1642 | + static_assert (std::is_same_v<Good, decltype(f(g1, g2))>); | ||
| 1643 | + | ||
| 1644 | + } | ||
| 1645 | + | ||
| 1646 | + namespace test_inline_variables | ||
| 1647 | + { | ||
| 1648 | + | ||
| 1649 | + template<class T> void f(T) | ||
| 1650 | + {} | ||
| 1651 | + | ||
| 1652 | + template<class T> inline T g(T) | ||
| 1653 | + { | ||
| 1654 | + return T{}; | ||
| 1655 | + } | ||
| 1656 | + | ||
| 1657 | + template<> inline void f<>(int) | ||
| 1658 | + {} | ||
| 1659 | + | ||
| 1660 | + template<> int g<>(int) | ||
| 1661 | + { | ||
| 1662 | + return 5; | ||
| 1663 | + } | ||
| 1664 | + | ||
| 1665 | + } | ||
| 1666 | + | ||
| 1667 | +} // namespace cxx17 | ||
| 1668 | + | ||
| 1669 | +#endif // __cplusplus < 201703L | ||
| 1670 | + | ||
| 1671 | +]]) | ||
| 1672 | diff --git a/scripts/ax_cxx_compile_stdcxx_0x.m4 b/scripts/ax_cxx_compile_stdcxx_0x.m4 | ||
| 1673 | deleted file mode 100644 | ||
| 1674 | index 5ff134a6..00000000 | ||
| 1675 | --- a/scripts/ax_cxx_compile_stdcxx_0x.m4 | ||
| 1676 | +++ /dev/null | ||
| 1677 | @@ -1,106 +0,0 @@ | ||
| 1678 | -# ============================================================================ | ||
| 1679 | -# http://www.gnu.org/software/autoconf-archive/ax_cxx_compile_stdcxx_0x.html | ||
| 1680 | -# ============================================================================ | ||
| 1681 | -# | ||
| 1682 | -# SYNOPSIS | ||
| 1683 | -# | ||
| 1684 | -# AX_CXX_COMPILE_STDCXX_0X | ||
| 1685 | -# | ||
| 1686 | -# DESCRIPTION | ||
| 1687 | -# | ||
| 1688 | -# Check for baseline language coverage in the compiler for the C++0x | ||
| 1689 | -# standard. | ||
| 1690 | -# | ||
| 1691 | -# LICENSE | ||
| 1692 | -# | ||
| 1693 | -# Copyright (c) 2008 Benjamin Kosnik <bkoz@redhat.com> | ||
| 1694 | -# | ||
| 1695 | -# Copying and distribution of this file, with or without modification, are | ||
| 1696 | -# permitted in any medium without royalty provided the copyright notice | ||
| 1697 | -# and this notice are preserved. This file is offered as-is, without any | ||
| 1698 | -# warranty. | ||
| 1699 | - | ||
| 1700 | -#serial 7 (+1) | ||
| 1701 | - | ||
| 1702 | -AU_ALIAS([AC_CXX_COMPILE_STDCXX_0X], [AX_CXX_COMPILE_STDCXX_0X]) | ||
| 1703 | -AC_DEFUN([AX_CXX_COMPILE_STDCXX_0X], [ | ||
| 1704 | - AC_CACHE_CHECK(if g++ supports C++0x features without additional flags, | ||
| 1705 | - ax_cv_cxx_compile_cxx0x_native, | ||
| 1706 | - [AC_LANG_SAVE | ||
| 1707 | - AC_LANG_CPLUSPLUS | ||
| 1708 | - AC_TRY_COMPILE([ | ||
| 1709 | - template <typename T> | ||
| 1710 | - struct check | ||
| 1711 | - { | ||
| 1712 | - static_assert(sizeof(int) <= sizeof(T), "not big enough"); | ||
| 1713 | - }; | ||
| 1714 | - | ||
| 1715 | - typedef check<check<bool>> right_angle_brackets; | ||
| 1716 | - | ||
| 1717 | - int a; | ||
| 1718 | - decltype(a) b; | ||
| 1719 | - | ||
| 1720 | - typedef check<int> check_type; | ||
| 1721 | - check_type c; | ||
| 1722 | - check_type&& cr = static_cast<check_type&&>(c);],, | ||
| 1723 | - ax_cv_cxx_compile_cxx0x_native=yes, ax_cv_cxx_compile_cxx0x_native=no) | ||
| 1724 | - AC_LANG_RESTORE | ||
| 1725 | - ]) | ||
| 1726 | - | ||
| 1727 | - AC_CACHE_CHECK(if g++ supports C++0x features with -std=c++0x, | ||
| 1728 | - ax_cv_cxx_compile_cxx0x_cxx, | ||
| 1729 | - [AC_LANG_SAVE | ||
| 1730 | - AC_LANG_CPLUSPLUS | ||
| 1731 | - ac_save_CXXFLAGS="$CXXFLAGS" | ||
| 1732 | - CXXFLAGS="$CXXFLAGS -std=c++0x" | ||
| 1733 | - AC_TRY_COMPILE([ | ||
| 1734 | - template <typename T> | ||
| 1735 | - struct check | ||
| 1736 | - { | ||
| 1737 | - static_assert(sizeof(int) <= sizeof(T), "not big enough"); | ||
| 1738 | - }; | ||
| 1739 | - | ||
| 1740 | - typedef check<check<bool>> right_angle_brackets; | ||
| 1741 | - | ||
| 1742 | - int a; | ||
| 1743 | - decltype(a) b; | ||
| 1744 | - | ||
| 1745 | - typedef check<int> check_type; | ||
| 1746 | - check_type c; | ||
| 1747 | - check_type&& cr = static_cast<check_type&&>(c);],, | ||
| 1748 | - ax_cv_cxx_compile_cxx0x_cxx=yes, ax_cv_cxx_compile_cxx0x_cxx=no) | ||
| 1749 | - CXXFLAGS="$ac_save_CXXFLAGS" | ||
| 1750 | - AC_LANG_RESTORE | ||
| 1751 | - ]) | ||
| 1752 | - | ||
| 1753 | - AC_CACHE_CHECK(if g++ supports C++0x features with -std=gnu++0x, | ||
| 1754 | - ax_cv_cxx_compile_cxx0x_gxx, | ||
| 1755 | - [AC_LANG_SAVE | ||
| 1756 | - AC_LANG_CPLUSPLUS | ||
| 1757 | - ac_save_CXXFLAGS="$CXXFLAGS" | ||
| 1758 | - CXXFLAGS="$CXXFLAGS -std=gnu++0x" | ||
| 1759 | - AC_TRY_COMPILE([ | ||
| 1760 | - template <typename T> | ||
| 1761 | - struct check | ||
| 1762 | - { | ||
| 1763 | - static_assert(sizeof(int) <= sizeof(T), "not big enough"); | ||
| 1764 | - }; | ||
| 1765 | - | ||
| 1766 | - typedef check<check<bool>> right_angle_brackets; | ||
| 1767 | - | ||
| 1768 | - int a; | ||
| 1769 | - decltype(a) b; | ||
| 1770 | - | ||
| 1771 | - typedef check<int> check_type; | ||
| 1772 | - check_type c; | ||
| 1773 | - check_type&& cr = static_cast<check_type&&>(c);],, | ||
| 1774 | - ax_cv_cxx_compile_cxx0x_gxx=yes, ax_cv_cxx_compile_cxx0x_gxx=no) | ||
| 1775 | - CXXFLAGS="$ac_save_CXXFLAGS" | ||
| 1776 | - AC_LANG_RESTORE | ||
| 1777 | - ]) | ||
| 1778 | - | ||
| 1779 | - if test "$ax_cv_cxx_compile_cxx0x_cxx" = yes; then | ||
| 1780 | - AC_DEFINE(HAVE_STDCXX_0X,, [Define if compiler supports C++0x features.]) | ||
| 1781 | - CXXFLAGS="$CXXFLAGS -std=c++0x" | ||
| 1782 | - fi | ||
| 1783 | -]) | ||
| 1784 | diff --git a/scripts/ax_cxx_compile_stdcxx_11.m4 b/scripts/ax_cxx_compile_stdcxx_11.m4 | ||
| 1785 | deleted file mode 100644 | ||
| 1786 | index 5cf70eb6..00000000 | ||
| 1787 | --- a/scripts/ax_cxx_compile_stdcxx_11.m4 | ||
| 1788 | +++ /dev/null | ||
| 1789 | @@ -1,147 +0,0 @@ | ||
| 1790 | -# ============================================================================ | ||
| 1791 | -# http://www.gnu.org/software/autoconf-archive/ax_cxx_compile_stdcxx_11.html | ||
| 1792 | -# ============================================================================ | ||
| 1793 | -# | ||
| 1794 | -# SYNOPSIS | ||
| 1795 | -# | ||
| 1796 | -# AX_CXX_COMPILE_STDCXX_11([ext|noext],[mandatory|optional]) | ||
| 1797 | -# | ||
| 1798 | -# DESCRIPTION | ||
| 1799 | -# | ||
| 1800 | -# Check for baseline language coverage in the compiler for the C++11 | ||
| 1801 | -# standard; if necessary, add switches to CXXFLAGS to enable support. | ||
| 1802 | -# | ||
| 1803 | -# The first argument, if specified, indicates whether you insist on an | ||
| 1804 | -# extended mode (e.g. -std=gnu++11) or a strict conformance mode (e.g. | ||
| 1805 | -# -std=c++11). If neither is specified, you get whatever works, with | ||
| 1806 | -# preference for an extended mode. | ||
| 1807 | -# | ||
| 1808 | -# The second argument, if specified 'mandatory' or if left unspecified, | ||
| 1809 | -# indicates that baseline C++11 support is required and that the macro | ||
| 1810 | -# should error out if no mode with that support is found. If specified | ||
| 1811 | -# 'optional', then configuration proceeds regardless, after defining | ||
| 1812 | -# HAVE_CXX11 if and only if a supporting mode is found. | ||
| 1813 | -# | ||
| 1814 | -# LICENSE | ||
| 1815 | -# | ||
| 1816 | -# Copyright (c) 2008 Benjamin Kosnik <bkoz@redhat.com> | ||
| 1817 | -# Copyright (c) 2012 Zack Weinberg <zackw@panix.com> | ||
| 1818 | -# Copyright (c) 2013 Roy Stogner <roystgnr@ices.utexas.edu> | ||
| 1819 | -# Copyright (c) 2014 Alexey Sokolov <sokolov@google.com> | ||
| 1820 | -# Copyright (c) 2014 Jari Sundell <sundell.software@gmail.com> | ||
| 1821 | -# | ||
| 1822 | -# Copying and distribution of this file, with or without modification, are | ||
| 1823 | -# permitted in any medium without royalty provided the copyright notice | ||
| 1824 | -# and this notice are preserved. This file is offered as-is, without any | ||
| 1825 | -# warranty. | ||
| 1826 | - | ||
| 1827 | -#serial 5 | ||
| 1828 | - | ||
| 1829 | -m4_define([_AX_CXX_COMPILE_STDCXX_11_testbody], [[ | ||
| 1830 | - template <typename T> | ||
| 1831 | - struct check | ||
| 1832 | - { | ||
| 1833 | - static_assert(sizeof(int) <= sizeof(T), "not big enough"); | ||
| 1834 | - }; | ||
| 1835 | - | ||
| 1836 | - struct Base { | ||
| 1837 | - virtual void f() {} | ||
| 1838 | - }; | ||
| 1839 | - struct Child : public Base { | ||
| 1840 | - virtual void f() override {} | ||
| 1841 | - }; | ||
| 1842 | - | ||
| 1843 | - typedef check<check<bool>> right_angle_brackets; | ||
| 1844 | - | ||
| 1845 | - int a; | ||
| 1846 | - decltype(a) b; | ||
| 1847 | - | ||
| 1848 | - typedef check<int> check_type; | ||
| 1849 | - check_type c; | ||
| 1850 | - check_type&& cr = static_cast<check_type&&>(c); | ||
| 1851 | - | ||
| 1852 | - auto d = a; | ||
| 1853 | - auto l = [](){}; | ||
| 1854 | - | ||
| 1855 | - void unused() { | ||
| 1856 | - l(); | ||
| 1857 | - } | ||
| 1858 | -]]) | ||
| 1859 | - | ||
| 1860 | -AC_DEFUN([AX_CXX_COMPILE_STDCXX_11], [dnl | ||
| 1861 | - m4_if([$1], [], [], | ||
| 1862 | - [$1], [ext], [], | ||
| 1863 | - [$1], [noext], [], | ||
| 1864 | - [m4_fatal([invalid argument `$1' to AX_CXX_COMPILE_STDCXX_11])])dnl | ||
| 1865 | - m4_if([$2], [], [ax_cxx_compile_cxx11_required=true], | ||
| 1866 | - [$2], [mandatory], [ax_cxx_compile_cxx11_required=true], | ||
| 1867 | - [$2], [optional], [ax_cxx_compile_cxx11_required=false], | ||
| 1868 | - [m4_fatal([invalid second argument `$2' to AX_CXX_COMPILE_STDCXX_11])]) | ||
| 1869 | - AC_LANG_PUSH([C++])dnl | ||
| 1870 | - ac_success=no | ||
| 1871 | - AC_CACHE_CHECK(whether $CXX supports C++11 features by default, | ||
| 1872 | - ax_cv_cxx_compile_cxx11, | ||
| 1873 | - [AC_COMPILE_IFELSE([AC_LANG_SOURCE([_AX_CXX_COMPILE_STDCXX_11_testbody])], | ||
| 1874 | - [ax_cv_cxx_compile_cxx11=yes], | ||
| 1875 | - [ax_cv_cxx_compile_cxx11=no])]) | ||
| 1876 | - if test x$ax_cv_cxx_compile_cxx11 = xyes; then | ||
| 1877 | - ac_success=yes | ||
| 1878 | - fi | ||
| 1879 | - | ||
| 1880 | - m4_if([$1], [noext], [], [dnl | ||
| 1881 | - if test x$ac_success = xno; then | ||
| 1882 | - for switch in -std=gnu++11 -std=gnu++0x; do | ||
| 1883 | - cachevar=AS_TR_SH([ax_cv_cxx_compile_cxx11_$switch]) | ||
| 1884 | - AC_CACHE_CHECK(whether $CXX supports C++11 features with $switch, | ||
| 1885 | - $cachevar, | ||
| 1886 | - [ac_save_CXXFLAGS="$CXXFLAGS" | ||
| 1887 | - CXXFLAGS="$CXXFLAGS $switch" | ||
| 1888 | - AC_COMPILE_IFELSE([AC_LANG_SOURCE([_AX_CXX_COMPILE_STDCXX_11_testbody])], | ||
| 1889 | - [eval $cachevar=yes], | ||
| 1890 | - [eval $cachevar=no]) | ||
| 1891 | - CXXFLAGS="$ac_save_CXXFLAGS"]) | ||
| 1892 | - if eval test x\$$cachevar = xyes; then | ||
| 1893 | - CXXFLAGS="$CXXFLAGS $switch" | ||
| 1894 | - ac_success=yes | ||
| 1895 | - break | ||
| 1896 | - fi | ||
| 1897 | - done | ||
| 1898 | - fi]) | ||
| 1899 | - | ||
| 1900 | - m4_if([$1], [ext], [], [dnl | ||
| 1901 | - if test x$ac_success = xno; then | ||
| 1902 | - for switch in -std=c++11 -std=c++0x; do | ||
| 1903 | - cachevar=AS_TR_SH([ax_cv_cxx_compile_cxx11_$switch]) | ||
| 1904 | - AC_CACHE_CHECK(whether $CXX supports C++11 features with $switch, | ||
| 1905 | - $cachevar, | ||
| 1906 | - [ac_save_CXXFLAGS="$CXXFLAGS" | ||
| 1907 | - CXXFLAGS="$CXXFLAGS $switch" | ||
| 1908 | - AC_COMPILE_IFELSE([AC_LANG_SOURCE([_AX_CXX_COMPILE_STDCXX_11_testbody])], | ||
| 1909 | - [eval $cachevar=yes], | ||
| 1910 | - [eval $cachevar=no]) | ||
| 1911 | - CXXFLAGS="$ac_save_CXXFLAGS"]) | ||
| 1912 | - if eval test x\$$cachevar = xyes; then | ||
| 1913 | - CXXFLAGS="$CXXFLAGS $switch" | ||
| 1914 | - ac_success=yes | ||
| 1915 | - break | ||
| 1916 | - fi | ||
| 1917 | - done | ||
| 1918 | - fi]) | ||
| 1919 | - AC_LANG_POP([C++]) | ||
| 1920 | - if test x$ax_cxx_compile_cxx11_required = xtrue; then | ||
| 1921 | - if test x$ac_success = xno; then | ||
| 1922 | - AC_MSG_ERROR([*** A compiler with support for C++11 language features is required.]) | ||
| 1923 | - fi | ||
| 1924 | - else | ||
| 1925 | - if test x$ac_success = xno; then | ||
| 1926 | - HAVE_CXX11=0 | ||
| 1927 | - AC_MSG_NOTICE([No compiler with C++11 support was found]) | ||
| 1928 | - else | ||
| 1929 | - HAVE_CXX11=1 | ||
| 1930 | - AC_DEFINE(HAVE_CXX11,1, | ||
| 1931 | - [define if the compiler supports basic C++11 syntax]) | ||
| 1932 | - fi | ||
| 1933 | - | ||
| 1934 | - AC_SUBST(HAVE_CXX11) | ||
| 1935 | - fi | ||
| 1936 | -]) | ||
| 1937 | diff --git a/scripts/ax_pthread.m4 b/scripts/ax_pthread.m4 | ||
| 1938 | old mode 100644 | ||
| 1939 | new mode 100755 | ||
| 1940 | index 27f2533c..9f35d139 | ||
| 1941 | --- a/scripts/ax_pthread.m4 | ||
| 1942 | +++ b/scripts/ax_pthread.m4 | ||
| 1943 | @@ -1,5 +1,5 @@ | ||
| 1944 | # =========================================================================== | ||
| 1945 | -# http://www.gnu.org/software/autoconf-archive/ax_pthread.html | ||
| 1946 | +# https://www.gnu.org/software/autoconf-archive/ax_pthread.html | ||
| 1947 | # =========================================================================== | ||
| 1948 | # | ||
| 1949 | # SYNOPSIS | ||
| 1950 | @@ -14,24 +14,28 @@ | ||
| 1951 | # flags that are needed. (The user can also force certain compiler | ||
| 1952 | # flags/libs to be tested by setting these environment variables.) | ||
| 1953 | # | ||
| 1954 | -# Also sets PTHREAD_CC to any special C compiler that is needed for | ||
| 1955 | -# multi-threaded programs (defaults to the value of CC otherwise). (This | ||
| 1956 | -# is necessary on AIX to use the special cc_r compiler alias.) | ||
| 1957 | +# Also sets PTHREAD_CC and PTHREAD_CXX to any special C compiler that is | ||
| 1958 | +# needed for multi-threaded programs (defaults to the value of CC | ||
| 1959 | +# respectively CXX otherwise). (This is necessary on e.g. AIX to use the | ||
| 1960 | +# special cc_r/CC_r compiler alias.) | ||
| 1961 | # | ||
| 1962 | # NOTE: You are assumed to not only compile your program with these flags, | ||
| 1963 | -# but also link it with them as well. e.g. you should link with | ||
| 1964 | +# but also to link with them as well. For example, you might link with | ||
| 1965 | # $PTHREAD_CC $CFLAGS $PTHREAD_CFLAGS $LDFLAGS ... $PTHREAD_LIBS $LIBS | ||
| 1966 | +# $PTHREAD_CXX $CXXFLAGS $PTHREAD_CFLAGS $LDFLAGS ... $PTHREAD_LIBS $LIBS | ||
| 1967 | # | ||
| 1968 | -# If you are only building threads programs, you may wish to use these | ||
| 1969 | +# If you are only building threaded programs, you may wish to use these | ||
| 1970 | # variables in your default LIBS, CFLAGS, and CC: | ||
| 1971 | # | ||
| 1972 | # LIBS="$PTHREAD_LIBS $LIBS" | ||
| 1973 | # CFLAGS="$CFLAGS $PTHREAD_CFLAGS" | ||
| 1974 | +# CXXFLAGS="$CXXFLAGS $PTHREAD_CFLAGS" | ||
| 1975 | # CC="$PTHREAD_CC" | ||
| 1976 | +# CXX="$PTHREAD_CXX" | ||
| 1977 | # | ||
| 1978 | # In addition, if the PTHREAD_CREATE_JOINABLE thread-attribute constant | ||
| 1979 | -# has a nonstandard name, defines PTHREAD_CREATE_JOINABLE to that name | ||
| 1980 | -# (e.g. PTHREAD_CREATE_UNDETACHED on AIX). | ||
| 1981 | +# has a nonstandard name, this macro defines PTHREAD_CREATE_JOINABLE to | ||
| 1982 | +# that name (e.g. PTHREAD_CREATE_UNDETACHED on AIX). | ||
| 1983 | # | ||
| 1984 | # Also HAVE_PTHREAD_PRIO_INHERIT is defined if pthread is found and the | ||
| 1985 | # PTHREAD_PRIO_INHERIT symbol is defined when compiling with | ||
| 1986 | @@ -55,6 +59,7 @@ | ||
| 1987 | # | ||
| 1988 | # Copyright (c) 2008 Steven G. Johnson <stevenj@alum.mit.edu> | ||
| 1989 | # Copyright (c) 2011 Daniel Richard G. <skunk@iSKUNK.ORG> | ||
| 1990 | +# Copyright (c) 2019 Marc Stevens <marc.stevens@cwi.nl> | ||
| 1991 | # | ||
| 1992 | # This program is free software: you can redistribute it and/or modify it | ||
| 1993 | # under the terms of the GNU General Public License as published by the | ||
| 1994 | @@ -67,7 +72,7 @@ | ||
| 1995 | # Public License for more details. | ||
| 1996 | # | ||
| 1997 | # You should have received a copy of the GNU General Public License along | ||
| 1998 | -# with this program. If not, see <http://www.gnu.org/licenses/>. | ||
| 1999 | +# with this program. If not, see <https://www.gnu.org/licenses/>. | ||
| 2000 | # | ||
| 2001 | # As a special exception, the respective Autoconf Macro's copyright owner | ||
| 2002 | # gives unlimited permission to copy, distribute and modify the configure | ||
| 2003 | @@ -82,35 +87,41 @@ | ||
| 2004 | # modified version of the Autoconf Macro, you may extend this special | ||
| 2005 | # exception to the GPL to apply to your modified version as well. | ||
| 2006 | |||
| 2007 | -#serial 17 | ||
| 2008 | +#serial 31 | ||
| 2009 | |||
| 2010 | AU_ALIAS([ACX_PTHREAD], [AX_PTHREAD]) | ||
| 2011 | AC_DEFUN([AX_PTHREAD], [ | ||
| 2012 | AC_REQUIRE([AC_CANONICAL_HOST]) | ||
| 2013 | +AC_REQUIRE([AC_PROG_CC]) | ||
| 2014 | +AC_REQUIRE([AC_PROG_SED]) | ||
| 2015 | AC_LANG_PUSH([C]) | ||
| 2016 | ax_pthread_ok=no | ||
| 2017 | |||
| 2018 | # We used to check for pthread.h first, but this fails if pthread.h | ||
| 2019 | -# requires special compiler flags (e.g. on True64 or Sequent). | ||
| 2020 | +# requires special compiler flags (e.g. on Tru64 or Sequent). | ||
| 2021 | # It gets checked for in the link test anyway. | ||
| 2022 | |||
| 2023 | # First of all, check if the user has set any of the PTHREAD_LIBS, | ||
| 2024 | # etcetera environment variables, and if threads linking works using | ||
| 2025 | # them: | ||
| 2026 | -if test x"$PTHREAD_LIBS$PTHREAD_CFLAGS" != x; then | ||
| 2027 | - save_CFLAGS="$CFLAGS" | ||
| 2028 | +if test "x$PTHREAD_CFLAGS$PTHREAD_LIBS" != "x"; then | ||
| 2029 | + ax_pthread_save_CC="$CC" | ||
| 2030 | + ax_pthread_save_CFLAGS="$CFLAGS" | ||
| 2031 | + ax_pthread_save_LIBS="$LIBS" | ||
| 2032 | + AS_IF([test "x$PTHREAD_CC" != "x"], [CC="$PTHREAD_CC"]) | ||
| 2033 | + AS_IF([test "x$PTHREAD_CXX" != "x"], [CXX="$PTHREAD_CXX"]) | ||
| 2034 | CFLAGS="$CFLAGS $PTHREAD_CFLAGS" | ||
| 2035 | - save_LIBS="$LIBS" | ||
| 2036 | LIBS="$PTHREAD_LIBS $LIBS" | ||
| 2037 | - AC_MSG_CHECKING([for pthread_join in LIBS=$PTHREAD_LIBS with CFLAGS=$PTHREAD_CFLAGS]) | ||
| 2038 | - AC_TRY_LINK_FUNC(pthread_join, ax_pthread_ok=yes) | ||
| 2039 | - AC_MSG_RESULT($ax_pthread_ok) | ||
| 2040 | - if test x"$ax_pthread_ok" = xno; then | ||
| 2041 | + AC_MSG_CHECKING([for pthread_join using $CC $PTHREAD_CFLAGS $PTHREAD_LIBS]) | ||
| 2042 | + AC_LINK_IFELSE([AC_LANG_CALL([], [pthread_join])], [ax_pthread_ok=yes]) | ||
| 2043 | + AC_MSG_RESULT([$ax_pthread_ok]) | ||
| 2044 | + if test "x$ax_pthread_ok" = "xno"; then | ||
| 2045 | PTHREAD_LIBS="" | ||
| 2046 | PTHREAD_CFLAGS="" | ||
| 2047 | fi | ||
| 2048 | - LIBS="$save_LIBS" | ||
| 2049 | - CFLAGS="$save_CFLAGS" | ||
| 2050 | + CC="$ax_pthread_save_CC" | ||
| 2051 | + CFLAGS="$ax_pthread_save_CFLAGS" | ||
| 2052 | + LIBS="$ax_pthread_save_LIBS" | ||
| 2053 | fi | ||
| 2054 | |||
| 2055 | # We must check for the threads library under a number of different | ||
| 2056 | @@ -118,12 +129,14 @@ fi | ||
| 2057 | # (e.g. DEC) have both -lpthread and -lpthreads, where one of the | ||
| 2058 | # libraries is broken (non-POSIX). | ||
| 2059 | |||
| 2060 | -# Create a list of thread flags to try. Items starting with a "-" are | ||
| 2061 | -# C compiler flags, and other items are library names, except for "none" | ||
| 2062 | -# which indicates that we try without any flags at all, and "pthread-config" | ||
| 2063 | -# which is a program returning the flags for the Pth emulation library. | ||
| 2064 | +# Create a list of thread flags to try. Items with a "," contain both | ||
| 2065 | +# C compiler flags (before ",") and linker flags (after ","). Other items | ||
| 2066 | +# starting with a "-" are C compiler flags, and remaining items are | ||
| 2067 | +# library names, except for "none" which indicates that we try without | ||
| 2068 | +# any flags at all, and "pthread-config" which is a program returning | ||
| 2069 | +# the flags for the Pth emulation library. | ||
| 2070 | |||
| 2071 | -ax_pthread_flags="none pthreads -Kthread -kthread lthread -pthread -pthreads -mthreads pthread --thread-safe -mt pthread-config" | ||
| 2072 | +ax_pthread_flags="pthreads none -Kthread -pthread -pthreads -mthreads pthread --thread-safe -mt pthread-config" | ||
| 2073 | |||
| 2074 | # The ordering *is* (sometimes) important. Some notes on the | ||
| 2075 | # individual items follow: | ||
| 2076 | @@ -132,68 +145,163 @@ ax_pthread_flags="none pthreads -Kthread -kthread lthread -pthread -pthreads -mt | ||
| 2077 | # none: in case threads are in libc; should be tried before -Kthread and | ||
| 2078 | # other compiler flags to prevent continual compiler warnings | ||
| 2079 | # -Kthread: Sequent (threads in libc, but -Kthread needed for pthread.h) | ||
| 2080 | -# -kthread: FreeBSD kernel threads (preferred to -pthread since SMP-able) | ||
| 2081 | -# lthread: LinuxThreads port on FreeBSD (also preferred to -pthread) | ||
| 2082 | -# -pthread: Linux/gcc (kernel threads), BSD/gcc (userland threads) | ||
| 2083 | -# -pthreads: Solaris/gcc | ||
| 2084 | -# -mthreads: Mingw32/gcc, Lynx/gcc | ||
| 2085 | +# -pthread: Linux/gcc (kernel threads), BSD/gcc (userland threads), Tru64 | ||
| 2086 | +# (Note: HP C rejects this with "bad form for `-t' option") | ||
| 2087 | +# -pthreads: Solaris/gcc (Note: HP C also rejects) | ||
| 2088 | # -mt: Sun Workshop C (may only link SunOS threads [-lthread], but it | ||
| 2089 | -# doesn't hurt to check since this sometimes defines pthreads too; | ||
| 2090 | -# also defines -D_REENTRANT) | ||
| 2091 | -# ... -mt is also the pthreads flag for HP/aCC | ||
| 2092 | +# doesn't hurt to check since this sometimes defines pthreads and | ||
| 2093 | +# -D_REENTRANT too), HP C (must be checked before -lpthread, which | ||
| 2094 | +# is present but should not be used directly; and before -mthreads, | ||
| 2095 | +# because the compiler interprets this as "-mt" + "-hreads") | ||
| 2096 | +# -mthreads: Mingw32/gcc, Lynx/gcc | ||
| 2097 | # pthread: Linux, etcetera | ||
| 2098 | # --thread-safe: KAI C++ | ||
| 2099 | # pthread-config: use pthread-config program (for GNU Pth library) | ||
| 2100 | |||
| 2101 | -case "${host_cpu}-${host_os}" in | ||
| 2102 | - *solaris*) | ||
| 2103 | +case $host_os in | ||
| 2104 | + | ||
| 2105 | + freebsd*) | ||
| 2106 | + | ||
| 2107 | + # -kthread: FreeBSD kernel threads (preferred to -pthread since SMP-able) | ||
| 2108 | + # lthread: LinuxThreads port on FreeBSD (also preferred to -pthread) | ||
| 2109 | + | ||
| 2110 | + ax_pthread_flags="-kthread lthread $ax_pthread_flags" | ||
| 2111 | + ;; | ||
| 2112 | + | ||
| 2113 | + hpux*) | ||
| 2114 | + | ||
| 2115 | + # From the cc(1) man page: "[-mt] Sets various -D flags to enable | ||
| 2116 | + # multi-threading and also sets -lpthread." | ||
| 2117 | + | ||
| 2118 | + ax_pthread_flags="-mt -pthread pthread $ax_pthread_flags" | ||
| 2119 | + ;; | ||
| 2120 | + | ||
| 2121 | + openedition*) | ||
| 2122 | + | ||
| 2123 | + # IBM z/OS requires a feature-test macro to be defined in order to | ||
| 2124 | + # enable POSIX threads at all, so give the user a hint if this is | ||
| 2125 | + # not set. (We don't define these ourselves, as they can affect | ||
| 2126 | + # other portions of the system API in unpredictable ways.) | ||
| 2127 | + | ||
| 2128 | + AC_EGREP_CPP([AX_PTHREAD_ZOS_MISSING], | ||
| 2129 | + [ | ||
| 2130 | +# if !defined(_OPEN_THREADS) && !defined(_UNIX03_THREADS) | ||
| 2131 | + AX_PTHREAD_ZOS_MISSING | ||
| 2132 | +# endif | ||
| 2133 | + ], | ||
| 2134 | + [AC_MSG_WARN([IBM z/OS requires -D_OPEN_THREADS or -D_UNIX03_THREADS to enable pthreads support.])]) | ||
| 2135 | + ;; | ||
| 2136 | + | ||
| 2137 | + solaris*) | ||
| 2138 | |||
| 2139 | # On Solaris (at least, for some versions), libc contains stubbed | ||
| 2140 | # (non-functional) versions of the pthreads routines, so link-based | ||
| 2141 | - # tests will erroneously succeed. (We need to link with -pthreads/-mt/ | ||
| 2142 | - # -lpthread.) (The stubs are missing pthread_cleanup_push, or rather | ||
| 2143 | - # a function called by this macro, so we could check for that, but | ||
| 2144 | - # who knows whether they'll stub that too in a future libc.) So, | ||
| 2145 | - # we'll just look for -pthreads and -lpthread first: | ||
| 2146 | + # tests will erroneously succeed. (N.B.: The stubs are missing | ||
| 2147 | + # pthread_cleanup_push, or rather a function called by this macro, | ||
| 2148 | + # so we could check for that, but who knows whether they'll stub | ||
| 2149 | + # that too in a future libc.) So we'll check first for the | ||
| 2150 | + # standard Solaris way of linking pthreads (-mt -lpthread). | ||
| 2151 | |||
| 2152 | - ax_pthread_flags="-pthreads pthread -mt -pthread $ax_pthread_flags" | ||
| 2153 | + ax_pthread_flags="-mt,-lpthread pthread $ax_pthread_flags" | ||
| 2154 | ;; | ||
| 2155 | +esac | ||
| 2156 | |||
| 2157 | - *-darwin*) | ||
| 2158 | - ax_pthread_flags="none -pthread $ax_pthread_flags" | ||
| 2159 | +# Are we compiling with Clang? | ||
| 2160 | + | ||
| 2161 | +AC_CACHE_CHECK([whether $CC is Clang], | ||
| 2162 | + [ax_cv_PTHREAD_CLANG], | ||
| 2163 | + [ax_cv_PTHREAD_CLANG=no | ||
| 2164 | + # Note that Autoconf sets GCC=yes for Clang as well as GCC | ||
| 2165 | + if test "x$GCC" = "xyes"; then | ||
| 2166 | + AC_EGREP_CPP([AX_PTHREAD_CC_IS_CLANG], | ||
| 2167 | + [/* Note: Clang 2.7 lacks __clang_[a-z]+__ */ | ||
| 2168 | +# if defined(__clang__) && defined(__llvm__) | ||
| 2169 | + AX_PTHREAD_CC_IS_CLANG | ||
| 2170 | +# endif | ||
| 2171 | + ], | ||
| 2172 | + [ax_cv_PTHREAD_CLANG=yes]) | ||
| 2173 | + fi | ||
| 2174 | + ]) | ||
| 2175 | +ax_pthread_clang="$ax_cv_PTHREAD_CLANG" | ||
| 2176 | + | ||
| 2177 | + | ||
| 2178 | +# GCC generally uses -pthread, or -pthreads on some platforms (e.g. SPARC) | ||
| 2179 | + | ||
| 2180 | +# Note that for GCC and Clang -pthread generally implies -lpthread, | ||
| 2181 | +# except when -nostdlib is passed. | ||
| 2182 | +# This is problematic using libtool to build C++ shared libraries with pthread: | ||
| 2183 | +# [1] https://gcc.gnu.org/bugzilla/show_bug.cgi?id=25460 | ||
| 2184 | +# [2] https://bugzilla.redhat.com/show_bug.cgi?id=661333 | ||
| 2185 | +# [3] https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=468555 | ||
| 2186 | +# To solve this, first try -pthread together with -lpthread for GCC | ||
| 2187 | + | ||
| 2188 | +AS_IF([test "x$GCC" = "xyes"], | ||
| 2189 | + [ax_pthread_flags="-pthread,-lpthread -pthread -pthreads $ax_pthread_flags"]) | ||
| 2190 | + | ||
| 2191 | +# Clang takes -pthread (never supported any other flag), but we'll try with -lpthread first | ||
| 2192 | + | ||
| 2193 | +AS_IF([test "x$ax_pthread_clang" = "xyes"], | ||
| 2194 | + [ax_pthread_flags="-pthread,-lpthread -pthread"]) | ||
| 2195 | + | ||
| 2196 | + | ||
| 2197 | +# The presence of a feature test macro requesting re-entrant function | ||
| 2198 | +# definitions is, on some systems, a strong hint that pthreads support is | ||
| 2199 | +# correctly enabled | ||
| 2200 | + | ||
| 2201 | +case $host_os in | ||
| 2202 | + darwin* | hpux* | linux* | osf* | solaris*) | ||
| 2203 | + ax_pthread_check_macro="_REENTRANT" | ||
| 2204 | + ;; | ||
| 2205 | + | ||
| 2206 | + aix*) | ||
| 2207 | + ax_pthread_check_macro="_THREAD_SAFE" | ||
| 2208 | + ;; | ||
| 2209 | + | ||
| 2210 | + *) | ||
| 2211 | + ax_pthread_check_macro="--" | ||
| 2212 | ;; | ||
| 2213 | esac | ||
| 2214 | +AS_IF([test "x$ax_pthread_check_macro" = "x--"], | ||
| 2215 | + [ax_pthread_check_cond=0], | ||
| 2216 | + [ax_pthread_check_cond="!defined($ax_pthread_check_macro)"]) | ||
| 2217 | + | ||
| 2218 | |||
| 2219 | -if test x"$ax_pthread_ok" = xno; then | ||
| 2220 | -for flag in $ax_pthread_flags; do | ||
| 2221 | +if test "x$ax_pthread_ok" = "xno"; then | ||
| 2222 | +for ax_pthread_try_flag in $ax_pthread_flags; do | ||
| 2223 | |||
| 2224 | - case $flag in | ||
| 2225 | + case $ax_pthread_try_flag in | ||
| 2226 | none) | ||
| 2227 | AC_MSG_CHECKING([whether pthreads work without any flags]) | ||
| 2228 | ;; | ||
| 2229 | |||
| 2230 | + *,*) | ||
| 2231 | + PTHREAD_CFLAGS=`echo $ax_pthread_try_flag | sed "s/^\(.*\),\(.*\)$/\1/"` | ||
| 2232 | + PTHREAD_LIBS=`echo $ax_pthread_try_flag | sed "s/^\(.*\),\(.*\)$/\2/"` | ||
| 2233 | + AC_MSG_CHECKING([whether pthreads work with "$PTHREAD_CFLAGS" and "$PTHREAD_LIBS"]) | ||
| 2234 | + ;; | ||
| 2235 | + | ||
| 2236 | -*) | ||
| 2237 | - AC_MSG_CHECKING([whether pthreads work with $flag]) | ||
| 2238 | - PTHREAD_CFLAGS="$flag" | ||
| 2239 | + AC_MSG_CHECKING([whether pthreads work with $ax_pthread_try_flag]) | ||
| 2240 | + PTHREAD_CFLAGS="$ax_pthread_try_flag" | ||
| 2241 | ;; | ||
| 2242 | |||
| 2243 | pthread-config) | ||
| 2244 | - AC_CHECK_PROG(ax_pthread_config, pthread-config, yes, no) | ||
| 2245 | - if test x"$ax_pthread_config" = xno; then continue; fi | ||
| 2246 | + AC_CHECK_PROG([ax_pthread_config], [pthread-config], [yes], [no]) | ||
| 2247 | + AS_IF([test "x$ax_pthread_config" = "xno"], [continue]) | ||
| 2248 | PTHREAD_CFLAGS="`pthread-config --cflags`" | ||
| 2249 | PTHREAD_LIBS="`pthread-config --ldflags` `pthread-config --libs`" | ||
| 2250 | ;; | ||
| 2251 | |||
| 2252 | *) | ||
| 2253 | - AC_MSG_CHECKING([for the pthreads library -l$flag]) | ||
| 2254 | - PTHREAD_LIBS="-l$flag" | ||
| 2255 | + AC_MSG_CHECKING([for the pthreads library -l$ax_pthread_try_flag]) | ||
| 2256 | + PTHREAD_LIBS="-l$ax_pthread_try_flag" | ||
| 2257 | ;; | ||
| 2258 | esac | ||
| 2259 | |||
| 2260 | - save_LIBS="$LIBS" | ||
| 2261 | - save_CFLAGS="$CFLAGS" | ||
| 2262 | - LIBS="$PTHREAD_LIBS $LIBS" | ||
| 2263 | + ax_pthread_save_CFLAGS="$CFLAGS" | ||
| 2264 | + ax_pthread_save_LIBS="$LIBS" | ||
| 2265 | CFLAGS="$CFLAGS $PTHREAD_CFLAGS" | ||
| 2266 | + LIBS="$PTHREAD_LIBS $LIBS" | ||
| 2267 | |||
| 2268 | # Check for various functions. We must include pthread.h, | ||
| 2269 | # since some functions may be macros. (On the Sequent, we | ||
| 2270 | @@ -204,8 +312,18 @@ for flag in $ax_pthread_flags; do | ||
| 2271 | # pthread_cleanup_push because it is one of the few pthread | ||
| 2272 | # functions on Solaris that doesn't have a non-functional libc stub. | ||
| 2273 | # We try pthread_create on general principles. | ||
| 2274 | + | ||
| 2275 | AC_LINK_IFELSE([AC_LANG_PROGRAM([#include <pthread.h> | ||
| 2276 | - static void routine(void *a) { a = 0; } | ||
| 2277 | +# if $ax_pthread_check_cond | ||
| 2278 | +# error "$ax_pthread_check_macro must be defined" | ||
| 2279 | +# endif | ||
| 2280 | + static void *some_global = NULL; | ||
| 2281 | + static void routine(void *a) | ||
| 2282 | + { | ||
| 2283 | + /* To avoid any unused-parameter or | ||
| 2284 | + unused-but-set-parameter warning. */ | ||
| 2285 | + some_global = a; | ||
| 2286 | + } | ||
| 2287 | static void *start_routine(void *a) { return a; }], | ||
| 2288 | [pthread_t th; pthread_attr_t attr; | ||
| 2289 | pthread_create(&th, 0, start_routine, 0); | ||
| 2290 | @@ -213,93 +331,188 @@ for flag in $ax_pthread_flags; do | ||
| 2291 | pthread_attr_init(&attr); | ||
| 2292 | pthread_cleanup_push(routine, 0); | ||
| 2293 | pthread_cleanup_pop(0) /* ; */])], | ||
| 2294 | - [ax_pthread_ok=yes], | ||
| 2295 | - []) | ||
| 2296 | + [ax_pthread_ok=yes], | ||
| 2297 | + []) | ||
| 2298 | |||
| 2299 | - LIBS="$save_LIBS" | ||
| 2300 | - CFLAGS="$save_CFLAGS" | ||
| 2301 | + CFLAGS="$ax_pthread_save_CFLAGS" | ||
| 2302 | + LIBS="$ax_pthread_save_LIBS" | ||
| 2303 | |||
| 2304 | - AC_MSG_RESULT($ax_pthread_ok) | ||
| 2305 | - if test "x$ax_pthread_ok" = xyes; then | ||
| 2306 | - break; | ||
| 2307 | - fi | ||
| 2308 | + AC_MSG_RESULT([$ax_pthread_ok]) | ||
| 2309 | + AS_IF([test "x$ax_pthread_ok" = "xyes"], [break]) | ||
| 2310 | |||
| 2311 | PTHREAD_LIBS="" | ||
| 2312 | PTHREAD_CFLAGS="" | ||
| 2313 | done | ||
| 2314 | fi | ||
| 2315 | |||
| 2316 | + | ||
| 2317 | +# Clang needs special handling, because older versions handle the -pthread | ||
| 2318 | +# option in a rather... idiosyncratic way | ||
| 2319 | + | ||
| 2320 | +if test "x$ax_pthread_clang" = "xyes"; then | ||
| 2321 | + | ||
| 2322 | + # Clang takes -pthread; it has never supported any other flag | ||
| 2323 | + | ||
| 2324 | + # (Note 1: This will need to be revisited if a system that Clang | ||
| 2325 | + # supports has POSIX threads in a separate library. This tends not | ||
| 2326 | + # to be the way of modern systems, but it's conceivable.) | ||
| 2327 | + | ||
| 2328 | + # (Note 2: On some systems, notably Darwin, -pthread is not needed | ||
| 2329 | + # to get POSIX threads support; the API is always present and | ||
| 2330 | + # active. We could reasonably leave PTHREAD_CFLAGS empty. But | ||
| 2331 | + # -pthread does define _REENTRANT, and while the Darwin headers | ||
| 2332 | + # ignore this macro, third-party headers might not.) | ||
| 2333 | + | ||
| 2334 | + # However, older versions of Clang make a point of warning the user | ||
| 2335 | + # that, in an invocation where only linking and no compilation is | ||
| 2336 | + # taking place, the -pthread option has no effect ("argument unused | ||
| 2337 | + # during compilation"). They expect -pthread to be passed in only | ||
| 2338 | + # when source code is being compiled. | ||
| 2339 | + # | ||
| 2340 | + # Problem is, this is at odds with the way Automake and most other | ||
| 2341 | + # C build frameworks function, which is that the same flags used in | ||
| 2342 | + # compilation (CFLAGS) are also used in linking. Many systems | ||
| 2343 | + # supported by AX_PTHREAD require exactly this for POSIX threads | ||
| 2344 | + # support, and in fact it is often not straightforward to specify a | ||
| 2345 | + # flag that is used only in the compilation phase and not in | ||
| 2346 | + # linking. Such a scenario is extremely rare in practice. | ||
| 2347 | + # | ||
| 2348 | + # Even though use of the -pthread flag in linking would only print | ||
| 2349 | + # a warning, this can be a nuisance for well-run software projects | ||
| 2350 | + # that build with -Werror. So if the active version of Clang has | ||
| 2351 | + # this misfeature, we search for an option to squash it. | ||
| 2352 | + | ||
| 2353 | + AC_CACHE_CHECK([whether Clang needs flag to prevent "argument unused" warning when linking with -pthread], | ||
| 2354 | + [ax_cv_PTHREAD_CLANG_NO_WARN_FLAG], | ||
| 2355 | + [ax_cv_PTHREAD_CLANG_NO_WARN_FLAG=unknown | ||
| 2356 | + # Create an alternate version of $ac_link that compiles and | ||
| 2357 | + # links in two steps (.c -> .o, .o -> exe) instead of one | ||
| 2358 | + # (.c -> exe), because the warning occurs only in the second | ||
| 2359 | + # step | ||
| 2360 | + ax_pthread_save_ac_link="$ac_link" | ||
| 2361 | + ax_pthread_sed='s/conftest\.\$ac_ext/conftest.$ac_objext/g' | ||
| 2362 | + ax_pthread_link_step=`AS_ECHO(["$ac_link"]) | sed "$ax_pthread_sed"` | ||
| 2363 | + ax_pthread_2step_ac_link="($ac_compile) && (echo ==== >&5) && ($ax_pthread_link_step)" | ||
| 2364 | + ax_pthread_save_CFLAGS="$CFLAGS" | ||
| 2365 | + for ax_pthread_try in '' -Qunused-arguments -Wno-unused-command-line-argument unknown; do | ||
| 2366 | + AS_IF([test "x$ax_pthread_try" = "xunknown"], [break]) | ||
| 2367 | + CFLAGS="-Werror -Wunknown-warning-option $ax_pthread_try -pthread $ax_pthread_save_CFLAGS" | ||
| 2368 | + ac_link="$ax_pthread_save_ac_link" | ||
| 2369 | + AC_LINK_IFELSE([AC_LANG_SOURCE([[int main(void){return 0;}]])], | ||
| 2370 | + [ac_link="$ax_pthread_2step_ac_link" | ||
| 2371 | + AC_LINK_IFELSE([AC_LANG_SOURCE([[int main(void){return 0;}]])], | ||
| 2372 | + [break]) | ||
| 2373 | + ]) | ||
| 2374 | + done | ||
| 2375 | + ac_link="$ax_pthread_save_ac_link" | ||
| 2376 | + CFLAGS="$ax_pthread_save_CFLAGS" | ||
| 2377 | + AS_IF([test "x$ax_pthread_try" = "x"], [ax_pthread_try=no]) | ||
| 2378 | + ax_cv_PTHREAD_CLANG_NO_WARN_FLAG="$ax_pthread_try" | ||
| 2379 | + ]) | ||
| 2380 | + | ||
| 2381 | + case "$ax_cv_PTHREAD_CLANG_NO_WARN_FLAG" in | ||
| 2382 | + no | unknown) ;; | ||
| 2383 | + *) PTHREAD_CFLAGS="$ax_cv_PTHREAD_CLANG_NO_WARN_FLAG $PTHREAD_CFLAGS" ;; | ||
| 2384 | + esac | ||
| 2385 | + | ||
| 2386 | +fi # $ax_pthread_clang = yes | ||
| 2387 | + | ||
| 2388 | + | ||
| 2389 | + | ||
| 2390 | # Various other checks: | ||
| 2391 | -if test "x$ax_pthread_ok" = xyes; then | ||
| 2392 | - save_LIBS="$LIBS" | ||
| 2393 | - LIBS="$PTHREAD_LIBS $LIBS" | ||
| 2394 | - save_CFLAGS="$CFLAGS" | ||
| 2395 | +if test "x$ax_pthread_ok" = "xyes"; then | ||
| 2396 | + ax_pthread_save_CFLAGS="$CFLAGS" | ||
| 2397 | + ax_pthread_save_LIBS="$LIBS" | ||
| 2398 | CFLAGS="$CFLAGS $PTHREAD_CFLAGS" | ||
| 2399 | + LIBS="$PTHREAD_LIBS $LIBS" | ||
| 2400 | |||
| 2401 | # Detect AIX lossage: JOINABLE attribute is called UNDETACHED. | ||
| 2402 | - AC_MSG_CHECKING([for joinable pthread attribute]) | ||
| 2403 | - attr_name=unknown | ||
| 2404 | - for attr in PTHREAD_CREATE_JOINABLE PTHREAD_CREATE_UNDETACHED; do | ||
| 2405 | - AC_LINK_IFELSE([AC_LANG_PROGRAM([#include <pthread.h>], | ||
| 2406 | - [int attr = $attr; return attr /* ; */])], | ||
| 2407 | - [attr_name=$attr; break], | ||
| 2408 | - []) | ||
| 2409 | - done | ||
| 2410 | - AC_MSG_RESULT($attr_name) | ||
| 2411 | - if test "$attr_name" != PTHREAD_CREATE_JOINABLE; then | ||
| 2412 | - AC_DEFINE_UNQUOTED(PTHREAD_CREATE_JOINABLE, $attr_name, | ||
| 2413 | - [Define to necessary symbol if this constant | ||
| 2414 | - uses a non-standard name on your system.]) | ||
| 2415 | - fi | ||
| 2416 | + AC_CACHE_CHECK([for joinable pthread attribute], | ||
| 2417 | + [ax_cv_PTHREAD_JOINABLE_ATTR], | ||
| 2418 | + [ax_cv_PTHREAD_JOINABLE_ATTR=unknown | ||
| 2419 | + for ax_pthread_attr in PTHREAD_CREATE_JOINABLE PTHREAD_CREATE_UNDETACHED; do | ||
| 2420 | + AC_LINK_IFELSE([AC_LANG_PROGRAM([#include <pthread.h>], | ||
| 2421 | + [int attr = $ax_pthread_attr; return attr /* ; */])], | ||
| 2422 | + [ax_cv_PTHREAD_JOINABLE_ATTR=$ax_pthread_attr; break], | ||
| 2423 | + []) | ||
| 2424 | + done | ||
| 2425 | + ]) | ||
| 2426 | + AS_IF([test "x$ax_cv_PTHREAD_JOINABLE_ATTR" != "xunknown" && \ | ||
| 2427 | + test "x$ax_cv_PTHREAD_JOINABLE_ATTR" != "xPTHREAD_CREATE_JOINABLE" && \ | ||
| 2428 | + test "x$ax_pthread_joinable_attr_defined" != "xyes"], | ||
| 2429 | + [AC_DEFINE_UNQUOTED([PTHREAD_CREATE_JOINABLE], | ||
| 2430 | + [$ax_cv_PTHREAD_JOINABLE_ATTR], | ||
| 2431 | + [Define to necessary symbol if this constant | ||
| 2432 | + uses a non-standard name on your system.]) | ||
| 2433 | + ax_pthread_joinable_attr_defined=yes | ||
| 2434 | + ]) | ||
| 2435 | |||
| 2436 | - AC_MSG_CHECKING([if more special flags are required for pthreads]) | ||
| 2437 | - flag=no | ||
| 2438 | - case "${host_cpu}-${host_os}" in | ||
| 2439 | - *-aix* | *-freebsd* | *-darwin*) flag="-D_THREAD_SAFE";; | ||
| 2440 | - *-osf* | *-hpux*) flag="-D_REENTRANT";; | ||
| 2441 | - *solaris*) | ||
| 2442 | - if test "$GCC" = "yes"; then | ||
| 2443 | - flag="-D_REENTRANT" | ||
| 2444 | - else | ||
| 2445 | - flag="-mt -D_REENTRANT" | ||
| 2446 | - fi | ||
| 2447 | - ;; | ||
| 2448 | - esac | ||
| 2449 | - AC_MSG_RESULT(${flag}) | ||
| 2450 | - if test "x$flag" != xno; then | ||
| 2451 | - PTHREAD_CFLAGS="$flag $PTHREAD_CFLAGS" | ||
| 2452 | - fi | ||
| 2453 | + AC_CACHE_CHECK([whether more special flags are required for pthreads], | ||
| 2454 | + [ax_cv_PTHREAD_SPECIAL_FLAGS], | ||
| 2455 | + [ax_cv_PTHREAD_SPECIAL_FLAGS=no | ||
| 2456 | + case $host_os in | ||
| 2457 | + solaris*) | ||
| 2458 | + ax_cv_PTHREAD_SPECIAL_FLAGS="-D_POSIX_PTHREAD_SEMANTICS" | ||
| 2459 | + ;; | ||
| 2460 | + esac | ||
| 2461 | + ]) | ||
| 2462 | + AS_IF([test "x$ax_cv_PTHREAD_SPECIAL_FLAGS" != "xno" && \ | ||
| 2463 | + test "x$ax_pthread_special_flags_added" != "xyes"], | ||
| 2464 | + [PTHREAD_CFLAGS="$ax_cv_PTHREAD_SPECIAL_FLAGS $PTHREAD_CFLAGS" | ||
| 2465 | + ax_pthread_special_flags_added=yes]) | ||
| 2466 | |||
| 2467 | AC_CACHE_CHECK([for PTHREAD_PRIO_INHERIT], | ||
| 2468 | - ax_cv_PTHREAD_PRIO_INHERIT, [ | ||
| 2469 | - AC_LINK_IFELSE([ | ||
| 2470 | - AC_LANG_PROGRAM([[#include <pthread.h>]], [[int i = PTHREAD_PRIO_INHERIT;]])], | ||
| 2471 | - [ax_cv_PTHREAD_PRIO_INHERIT=yes], | ||
| 2472 | - [ax_cv_PTHREAD_PRIO_INHERIT=no]) | ||
| 2473 | + [ax_cv_PTHREAD_PRIO_INHERIT], | ||
| 2474 | + [AC_LINK_IFELSE([AC_LANG_PROGRAM([[#include <pthread.h>]], | ||
| 2475 | + [[int i = PTHREAD_PRIO_INHERIT; | ||
| 2476 | + return i;]])], | ||
| 2477 | + [ax_cv_PTHREAD_PRIO_INHERIT=yes], | ||
| 2478 | + [ax_cv_PTHREAD_PRIO_INHERIT=no]) | ||
| 2479 | ]) | ||
| 2480 | - AS_IF([test "x$ax_cv_PTHREAD_PRIO_INHERIT" = "xyes"], | ||
| 2481 | - AC_DEFINE([HAVE_PTHREAD_PRIO_INHERIT], 1, [Have PTHREAD_PRIO_INHERIT.])) | ||
| 2482 | + AS_IF([test "x$ax_cv_PTHREAD_PRIO_INHERIT" = "xyes" && \ | ||
| 2483 | + test "x$ax_pthread_prio_inherit_defined" != "xyes"], | ||
| 2484 | + [AC_DEFINE([HAVE_PTHREAD_PRIO_INHERIT], [1], [Have PTHREAD_PRIO_INHERIT.]) | ||
| 2485 | + ax_pthread_prio_inherit_defined=yes | ||
| 2486 | + ]) | ||
| 2487 | |||
| 2488 | - LIBS="$save_LIBS" | ||
| 2489 | - CFLAGS="$save_CFLAGS" | ||
| 2490 | + CFLAGS="$ax_pthread_save_CFLAGS" | ||
| 2491 | + LIBS="$ax_pthread_save_LIBS" | ||
| 2492 | |||
| 2493 | - # More AIX lossage: must compile with xlc_r or cc_r | ||
| 2494 | - if test x"$GCC" != xyes; then | ||
| 2495 | - AC_CHECK_PROGS(PTHREAD_CC, xlc_r cc_r, ${CC}) | ||
| 2496 | - else | ||
| 2497 | - PTHREAD_CC=$CC | ||
| 2498 | + # More AIX lossage: compile with *_r variant | ||
| 2499 | + if test "x$GCC" != "xyes"; then | ||
| 2500 | + case $host_os in | ||
| 2501 | + aix*) | ||
| 2502 | + AS_CASE(["x/$CC"], | ||
| 2503 | + [x*/c89|x*/c89_128|x*/c99|x*/c99_128|x*/cc|x*/cc128|x*/xlc|x*/xlc_v6|x*/xlc128|x*/xlc128_v6], | ||
| 2504 | + [#handle absolute path differently from PATH based program lookup | ||
| 2505 | + AS_CASE(["x$CC"], | ||
| 2506 | + [x/*], | ||
| 2507 | + [ | ||
| 2508 | + AS_IF([AS_EXECUTABLE_P([${CC}_r])],[PTHREAD_CC="${CC}_r"]) | ||
| 2509 | + AS_IF([test "x${CXX}" != "x"], [AS_IF([AS_EXECUTABLE_P([${CXX}_r])],[PTHREAD_CXX="${CXX}_r"])]) | ||
| 2510 | + ], | ||
| 2511 | + [ | ||
| 2512 | + AC_CHECK_PROGS([PTHREAD_CC],[${CC}_r],[$CC]) | ||
| 2513 | + AS_IF([test "x${CXX}" != "x"], [AC_CHECK_PROGS([PTHREAD_CXX],[${CXX}_r],[$CXX])]) | ||
| 2514 | + ] | ||
| 2515 | + ) | ||
| 2516 | + ]) | ||
| 2517 | + ;; | ||
| 2518 | + esac | ||
| 2519 | fi | ||
| 2520 | -else | ||
| 2521 | - PTHREAD_CC="$CC" | ||
| 2522 | fi | ||
| 2523 | |||
| 2524 | -AC_SUBST(PTHREAD_LIBS) | ||
| 2525 | -AC_SUBST(PTHREAD_CFLAGS) | ||
| 2526 | -AC_SUBST(PTHREAD_CC) | ||
| 2527 | +test -n "$PTHREAD_CC" || PTHREAD_CC="$CC" | ||
| 2528 | +test -n "$PTHREAD_CXX" || PTHREAD_CXX="$CXX" | ||
| 2529 | + | ||
| 2530 | +AC_SUBST([PTHREAD_LIBS]) | ||
| 2531 | +AC_SUBST([PTHREAD_CFLAGS]) | ||
| 2532 | +AC_SUBST([PTHREAD_CC]) | ||
| 2533 | +AC_SUBST([PTHREAD_CXX]) | ||
| 2534 | |||
| 2535 | # Finally, execute ACTION-IF-FOUND/ACTION-IF-NOT-FOUND: | ||
| 2536 | -if test x"$ax_pthread_ok" = xyes; then | ||
| 2537 | - ifelse([$1],,AC_DEFINE(HAVE_PTHREAD,1,[Define if you have POSIX threads libraries and header files.]),[$1]) | ||
| 2538 | +if test "x$ax_pthread_ok" = "xyes"; then | ||
| 2539 | + ifelse([$1],,[AC_DEFINE([HAVE_PTHREAD],[1],[Define if you have POSIX threads libraries and header files.])],[$1]) | ||
| 2540 | : | ||
| 2541 | else | ||
| 2542 | ax_pthread_ok=no | ||
| 2543 | diff --git a/scripts/checks.m4 b/scripts/checks.m4 | ||
| 2544 | index 915a5011..b9095cee 100644 | ||
| 2545 | --- a/scripts/checks.m4 | ||
| 2546 | +++ b/scripts/checks.m4 | ||
| 2547 | @@ -21,7 +21,7 @@ AC_DEFUN([TORRENT_CHECK_XFS], [ | ||
| 2548 | |||
| 2549 | AC_DEFUN([TORRENT_WITHOUT_XFS], [ | ||
| 2550 | AC_ARG_WITH(xfs, | ||
| 2551 | - AC_HELP_STRING([--without-xfs], [do not check for XFS filesystem support]), | ||
| 2552 | + AS_HELP_STRING([--without-xfs],[do not check for XFS filesystem support]), | ||
| 2553 | [ | ||
| 2554 | if test "$withval" = "yes"; then | ||
| 2555 | TORRENT_CHECK_XFS | ||
| 2556 | @@ -34,7 +34,7 @@ AC_DEFUN([TORRENT_WITHOUT_XFS], [ | ||
| 2557 | |||
| 2558 | AC_DEFUN([TORRENT_WITH_XFS], [ | ||
| 2559 | AC_ARG_WITH(xfs, | ||
| 2560 | - AC_HELP_STRING([--with-xfs], [check for XFS filesystem support]), | ||
| 2561 | + AS_HELP_STRING([--with-xfs],[check for XFS filesystem support]), | ||
| 2562 | [ | ||
| 2563 | if test "$withval" = "yes"; then | ||
| 2564 | TORRENT_CHECK_XFS | ||
| 2565 | @@ -63,7 +63,7 @@ AC_DEFUN([TORRENT_CHECK_EPOLL], [ | ||
| 2566 | |||
| 2567 | AC_DEFUN([TORRENT_WITHOUT_EPOLL], [ | ||
| 2568 | AC_ARG_WITH(epoll, | ||
| 2569 | - AC_HELP_STRING([--without-epoll], [do not check for epoll support]), | ||
| 2570 | + AS_HELP_STRING([--without-epoll],[do not check for epoll support]), | ||
| 2571 | [ | ||
| 2572 | if test "$withval" = "yes"; then | ||
| 2573 | TORRENT_CHECK_EPOLL | ||
| 2574 | @@ -134,7 +134,7 @@ AC_DEFUN([TORRENT_CHECK_KQUEUE_SOCKET_ONLY], [ | ||
| 2575 | |||
| 2576 | AC_DEFUN([TORRENT_WITH_KQUEUE], [ | ||
| 2577 | AC_ARG_WITH(kqueue, | ||
| 2578 | - AC_HELP_STRING([--with-kqueue], [enable kqueue [[default=no]]]), | ||
| 2579 | + AS_HELP_STRING([--with-kqueue],[enable kqueue [[default=no]]]), | ||
| 2580 | [ | ||
| 2581 | if test "$withval" = "yes"; then | ||
| 2582 | TORRENT_CHECK_KQUEUE | ||
| 2583 | @@ -145,7 +145,7 @@ AC_DEFUN([TORRENT_WITH_KQUEUE], [ | ||
| 2584 | |||
| 2585 | AC_DEFUN([TORRENT_WITHOUT_KQUEUE], [ | ||
| 2586 | AC_ARG_WITH(kqueue, | ||
| 2587 | - AC_HELP_STRING([--without-kqueue], [do not check for kqueue support]), | ||
| 2588 | + AS_HELP_STRING([--without-kqueue],[do not check for kqueue support]), | ||
| 2589 | [ | ||
| 2590 | if test "$withval" = "yes"; then | ||
| 2591 | TORRENT_CHECK_KQUEUE | ||
| 2592 | @@ -158,7 +158,7 @@ AC_DEFUN([TORRENT_WITHOUT_KQUEUE], [ | ||
| 2593 | |||
| 2594 | AC_DEFUN([TORRENT_WITHOUT_VARIABLE_FDSET], [ | ||
| 2595 | AC_ARG_WITH(variable-fdset, | ||
| 2596 | - AC_HELP_STRING([--without-variable-fdset], [do not use non-portable variable sized fd_set's]), | ||
| 2597 | + AS_HELP_STRING([--without-variable-fdset],[do not use non-portable variable sized fd_set's]), | ||
| 2598 | [ | ||
| 2599 | if test "$withval" = "yes"; then | ||
| 2600 | AC_DEFINE(USE_VARIABLE_FDSET, 1, defined when we allow the use of fd_set's of any size) | ||
| 2601 | @@ -172,14 +172,13 @@ AC_DEFUN([TORRENT_WITHOUT_VARIABLE_FDSET], [ | ||
| 2602 | AC_DEFUN([TORRENT_CHECK_FALLOCATE], [ | ||
| 2603 | AC_MSG_CHECKING(for fallocate) | ||
| 2604 | |||
| 2605 | - AC_TRY_LINK([#define _GNU_SOURCE | ||
| 2606 | + AC_LINK_IFELSE([AC_LANG_PROGRAM([[#define _GNU_SOURCE | ||
| 2607 | #include <fcntl.h> | ||
| 2608 | - ],[ fallocate(0, FALLOC_FL_KEEP_SIZE, 0, 0); return 0; | ||
| 2609 | - ], | ||
| 2610 | - [ | ||
| 2611 | + ]], [[ fallocate(0, FALLOC_FL_KEEP_SIZE, 0, 0); return 0; | ||
| 2612 | + ]])],[ | ||
| 2613 | AC_DEFINE(HAVE_FALLOCATE, 1, Linux's fallocate supported.) | ||
| 2614 | AC_MSG_RESULT(yes) | ||
| 2615 | - ], [ | ||
| 2616 | + ],[ | ||
| 2617 | AC_MSG_RESULT(no) | ||
| 2618 | ]) | ||
| 2619 | ]) | ||
| 2620 | @@ -188,13 +187,12 @@ AC_DEFUN([TORRENT_CHECK_FALLOCATE], [ | ||
| 2621 | AC_DEFUN([TORRENT_CHECK_POSIX_FALLOCATE], [ | ||
| 2622 | AC_MSG_CHECKING(for posix_fallocate) | ||
| 2623 | |||
| 2624 | - AC_TRY_LINK([#include <fcntl.h> | ||
| 2625 | - ],[ posix_fallocate(0, 0, 0); | ||
| 2626 | - ], | ||
| 2627 | - [ | ||
| 2628 | + AC_LINK_IFELSE([AC_LANG_PROGRAM([[#include <fcntl.h> | ||
| 2629 | + ]], [[ posix_fallocate(0, 0, 0); | ||
| 2630 | + ]])],[ | ||
| 2631 | AC_DEFINE(USE_POSIX_FALLOCATE, 1, posix_fallocate supported.) | ||
| 2632 | AC_MSG_RESULT(yes) | ||
| 2633 | - ], [ | ||
| 2634 | + ],[ | ||
| 2635 | AC_MSG_RESULT(no) | ||
| 2636 | ]) | ||
| 2637 | ]) | ||
| 2638 | @@ -202,7 +200,7 @@ AC_DEFUN([TORRENT_CHECK_POSIX_FALLOCATE], [ | ||
| 2639 | |||
| 2640 | AC_DEFUN([TORRENT_WITH_POSIX_FALLOCATE], [ | ||
| 2641 | AC_ARG_WITH(posix-fallocate, | ||
| 2642 | - AC_HELP_STRING([--with-posix-fallocate], [check for and use posix_fallocate to allocate files]), | ||
| 2643 | + AS_HELP_STRING([--with-posix-fallocate],[check for and use posix_fallocate to allocate files]), | ||
| 2644 | [ | ||
| 2645 | if test "$withval" = "yes"; then | ||
| 2646 | TORRENT_CHECK_POSIX_FALLOCATE | ||
| 2647 | @@ -215,8 +213,7 @@ AC_DEFUN([TORRENT_CHECK_STATVFS], [ | ||
| 2648 | |||
| 2649 | AC_MSG_CHECKING(for statvfs) | ||
| 2650 | |||
| 2651 | - AC_TRY_LINK( | ||
| 2652 | - [ | ||
| 2653 | + AC_LINK_IFELSE([AC_LANG_PROGRAM([[ | ||
| 2654 | #if HAVE_SYS_VFS_H | ||
| 2655 | #include <sys/vfs.h> | ||
| 2656 | #endif | ||
| 2657 | @@ -226,12 +223,11 @@ AC_DEFUN([TORRENT_CHECK_STATVFS], [ | ||
| 2658 | #if HAVE_SYS_STATFS_H | ||
| 2659 | #include <sys/statfs.h> | ||
| 2660 | #endif | ||
| 2661 | - ],[ | ||
| 2662 | + ]], [[ | ||
| 2663 | struct statvfs s; fsblkcnt_t c; | ||
| 2664 | statvfs("", &s); | ||
| 2665 | fstatvfs(0, &s); | ||
| 2666 | - ], | ||
| 2667 | - [ | ||
| 2668 | + ]])],[ | ||
| 2669 | AC_DEFINE(FS_STAT_FD, [fstatvfs(fd, &m_stat) == 0], Function to determine filesystem stats from fd) | ||
| 2670 | AC_DEFINE(FS_STAT_FN, [statvfs(fn, &m_stat) == 0], Function to determine filesystem stats from filename) | ||
| 2671 | AC_DEFINE(FS_STAT_STRUCT, [struct statvfs], Type of second argument to statfs function) | ||
| 2672 | @@ -240,8 +236,7 @@ AC_DEFUN([TORRENT_CHECK_STATVFS], [ | ||
| 2673 | AC_DEFINE(FS_STAT_BLOCK_SIZE, [(m_stat.f_frsize)], Determine the block size) | ||
| 2674 | AC_MSG_RESULT(ok) | ||
| 2675 | have_stat_vfs=yes | ||
| 2676 | - ], | ||
| 2677 | - [ | ||
| 2678 | + ],[ | ||
| 2679 | AC_MSG_RESULT(no) | ||
| 2680 | have_stat_vfs=no | ||
| 2681 | ]) | ||
| 2682 | @@ -252,8 +247,7 @@ AC_DEFUN([TORRENT_CHECK_STATFS], [ | ||
| 2683 | |||
| 2684 | AC_MSG_CHECKING(for statfs) | ||
| 2685 | |||
| 2686 | - AC_TRY_LINK( | ||
| 2687 | - [ | ||
| 2688 | + AC_LINK_IFELSE([AC_LANG_PROGRAM([[ | ||
| 2689 | #if HAVE_SYS_STATFS_H | ||
| 2690 | #include <sys/statfs.h> | ||
| 2691 | #endif | ||
| 2692 | @@ -263,12 +257,11 @@ AC_DEFUN([TORRENT_CHECK_STATFS], [ | ||
| 2693 | #if HAVE_SYS_MOUNT_H | ||
| 2694 | #include <sys/mount.h> | ||
| 2695 | #endif | ||
| 2696 | - ],[ | ||
| 2697 | + ]], [[ | ||
| 2698 | struct statfs s; | ||
| 2699 | statfs("", &s); | ||
| 2700 | fstatfs(0, &s); | ||
| 2701 | - ], | ||
| 2702 | - [ | ||
| 2703 | + ]])],[ | ||
| 2704 | AC_DEFINE(FS_STAT_FD, [fstatfs(fd, &m_stat) == 0], Function to determine filesystem stats from fd) | ||
| 2705 | AC_DEFINE(FS_STAT_FN, [statfs(fn, &m_stat) == 0], Function to determine filesystem stats from filename) | ||
| 2706 | AC_DEFINE(FS_STAT_STRUCT, [struct statfs], Type of second argument to statfs function) | ||
| 2707 | @@ -277,8 +270,7 @@ AC_DEFUN([TORRENT_CHECK_STATFS], [ | ||
| 2708 | AC_DEFINE(FS_STAT_BLOCK_SIZE, [(m_stat.f_bsize)], Determine the block size) | ||
| 2709 | AC_MSG_RESULT(ok) | ||
| 2710 | have_stat_vfs=yes | ||
| 2711 | - ], | ||
| 2712 | - [ | ||
| 2713 | + ],[ | ||
| 2714 | AC_MSG_RESULT(no) | ||
| 2715 | have_stat_vfs=no | ||
| 2716 | ]) | ||
| 2717 | @@ -296,7 +288,7 @@ AC_DEFUN([TORRENT_DISABLED_STATFS], [ | ||
| 2718 | |||
| 2719 | AC_DEFUN([TORRENT_WITHOUT_STATVFS], [ | ||
| 2720 | AC_ARG_WITH(statvfs, | ||
| 2721 | - AC_HELP_STRING([--without-statvfs], [don't try to use statvfs to find free diskspace]), | ||
| 2722 | + AS_HELP_STRING([--without-statvfs],[don't try to use statvfs to find free diskspace]), | ||
| 2723 | [ | ||
| 2724 | if test "$withval" = "yes"; then | ||
| 2725 | TORRENT_CHECK_STATVFS | ||
| 2726 | @@ -311,7 +303,7 @@ AC_DEFUN([TORRENT_WITHOUT_STATVFS], [ | ||
| 2727 | |||
| 2728 | AC_DEFUN([TORRENT_WITHOUT_STATFS], [ | ||
| 2729 | AC_ARG_WITH(statfs, | ||
| 2730 | - AC_HELP_STRING([--without-statfs], [don't try to use statfs to find free diskspace]), | ||
| 2731 | + AS_HELP_STRING([--without-statfs],[don't try to use statfs to find free diskspace]), | ||
| 2732 | [ | ||
| 2733 | if test "$have_stat_vfs" = "no"; then | ||
| 2734 | if test "$withval" = "yes"; then | ||
| 2735 | @@ -333,7 +325,7 @@ AC_DEFUN([TORRENT_WITHOUT_STATFS], [ | ||
| 2736 | |||
| 2737 | AC_DEFUN([TORRENT_WITH_ADDRESS_SPACE], [ | ||
| 2738 | AC_ARG_WITH(address-space, | ||
| 2739 | - AC_HELP_STRING([--with-address-space=MB], [change the default address space size [[default=1024mb]]]), | ||
| 2740 | + AS_HELP_STRING([--with-address-space=MB],[change the default address space size [[default=1024mb]]]), | ||
| 2741 | [ | ||
| 2742 | if test ! -z $withval -a "$withval" != "yes" -a "$withval" != "no"; then | ||
| 2743 | AC_DEFINE_UNQUOTED(DEFAULT_ADDRESS_SPACE_SIZE, [$withval]) | ||
| 2744 | @@ -354,7 +346,7 @@ AC_DEFUN([TORRENT_WITH_ADDRESS_SPACE], [ | ||
| 2745 | |||
| 2746 | AC_DEFUN([TORRENT_WITH_FASTCGI], [ | ||
| 2747 | AC_ARG_WITH(fastcgi, | ||
| 2748 | - AC_HELP_STRING([--with-fastcgi=PATH], [enable FastCGI RPC support (DO NOT USE)]), | ||
| 2749 | + AS_HELP_STRING([--with-fastcgi=PATH],[enable FastCGI RPC support (DO NOT USE)]), | ||
| 2750 | [ | ||
| 2751 | AC_MSG_CHECKING([for FastCGI (DO NOT USE)]) | ||
| 2752 | |||
| 2753 | @@ -365,13 +357,10 @@ AC_DEFUN([TORRENT_WITH_FASTCGI], [ | ||
| 2754 | CXXFLAGS="$CXXFLAGS" | ||
| 2755 | LIBS="$LIBS -lfcgi" | ||
| 2756 | |||
| 2757 | - AC_TRY_LINK( | ||
| 2758 | - [ #include <fcgiapp.h> | ||
| 2759 | - ],[ FCGX_Init(); ], | ||
| 2760 | - [ | ||
| 2761 | + AC_LINK_IFELSE([AC_LANG_PROGRAM([[ #include <fcgiapp.h> | ||
| 2762 | + ]], [[ FCGX_Init(); ]])],[ | ||
| 2763 | AC_MSG_RESULT(ok) | ||
| 2764 | - ], | ||
| 2765 | - [ | ||
| 2766 | + ],[ | ||
| 2767 | AC_MSG_RESULT(not found) | ||
| 2768 | AC_MSG_ERROR(Could not compile FastCGI test.) | ||
| 2769 | ]) | ||
| 2770 | @@ -382,13 +371,10 @@ AC_DEFUN([TORRENT_WITH_FASTCGI], [ | ||
| 2771 | CXXFLAGS="$CXXFLAGS -I$withval/include" | ||
| 2772 | LIBS="$LIBS -lfcgi -L$withval/lib" | ||
| 2773 | |||
| 2774 | - AC_TRY_LINK( | ||
| 2775 | - [ #include <fcgiapp.h> | ||
| 2776 | - ],[ FCGX_Init(); ], | ||
| 2777 | - [ | ||
| 2778 | + AC_LINK_IFELSE([AC_LANG_PROGRAM([[ #include <fcgiapp.h> | ||
| 2779 | + ]], [[ FCGX_Init(); ]])],[ | ||
| 2780 | AC_MSG_RESULT(ok) | ||
| 2781 | - ], | ||
| 2782 | - [ | ||
| 2783 | + ],[ | ||
| 2784 | AC_MSG_RESULT(not found) | ||
| 2785 | AC_MSG_ERROR(Could not compile FastCGI test.) | ||
| 2786 | ]) | ||
| 2787 | @@ -403,7 +389,7 @@ AC_DEFUN([TORRENT_WITH_XMLRPC_C], [ | ||
| 2788 | AC_MSG_CHECKING(for XMLRPC-C) | ||
| 2789 | |||
| 2790 | AC_ARG_WITH(xmlrpc-c, | ||
| 2791 | - AC_HELP_STRING([--with-xmlrpc-c=PATH], [enable XMLRPC-C support]), | ||
| 2792 | + AS_HELP_STRING([--with-xmlrpc-c=PATH],[enable XMLRPC-C support]), | ||
| 2793 | [ | ||
| 2794 | if test "$withval" = "no"; then | ||
| 2795 | AC_MSG_RESULT(no) | ||
| 2796 | @@ -419,12 +405,10 @@ AC_DEFUN([TORRENT_WITH_XMLRPC_C], [ | ||
| 2797 | CXXFLAGS="$CXXFLAGS `$xmlrpc_cc_prg --cflags server-util`" | ||
| 2798 | LIBS="$LIBS `$xmlrpc_cc_prg server-util --libs`" | ||
| 2799 | |||
| 2800 | - AC_TRY_LINK( | ||
| 2801 | - [ #include <xmlrpc-c/server.h> | ||
| 2802 | - ],[ xmlrpc_registry_new(NULL); ], | ||
| 2803 | - [ | ||
| 2804 | + AC_LINK_IFELSE([AC_LANG_PROGRAM([[ #include <xmlrpc-c/server.h> | ||
| 2805 | + ]], [[ xmlrpc_registry_new(NULL); ]])],[ | ||
| 2806 | AC_MSG_RESULT(ok) | ||
| 2807 | - ], [ | ||
| 2808 | + ],[ | ||
| 2809 | AC_MSG_RESULT(failed) | ||
| 2810 | AC_MSG_ERROR(Could not compile XMLRPC-C test.) | ||
| 2811 | ]) | ||
| 2812 | @@ -466,23 +450,23 @@ AC_DEFUN([TORRENT_CHECK_PTHREAD_SETNAME_NP], [ | ||
| 2813 | |||
| 2814 | AC_MSG_CHECKING(for pthread_setname_np type) | ||
| 2815 | |||
| 2816 | - AC_TRY_LINK([ | ||
| 2817 | + AC_LINK_IFELSE([AC_LANG_PROGRAM([[ | ||
| 2818 | #include <pthread.h> | ||
| 2819 | #include <sys/types.h> | ||
| 2820 | - ],[ | ||
| 2821 | + ]], [[ | ||
| 2822 | pthread_t t; | ||
| 2823 | pthread_setname_np(t, "foo"); | ||
| 2824 | - ],[ | ||
| 2825 | + ]])],[ | ||
| 2826 | AC_DEFINE(HAS_PTHREAD_SETNAME_NP_GENERIC, 1, The function to set pthread name has a pthread_t argumet.) | ||
| 2827 | AC_MSG_RESULT(generic) | ||
| 2828 | ],[ | ||
| 2829 | - AC_TRY_LINK([ | ||
| 2830 | + AC_LINK_IFELSE([AC_LANG_PROGRAM([[ | ||
| 2831 | #include <pthread.h> | ||
| 2832 | #include <sys/types.h> | ||
| 2833 | - ],[ | ||
| 2834 | + ]],[[ | ||
| 2835 | pthread_t t; | ||
| 2836 | pthread_setname_np("foo"); | ||
| 2837 | - ],[ | ||
| 2838 | + ]])],[ | ||
| 2839 | AC_DEFINE(HAS_PTHREAD_SETNAME_NP_DARWIN, 1, The function to set pthread name has no pthread argument.) | ||
| 2840 | AC_MSG_RESULT(darwin) | ||
| 2841 | ],[ | ||
| 2842 | @@ -495,7 +479,7 @@ AC_DEFUN([TORRENT_DISABLE_PTHREAD_SETNAME_NP], [ | ||
| 2843 | AC_MSG_CHECKING([for pthread_setname_no]) | ||
| 2844 | |||
| 2845 | AC_ARG_ENABLE(pthread-setname-np, | ||
| 2846 | - AC_HELP_STRING([--disable-pthread-setname-np], [disable pthread_setname_np]), | ||
| 2847 | + AS_HELP_STRING([--disable-pthread-setname-np],[disable pthread_setname_np]), | ||
| 2848 | [ | ||
| 2849 | if test "$enableval" = "no"; then | ||
| 2850 | AC_MSG_RESULT(disabled) | ||
| 2851 | diff --git a/scripts/common.m4 b/scripts/common.m4 | ||
| 2852 | index 55e8d66e..2f54402e 100644 | ||
| 2853 | --- a/scripts/common.m4 | ||
| 2854 | +++ b/scripts/common.m4 | ||
| 2855 | @@ -1,6 +1,7 @@ | ||
| 2856 | AC_DEFUN([TORRENT_WITH_SYSROOT], [ | ||
| 2857 | AC_ARG_WITH(sysroot, | ||
| 2858 | - AC_HELP_STRING([--with-sysroot=PATH], [compile and link with a specific sysroot]), | ||
| 2859 | + AS_HELP_STRING([--with-sysroot=PATH], | ||
| 2860 | + [compile and link with a specific sysroot]), | ||
| 2861 | [ | ||
| 2862 | AC_MSG_CHECKING(for sysroot) | ||
| 2863 | |||
| 2864 | @@ -22,7 +23,8 @@ AC_DEFUN([TORRENT_WITH_SYSROOT], [ | ||
| 2865 | |||
| 2866 | AC_DEFUN([TORRENT_ENABLE_ARCH], [ | ||
| 2867 | AC_ARG_ENABLE(arch, | ||
| 2868 | - AC_HELP_STRING([--enable-arch=ARCH], [comma seprated list of architectures to compile for]), | ||
| 2869 | + AS_HELP_STRING([--enable-arch=ARCH], | ||
| 2870 | + [comma seprated list of architectures to compile for]), | ||
| 2871 | [ | ||
| 2872 | AC_MSG_CHECKING(for target architectures) | ||
| 2873 | |||
| 2874 | @@ -82,7 +84,8 @@ AC_DEFUN([TORRENT_MINCORE_SIGNEDNESS], [ | ||
| 2875 | |||
| 2876 | AC_DEFUN([TORRENT_MINCORE], [ | ||
| 2877 | AC_ARG_ENABLE(mincore, | ||
| 2878 | - AC_HELP_STRING([--disable-mincore], [disable mincore check [[default=enable]]]), | ||
| 2879 | + AS_HELP_STRING([--disable-mincore], | ||
| 2880 | + [disable mincore check [[default=enable]]]), | ||
| 2881 | [ | ||
| 2882 | if test "$enableval" = "yes"; then | ||
| 2883 | TORRENT_MINCORE_SIGNEDNESS() | ||
| 2884 | @@ -174,7 +177,8 @@ AC_DEFUN([TORRENT_CHECK_ALIGNED], [ | ||
| 2885 | |||
| 2886 | AC_DEFUN([TORRENT_ENABLE_ALIGNED], [ | ||
| 2887 | AC_ARG_ENABLE(aligned, | ||
| 2888 | - AC_HELP_STRING([--enable-aligned], [enable alignment safe code [[default=check]]]), | ||
| 2889 | + AS_HELP_STRING([--enable-aligned], | ||
| 2890 | + [enable alignment safe code [[default=check]]]), | ||
| 2891 | [ | ||
| 2892 | if test "$enableval" = "yes"; then | ||
| 2893 | AC_DEFINE(USE_ALIGNED, 1, Require byte alignment) | ||
| 2894 | @@ -189,7 +193,8 @@ AC_DEFUN([TORRENT_DISABLE_INSTRUMENTATION], [ | ||
| 2895 | AC_MSG_CHECKING([if instrumentation should be included]) | ||
| 2896 | |||
| 2897 | AC_ARG_ENABLE(instrumentation, | ||
| 2898 | - AC_HELP_STRING([--disable-instrumentation], [disable instrumentation [[default=enabled]]]), | ||
| 2899 | + AS_HELP_STRING([--disable-instrumentation], | ||
| 2900 | + [disable instrumentation [[default=enabled]]]), | ||
| 2901 | [ | ||
| 2902 | if test "$enableval" = "yes"; then | ||
| 2903 | AC_DEFINE(LT_INSTRUMENTATION, 1, enable instrumentation) | ||
| 2904 | @@ -206,7 +211,8 @@ AC_DEFUN([TORRENT_DISABLE_INSTRUMENTATION], [ | ||
| 2905 | |||
| 2906 | AC_DEFUN([TORRENT_ENABLE_INTERRUPT_SOCKET], [ | ||
| 2907 | AC_ARG_ENABLE(interrupt-socket, | ||
| 2908 | - AC_HELP_STRING([--enable-interrupt-socket], [enable interrupt socket [[default=no]]]), | ||
| 2909 | + AS_HELP_STRING([--enable-interrupt-socket], | ||
| 2910 | + [enable interrupt socket [[default=no]]]), | ||
| 2911 | [ | ||
| 2912 | if test "$enableval" = "yes"; then | ||
| 2913 | AC_DEFINE(USE_INTERRUPT_SOCKET, 1, Use interrupt socket instead of pthread_kill) | ||
| 2914 | @@ -214,3 +220,14 @@ AC_DEFUN([TORRENT_ENABLE_INTERRUPT_SOCKET], [ | ||
| 2915 | ] | ||
| 2916 | ) | ||
| 2917 | ]) | ||
| 2918 | + | ||
| 2919 | +AC_DEFUN([TORRENT_DISABLE_IPV6], [ | ||
| 2920 | + AC_ARG_ENABLE(ipv6, | ||
| 2921 | + AS_HELP_STRING([--enable-ipv6], | ||
| 2922 | + [enable ipv6 [[default=no]]]), | ||
| 2923 | + [ | ||
| 2924 | + if test "$enableval" = "yes"; then | ||
| 2925 | + AC_DEFINE(RAK_USE_INET6, 1, enable ipv6 stuff) | ||
| 2926 | + fi | ||
| 2927 | + ]) | ||
| 2928 | +]) | ||
| 2929 | diff --git a/scripts/rak_compiler.m4 b/scripts/rak_compiler.m4 | ||
| 2930 | index 9a361bed..bc1572a3 100644 | ||
| 2931 | --- a/scripts/rak_compiler.m4 | ||
| 2932 | +++ b/scripts/rak_compiler.m4 | ||
| 2933 | @@ -26,7 +26,7 @@ AC_DEFUN([RAK_CHECK_CXXFLAGS], [ | ||
| 2934 | |||
| 2935 | AC_DEFUN([RAK_ENABLE_DEBUG], [ | ||
| 2936 | AC_ARG_ENABLE(debug, | ||
| 2937 | - AC_HELP_STRING([--enable-debug], [enable debug information [[default=yes]]]), | ||
| 2938 | + AS_HELP_STRING([--enable-debug],[enable debug information [[default=yes]]]), | ||
| 2939 | [ | ||
| 2940 | if test "$enableval" = "yes"; then | ||
| 2941 | CXXFLAGS="$CXXFLAGS -g -DDEBUG" | ||
| 2942 | @@ -41,7 +41,7 @@ AC_DEFUN([RAK_ENABLE_DEBUG], [ | ||
| 2943 | |||
| 2944 | AC_DEFUN([RAK_ENABLE_WERROR], [ | ||
| 2945 | AC_ARG_ENABLE(werror, | ||
| 2946 | - AC_HELP_STRING([--enable-werror], [enable the -Werror and -Wall flags [[default -Wall only]]]), | ||
| 2947 | + AS_HELP_STRING([--enable-werror],[enable the -Werror and -Wall flags [[default -Wall only]]]), | ||
| 2948 | [ | ||
| 2949 | if test "$enableval" = "yes"; then | ||
| 2950 | CXXFLAGS="$CXXFLAGS -Werror -Wall" | ||
| 2951 | @@ -54,7 +54,7 @@ AC_DEFUN([RAK_ENABLE_WERROR], [ | ||
| 2952 | |||
| 2953 | AC_DEFUN([RAK_ENABLE_EXTRA_DEBUG], [ | ||
| 2954 | AC_ARG_ENABLE(extra-debug, | ||
| 2955 | - AC_HELP_STRING([--enable-extra-debug], [enable extra debugging checks [[default=no]]]), | ||
| 2956 | + AS_HELP_STRING([--enable-extra-debug],[enable extra debugging checks [[default=no]]]), | ||
| 2957 | [ | ||
| 2958 | if test "$enableval" = "yes"; then | ||
| 2959 | AC_DEFINE(USE_EXTRA_DEBUG, 1, Enable extra debugging checks.) | ||
| 2960 | diff --git a/scripts/rak_cxx.m4 b/scripts/rak_cxx.m4 | ||
| 2961 | deleted file mode 100644 | ||
| 2962 | index 0db61b83..00000000 | ||
| 2963 | --- a/scripts/rak_cxx.m4 | ||
| 2964 | +++ /dev/null | ||
| 2965 | @@ -1,14 +0,0 @@ | ||
| 2966 | -AC_DEFUN([RAK_CHECK_CXX11], [ | ||
| 2967 | - AC_ARG_ENABLE([c++0x], | ||
| 2968 | - AC_HELP_STRING([--enable-c++0x], [compile with C++0x (unsupported)]), | ||
| 2969 | - [ | ||
| 2970 | - if test "$enableval" = "yes"; then | ||
| 2971 | - AX_CXX_COMPILE_STDCXX_0X | ||
| 2972 | - else | ||
| 2973 | - AX_CXX_COMPILE_STDCXX_11(noext) | ||
| 2974 | - fi | ||
| 2975 | - ],[ | ||
| 2976 | - AX_CXX_COMPILE_STDCXX_11(noext) | ||
| 2977 | - ] | ||
| 2978 | - ) | ||
| 2979 | -]) | ||
diff --git a/meta-oe/recipes-connectivity/libtorrent/libtorrent/0044-Create-FUNDING.yml.patch b/meta-oe/recipes-connectivity/libtorrent/libtorrent/0044-Create-FUNDING.yml.patch new file mode 100644 index 0000000000..b9378f503a --- /dev/null +++ b/meta-oe/recipes-connectivity/libtorrent/libtorrent/0044-Create-FUNDING.yml.patch | |||
| @@ -0,0 +1,29 @@ | |||
| 1 | From eca577e2a29d64251b5df1c69be53c5b1ffe6bde Mon Sep 17 00:00:00 2001 | ||
| 2 | From: Jari Sundell <sundell.software@gmail.com> | ||
| 3 | Date: Thu, 8 Sep 2022 05:08:44 +0900 | ||
| 4 | Subject: [PATCH] Create FUNDING.yml | ||
| 5 | |||
| 6 | --- | ||
| 7 | .github/FUNDING.yml | 13 +++++++++++++ | ||
| 8 | 1 file changed, 13 insertions(+) | ||
| 9 | create mode 100644 .github/FUNDING.yml | ||
| 10 | |||
| 11 | diff --git a/.github/FUNDING.yml b/.github/FUNDING.yml | ||
| 12 | new file mode 100644 | ||
| 13 | index 00000000..ad5998e8 | ||
| 14 | --- /dev/null | ||
| 15 | +++ b/.github/FUNDING.yml | ||
| 16 | @@ -0,0 +1,13 @@ | ||
| 17 | +# These are supported funding model platforms | ||
| 18 | + | ||
| 19 | +github: [rakshasa] | ||
| 20 | +patreon: rtorrent | ||
| 21 | +open_collective: # Replace with a single Open Collective username | ||
| 22 | +ko_fi: # Replace with a single Ko-fi username | ||
| 23 | +tidelift: # Replace with a single Tidelift platform-name/package-name e.g., npm/babel | ||
| 24 | +community_bridge: # Replace with a single Community Bridge project-name e.g., cloud-foundry | ||
| 25 | +liberapay: # Replace with a single Liberapay username | ||
| 26 | +issuehunt: # Replace with a single IssueHunt username | ||
| 27 | +otechie: # Replace with a single Otechie username | ||
| 28 | +lfx_crowdfunding: # Replace with a single LFX Crowdfunding project-name e.g., cloud-foundry | ||
| 29 | +custom: ['https://rakshasa.github.io/rtorrent/donate.html'] | ||
diff --git a/meta-oe/recipes-connectivity/libtorrent/libtorrent_git.bb b/meta-oe/recipes-connectivity/libtorrent/libtorrent_git.bb index fec05571d1..70c173be54 100644 --- a/meta-oe/recipes-connectivity/libtorrent/libtorrent_git.bb +++ b/meta-oe/recipes-connectivity/libtorrent/libtorrent_git.bb | |||
| @@ -6,12 +6,57 @@ LIC_FILES_CHKSUM = "file://COPYING;md5=393a5ca445f6965873eca0259a17f833" | |||
| 6 | 6 | ||
| 7 | DEPENDS = "zlib libsigc++-2.0 openssl cppunit" | 7 | DEPENDS = "zlib libsigc++-2.0 openssl cppunit" |
| 8 | 8 | ||
| 9 | SRC_URI = "git://github.com/rakshasa/libtorrent;branch=master;protocol=https" | 9 | SRC_URI = "git://github.com/rakshasa/libtorrent;branch=master;protocol=https \ |
| 10 | SRCREV = "e60f222241319aaae482789517ad00ae9344bd13" | 10 | file://0001-Fix-compilation-issue-with-gcc-v6.x-and-empty-CXXFLA.patch \ |
| 11 | file://0002-Modfiy-gcc-v6.x-fix-for-empty-CXXFLAGS-See-10.patch \ | ||
| 12 | file://0003-Add-space-to-fmt-str-in-log_gz_file_write.patch \ | ||
| 13 | file://0004-IPv4-filter-enhancement-11IPv4-filter-enhancement-Cl.patch \ | ||
| 14 | file://0005-Disable-extents-test-to-pass-TravisCI-See-11.patch \ | ||
| 15 | file://0006-Bumped-version-to-0.13.7.patch \ | ||
| 16 | file://0007-Added-support-for-openssl-1.1.patch \ | ||
| 17 | file://0008-Use-AC_COMPILE-instead-of-AC_RUN-to-check-for-execin.patch \ | ||
| 18 | file://0009-Modify-configure-to-prevent-unnecessary-kqueue-check.patch \ | ||
| 19 | file://0010-Display-info-on-failed-tracker-bencode-parsing-See-9.patch \ | ||
| 20 | file://0011-Strip-tags-also-when-displaying-info-on-failed-track.patch \ | ||
| 21 | file://0012-Switch-to-C-11-MRT-RNG-for-random-bytes.patch \ | ||
| 22 | file://0013-Prevent-loss-of-m_ipv6_socket-attribute-which-led-to.patch \ | ||
| 23 | file://0014-If-during-socket-creation-AF_INET6-failes-initialize.patch \ | ||
| 24 | file://0015-Fixes-https-github.com-rakshasa-rtorrent-issues-731.patch \ | ||
| 25 | file://0016-Fix-honoring-throttle.min_peers-settings-in-rtorrent.patch \ | ||
| 26 | file://0017-increase-piece-length-max.patch \ | ||
| 27 | file://0018-Set-max-piece-size-512mb.patch \ | ||
| 28 | file://0019-Fixed-compiler-warning.patch \ | ||
| 29 | file://0020-Added-_GNU_SOURCE-to-fallocate-test.-neheb.patch \ | ||
| 30 | file://0021-Fixed-diffie-hellman-implementation.patch \ | ||
| 31 | file://0022-Increased-max-timeout-for-tracker-requests.patch \ | ||
| 32 | file://0023-Close-log-files-when-reusing-a-name.patch \ | ||
| 33 | file://0024-Bumped-to-version-0.13.8.patch \ | ||
| 34 | file://0025-Allow-logs-to-be-appended-rather-than-overwritten.patch \ | ||
| 35 | file://0026-Removed-log-append-function.-Added-append-parameter-.patch \ | ||
| 36 | file://0027-Backport-changes-from-feature-bind.-200.patch \ | ||
| 37 | file://0028-libtorrent.pc.in-add-Libs.Private-202.patch \ | ||
| 38 | file://0029-Fix-for-inotify-missing-quickly-renamed-files-203.patch \ | ||
| 39 | file://0030-Fix-compiler-warnings.-204.patch \ | ||
| 40 | file://0031-Fix-log-format-so-GCC-can-check-it.-205.patch \ | ||
| 41 | file://0032-Consolidate-make-script-to-optimize-build.-206.patch \ | ||
| 42 | file://0033-Refactor-make-process.-207.patch \ | ||
| 43 | file://0034-Changes-automake-required-files.patch \ | ||
| 44 | file://0035-Replaced-custom-execinfo-autoconf-test.patch \ | ||
| 45 | file://0036-Added-option-to-disable-pthread_setname_np.patch \ | ||
| 46 | file://0037-Improved-backtrace-error-checking.patch \ | ||
| 47 | file://0038-Fixed-issue-with-multiple-connections-from-NAT-not-w.patch \ | ||
| 48 | file://0039-Added-disable-execinfo-option-to-configure.patch \ | ||
| 49 | file://0040-Detect-ip-address.patch \ | ||
| 50 | file://0041-Added-ipv6-options.patch \ | ||
| 51 | file://0042-Removed-obsolete-files.patch \ | ||
| 52 | file://0043-Updated-and-cleaned-up-automake.-224.patch \ | ||
| 53 | file://0044-Create-FUNDING.yml.patch \ | ||
| 54 | " | ||
| 55 | SRCREV = "c167c5a9e0bcf0df23ae5efd91396aae0e37eb87" | ||
| 11 | 56 | ||
| 12 | CVE_STATUS[CVE-2009-1760] = "backported-patch: patched in our product" | 57 | CVE_STATUS[CVE-2009-1760] = "backported-patch: patched in our product" |
| 13 | 58 | ||
| 14 | PV = "0.13.8+git${SRCPV}" | 59 | PV = "1" |
| 15 | 60 | ||
| 16 | S = "${WORKDIR}/git" | 61 | S = "${WORKDIR}/git" |
| 17 | 62 | ||
