diff options
author | Doug Barton <dougb@FreeBSD.org> | 2012-05-17 08:44:12 +0000 |
---|---|---|
committer | Doug Barton <dougb@FreeBSD.org> | 2012-05-17 08:44:12 +0000 |
commit | a0d4b7ae989f4c845be533e9fe3698dce0f2cabc (patch) | |
tree | 346c3e833f9df40b1ae88e80074f24037ff874c2 /net-p2p | |
parent | 014f054c4fd41476b7aac64c538720634012a8e7 (diff) |
Notes
Diffstat (limited to 'net-p2p')
-rw-r--r-- | net-p2p/Makefile | 2 | ||||
-rw-r--r-- | net-p2p/libtorrent-rasterbar-16-python/Makefile | 46 | ||||
-rw-r--r-- | net-p2p/libtorrent-rasterbar-16-python/pkg-plist | 1 | ||||
-rw-r--r-- | net-p2p/libtorrent-rasterbar-16/Makefile | 72 | ||||
-rw-r--r-- | net-p2p/libtorrent-rasterbar-16/distinfo | 2 | ||||
-rw-r--r-- | net-p2p/libtorrent-rasterbar-16/files/patch-RC_0_16-6850 | 1310 | ||||
-rw-r--r-- | net-p2p/libtorrent-rasterbar-16/pkg-descr | 14 | ||||
-rw-r--r-- | net-p2p/libtorrent-rasterbar-16/pkg-plist | 141 |
8 files changed, 1588 insertions, 0 deletions
diff --git a/net-p2p/Makefile b/net-p2p/Makefile index 2f2ec65d923b..a635d6d680ff 100644 --- a/net-p2p/Makefile +++ b/net-p2p/Makefile @@ -48,6 +48,8 @@ SUBDIR += libtorrent-rasterbar-14 SUBDIR += libtorrent-rasterbar-15 SUBDIR += libtorrent-rasterbar-15-python + SUBDIR += libtorrent-rasterbar-16 + SUBDIR += libtorrent-rasterbar-16-python SUBDIR += limewire SUBDIR += linux-jigdo SUBDIR += linuxdcpp diff --git a/net-p2p/libtorrent-rasterbar-16-python/Makefile b/net-p2p/libtorrent-rasterbar-16-python/Makefile new file mode 100644 index 000000000000..753a83f38b40 --- /dev/null +++ b/net-p2p/libtorrent-rasterbar-16-python/Makefile @@ -0,0 +1,46 @@ +# New ports collection makefile for: libtorrent-rasterbar-16-python +# Date created: 5 May 2012 +# Whom: Doug Barton, dougb@FreeBSD.org +# +# +# $FreeBSD$ + +PKGNAMEPREFIX= ${PYTHON_PKGNAMEPREFIX} + +COMMENT= Python bindings for libtorrent-rasterbar-16 +CATEGORIES= net-p2p python + +USE_PYTHON= 2.5+ + +BUILD_DEPENDS+= ${PYTHON_PKGNAMEPREFIX}setuptools>=0.6:${PORTSDIR}/devel/py-setuptools +LIB_DEPENDS+= boost_python.4:${PORTSDIR}/devel/boost-python-libs \ + torrent-rasterbar.6:${PORTSDIR}/net-p2p/libtorrent-rasterbar-16 + +BUILD_WRKSRC= ${WRKSRC}/bindings/python +INSTALL_WRKSRC= ${BUILD_WRKSRC} +PLIST= ${.CURDIR}/pkg-plist + +INSTALLS_EGGINFO= yes +PYDISTUTILS_EGGINFO= python_libtorrent-${PORTVERSION}-py${PYTHON_VER}.egg-info + +NOPORTDOCS= yes + +slave-post-patch: + @${REINPLACE_CMD} -E -e 's|%%LOCALBASE%%|${LOCALBASE}|g' \ + ${WRKSRC}/bindings/python/setup.py.in + +slave-post-install: +# fix installation permissions + @${CHMOD} ${SHAREMODE} ${PYTHONPREFIX_SITELIBDIR}/libtorrent.so + +MASTERDIR= ${.CURDIR}/../libtorrent-rasterbar-16 +.include "${MASTERDIR}/Makefile" + +## +# information available after <bsd.port.pre.mk> +## +# insure python paths are correctly identified +CONFIGURE_ENV+= PYTHON_INCLUDEDIR="${PYTHON_INCLUDEDIR}" \ + PYTHON_VERSION="${PYTHON_VERSION}" +# prefix PKGNAME with python- so that the egg info file is properly named. +PYDISTUTILS_PKGNAME= python-${PORTNAME} diff --git a/net-p2p/libtorrent-rasterbar-16-python/pkg-plist b/net-p2p/libtorrent-rasterbar-16-python/pkg-plist new file mode 100644 index 000000000000..128a4b8d4812 --- /dev/null +++ b/net-p2p/libtorrent-rasterbar-16-python/pkg-plist @@ -0,0 +1 @@ +%%PYTHON_SITELIBDIR%%/libtorrent.so diff --git a/net-p2p/libtorrent-rasterbar-16/Makefile b/net-p2p/libtorrent-rasterbar-16/Makefile new file mode 100644 index 000000000000..416bdfc7e4de --- /dev/null +++ b/net-p2p/libtorrent-rasterbar-16/Makefile @@ -0,0 +1,72 @@ +# New ports collection makefile for: libtorrent-rasterbar-16 +# Date created: 5 May 2012 +# Whom: Doug Barton, dougb@FreeBSD.org +# +# $FreeBSD$ + +PORTNAME= libtorrent-rasterbar +PORTVERSION= 0.16.0 +CATEGORIES?= net-p2p ipv6 +MASTER_SITES= ${MASTER_SITE_GOOGLE_CODE} +PROJECTHOST= libtorrent + +MAINTAINER= dougb@FreeBSD.org +COMMENT?= A C++ library implementing a BitTorrent client + +MAKE_JOBS_SAFE= yes + +CONFLICTS+= libtorrent-rasterbar-0.1[45789].* + +NO_LATEST_LINK= yes + +LIB_DEPENDS+= boost_date_time.4:${PORTSDIR}/devel/boost-libs \ + GeoIP.5:${PORTSDIR}/net/GeoIP + +USE_GNOME= gnomehack +USE_OPENSSL= yes +USE_ICONV= yes + +GNU_CONFIGURE= yes +CONFIGURE_ARGS+= --disable-debug \ + --disable-static \ + --enable-dht \ + --enable-encryption \ + --enable-pool-allocators \ + --enable-deprecated-functions \ + --with-boost=${LOCALBASE} \ + --with-boost-system=boost_system \ + --enable-geoip \ + --with-libgeoip \ + --with-openssl=${OPENSSLBASE} + +USE_LDCONFIG= yes + +.include <bsd.port.pre.mk> + +.if defined(SLAVE_PORT) && ${SLAVE_PORT:L}=="yes" && defined(USE_PYTHON) +CONFIGURE_ARGS+= --enable-python-binding \ + --with-boost-python=boost_python +.else +CONFIGURE_ARGS+= --disable-python-binding +.endif + +.if defined(SLAVE_PORT) && ${SLAVE_PORT:L}=="yes" +post-patch: slave-post-patch +.endif + +.if defined(SLAVE_PORT) && ${SLAVE_PORT:L}=="yes" +post-install: slave-post-install +.else +post-install: +.endif +.if !defined(NOPORTDOCS) + ${MKDIR} ${DOCSDIR} + ${INSTALL_DATA} ${WRKSRC}/docs/*.html ${DOCSDIR} + ${INSTALL_DATA} ${WRKSRC}/docs/*.css ${DOCSDIR} + ${INSTALL_DATA} ${WRKSRC}/docs/*.gif ${DOCSDIR} + ${INSTALL_DATA} ${WRKSRC}/docs/*.jpg ${DOCSDIR} + ${INSTALL_DATA} ${WRKSRC}/docs/*.png ${DOCSDIR} +PORTDOCS= * +.endif + +.include <bsd.port.post.mk> diff --git a/net-p2p/libtorrent-rasterbar-16/distinfo b/net-p2p/libtorrent-rasterbar-16/distinfo new file mode 100644 index 000000000000..75b4a52ed3fc --- /dev/null +++ b/net-p2p/libtorrent-rasterbar-16/distinfo @@ -0,0 +1,2 @@ +SHA256 (libtorrent-rasterbar-0.16.0.tar.gz) = c645f2507f97f80d8681fe44ece00d266c5cd14cfb1ef68fbd005c9a93dec620 +SIZE (libtorrent-rasterbar-0.16.0.tar.gz) = 2880619 diff --git a/net-p2p/libtorrent-rasterbar-16/files/patch-RC_0_16-6850 b/net-p2p/libtorrent-rasterbar-16/files/patch-RC_0_16-6850 new file mode 100644 index 000000000000..460155dc64e3 --- /dev/null +++ b/net-p2p/libtorrent-rasterbar-16/files/patch-RC_0_16-6850 @@ -0,0 +1,1310 @@ +diff -ur ../libtorrent-rasterbar-0.16.0/ChangeLog ./ChangeLog +--- ../libtorrent-rasterbar-0.16.0/ChangeLog 2012-04-09 20:53:40.000000000 -0700 ++++ ./ChangeLog 2012-05-07 14:02:44.000000000 -0700 +@@ -1,4 +1,17 @@ + ++ * fixed semantics of rate_limit_utp to also ignore per-torrent limits ++ * fixed piece sorting bug of deadline pieces ++ * fixed python binding build on Mac OS and BSD ++ * fixed UNC path normalization (on windows, unless UNC paths are disabled) ++ * fixed possible crash when enabling multiple connections per IP ++ * fixed typo in win vista specific code, breaking the build ++ * change default of rate_limit_utp to true ++ * fixed DLL export issue on windows (when building a shared library linking statically against boost) ++ * fixed FreeBSD build ++ * fixed web seed performance issue whith pieces > 1 MiB ++ * fixed unchoke logic when using web seeds ++ * fixed compatibility with older versions of boost (down to boost 1.40) ++ + 0.16 release + + * support torrents with more than 262000 pieces +diff -ur ../libtorrent-rasterbar-0.16.0/Jamfile ./Jamfile +--- ../libtorrent-rasterbar-0.16.0/Jamfile 2012-03-26 19:03:12.000000000 -0700 ++++ ./Jamfile 2012-05-07 14:02:34.000000000 -0700 +@@ -138,7 +138,7 @@ + if <toolset>gcc in $(properties) + && <target-os>linux in $(properties) + && (<variant>debug in $(properties) +- || <asserts>release in $(properties) ++ || <asserts>on in $(properties) + || <asserts>production in $(properties)) + { + # for backtraces in assertion failures +@@ -587,6 +587,13 @@ + <define>BOOST_THREAD_USE_LIB + <threading>multi + <link>shared:<define>TORRENT_BUILDING_SHARED ++ ++ # on windows, when linking statically against asio ++ # but producing a DLL, everything inside the DLL needs ++ # to declare the symbol as being exported ++ <link>shared,<boost-link>static:<define>BOOST_ASIO_SOURCE ++ <link>shared,<boost-link>static:<define>BOOST_SYSTEM_SOURCE ++ + <dht-support>on:<source>src/kademlia/$(KADEMLIA_SOURCES).cpp + <dht-support>logging:<source>src/kademlia/$(KADEMLIA_SOURCES).cpp + <conditional>@building +diff -ur ../libtorrent-rasterbar-0.16.0/bindings/python/src/session.cpp ./bindings/python/src/session.cpp +--- ../libtorrent-rasterbar-0.16.0/bindings/python/src/session.cpp 2012-03-26 19:03:04.000000000 -0700 ++++ ./bindings/python/src/session.cpp 2012-05-07 14:02:28.000000000 -0700 +@@ -2,11 +2,9 @@ + // subject to the Boost Software License, Version 1.0. (See accompanying + // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) + ++#include <boost/python.hpp> + #include <list> + #include <string> +-#include "Python.h" +-#include <cctype> +-#include <boost/python.hpp> + #include <libtorrent/session.hpp> + #include <libtorrent/settings.hpp> // for bencode_map_entry + #include <libtorrent/torrent.hpp> +@@ -153,7 +151,7 @@ + , std::vector<char>& rd, std::list<std::string>& string_storage) + { + // torrent_info objects are always held by an intrusive_ptr in the python binding +- if (params.has_key("ti")) ++ if (params.has_key("ti") && !params.get("ti").is_none()) + p.ti = extract<intrusive_ptr<torrent_info> >(params["ti"]); + + if (params.has_key("info_hash")) +diff -ur ../libtorrent-rasterbar-0.16.0/docs/manual.rst ./docs/manual.rst +--- ../libtorrent-rasterbar-0.16.0/docs/manual.rst 2012-04-10 20:16:58.000000000 -0700 ++++ ./docs/manual.rst 2012-05-07 14:02:26.000000000 -0700 +@@ -5370,7 +5370,7 @@ + the global rate limiter (which they aren't by default). + + ``rate_limit_utp`` determines if uTP connections should be throttled by the global rate +-limiter or not. By default they are not, since uTP manages its own rate. ++limiter or not. By default they are. + + ``listen_queue_size`` is the value passed in to listen() for the listen socket. + It is the number of outstanding incoming connections to queue up while we're not +diff -ur ../libtorrent-rasterbar-0.16.0/include/libtorrent/alloca.hpp ./include/libtorrent/alloca.hpp +--- ../libtorrent-rasterbar-0.16.0/include/libtorrent/alloca.hpp 2012-03-26 19:03:11.000000000 -0700 ++++ ./include/libtorrent/alloca.hpp 2012-05-07 14:02:41.000000000 -0700 +@@ -34,15 +34,19 @@ + + #include "libtorrent/config.hpp" + +-#ifdef TORRENT_WINDOWS ++#if defined TORRENT_WINDOWS + + #include <malloc.h> + #define TORRENT_ALLOCA(t, n) static_cast<t*>(_alloca(sizeof(t) * (n))) + ++#elif defined TORRENT_BSD ++ ++#include <stdlib.h> ++#define TORRENT_ALLOCA(t, n) static_cast<t*>(alloca(sizeof(t) * (n))) ++ + #else + + #include <alloca.h> +- + #define TORRENT_ALLOCA(t, n) static_cast<t*>(alloca(sizeof(t) * (n))) + + #endif +diff -ur ../libtorrent-rasterbar-0.16.0/include/libtorrent/config.hpp ./include/libtorrent/config.hpp +--- ../libtorrent-rasterbar-0.16.0/include/libtorrent/config.hpp 2012-04-04 16:26:39.000000000 -0700 ++++ ./include/libtorrent/config.hpp 2012-05-07 14:02:41.000000000 -0700 +@@ -67,6 +67,20 @@ + #endif + #endif + ++// backwards compatibility with older versions of boost ++#if !defined BOOST_SYMBOL_EXPORT && !defined BOOST_SYMBOL_IMPORT ++# if defined _MSC_VER || defined __MINGW32__ ++# define BOOST_SYMBOL_EXPORT __declspec(dllexport) ++# define BOOST_SYMBOL_IMPORT __declspec(dllimport) ++# elif __GNU__ >= 4 ++# define BOOST_SYMBOL_EXPORT __attribute__((visibility("default"))) ++# define BOOST_SYMBOL_IMPORT __attribute__((visibility("default"))) ++# else ++# define BOOST_SYMBOL_EXPORT ++# define BOOST_SYMBOL_IMPORT ++# endif ++#endif ++ + #if defined TORRENT_BUILDING_SHARED + # define TORRENT_EXPORT BOOST_SYMBOL_EXPORT + #elif defined TORRENT_LINKING_SHARED +@@ -158,6 +172,9 @@ + #define TORRENT_USE_LOCALE 0 + #define TORRENT_CLOSE_MAY_BLOCK 1 + #endif ++#else ++// FreeBSD has a reasonable iconv signature ++#define TORRENT_ICONV_ARG (const char**) + #endif + #define TORRENT_HAS_FALLOCATE 0 + #define TORRENT_USE_IFADDRS 1 +@@ -186,7 +203,9 @@ + #define TORRENT_USE_GETADAPTERSADDRESSES 1 + #define TORRENT_HAS_SALEN 0 + #define TORRENT_USE_GETIPFORWARDTABLE 1 ++#ifndef TORRENT_USE_UNC_PATHS + #define TORRENT_USE_UNC_PATHS 1 ++#endif + + // ==== WINDOWS === + #elif defined WIN32 +@@ -203,7 +222,9 @@ + #endif + #define TORRENT_USE_RLIMIT 0 + #define TORRENT_HAS_FALLOCATE 0 ++#ifndef TORRENT_USE_UNC_PATHS + #define TORRENT_USE_UNC_PATHS 1 ++#endif + + // ==== SOLARIS === + #elif defined sun || defined __sun +diff -ur ../libtorrent-rasterbar-0.16.0/include/libtorrent/disk_buffer_pool.hpp ./include/libtorrent/disk_buffer_pool.hpp +--- ../libtorrent-rasterbar-0.16.0/include/libtorrent/disk_buffer_pool.hpp 2012-03-26 19:03:11.000000000 -0700 ++++ ./include/libtorrent/disk_buffer_pool.hpp 2012-05-07 14:02:37.000000000 -0700 +@@ -42,6 +42,10 @@ + #include <boost/pool/pool.hpp> + #endif + ++#ifdef TORRENT_DISK_STATS ++#include <fstream> ++#endif ++ + #if defined TORRENT_DEBUG || TORRENT_RELEASE_ASSERTS + #include <map> + #endif +diff -ur ../libtorrent-rasterbar-0.16.0/include/libtorrent/escape_string.hpp ./include/libtorrent/escape_string.hpp +--- ../libtorrent-rasterbar-0.16.0/include/libtorrent/escape_string.hpp 2012-03-26 19:03:11.000000000 -0700 ++++ ./include/libtorrent/escape_string.hpp 2012-05-07 14:02:41.000000000 -0700 +@@ -44,7 +44,7 @@ + { + TORRENT_EXTRA_EXPORT boost::array<char, 3 + std::numeric_limits<size_type>::digits10> to_string(size_type n); + TORRENT_EXTRA_EXPORT bool is_alpha(char c); +- TORRENT_EXTRA_EXPORT bool is_digit(char c); ++ TORRENT_EXPORT bool is_digit(char c); + TORRENT_EXTRA_EXPORT bool is_print(char c); + TORRENT_EXTRA_EXPORT bool is_space(char c); + TORRENT_EXTRA_EXPORT char to_lower(char c); +diff -ur ../libtorrent-rasterbar-0.16.0/include/libtorrent/file.hpp ./include/libtorrent/file.hpp +--- ../libtorrent-rasterbar-0.16.0/include/libtorrent/file.hpp 2012-03-26 19:03:11.000000000 -0700 ++++ ./include/libtorrent/file.hpp 2012-05-07 14:02:41.000000000 -0700 +@@ -140,6 +140,9 @@ + TORRENT_EXPORT std::string complete(std::string const& f); + TORRENT_EXPORT bool is_complete(std::string const& f); + TORRENT_EXPORT std::string current_working_directory(); ++#if TORRENT_USE_UNC_PATHS ++ TORRENT_EXTRA_EXPORT std::string canonicalize_path(std::string const& f); ++#endif + + class TORRENT_EXPORT directory : public boost::noncopyable + { +diff -ur ../libtorrent-rasterbar-0.16.0/include/libtorrent/http_seed_connection.hpp ./include/libtorrent/http_seed_connection.hpp +--- ../libtorrent-rasterbar-0.16.0/include/libtorrent/http_seed_connection.hpp 2012-03-26 19:03:11.000000000 -0700 ++++ ./include/libtorrent/http_seed_connection.hpp 2012-05-07 14:02:39.000000000 -0700 +@@ -117,10 +117,10 @@ + // this is const since it's used as a key in the web seed list in the torrent + // if it's changed referencing back into that list will fail + const std::string m_url; +- ++ + // the number of bytes left to receive of the response we're + // currently parsing +- size_type m_response_left; ++ size_type m_response_left; + + // this is the offset inside the current receive + // buffer where the next chunk header will be. +diff -ur ../libtorrent-rasterbar-0.16.0/include/libtorrent/kademlia/node.hpp ./include/libtorrent/kademlia/node.hpp +--- ../libtorrent-rasterbar-0.16.0/include/libtorrent/kademlia/node.hpp 2012-03-26 19:03:07.000000000 -0700 ++++ ./include/libtorrent/kademlia/node.hpp 2012-05-07 14:02:37.000000000 -0700 +@@ -115,7 +115,7 @@ + + struct dht_immutable_item + { +- dht_immutable_item() : value(0), num_announcers(0) {} ++ dht_immutable_item() : value(0), num_announcers(0), size(0) {} + // malloced space for the actual value + char* value; + // this counts the number of IPs we have seen +diff -ur ../libtorrent-rasterbar-0.16.0/include/libtorrent/piece_picker.hpp ./include/libtorrent/piece_picker.hpp +--- ../libtorrent-rasterbar-0.16.0/include/libtorrent/piece_picker.hpp 2012-04-03 21:24:36.000000000 -0700 ++++ ./include/libtorrent/piece_picker.hpp 2012-05-07 14:02:39.000000000 -0700 +@@ -117,6 +117,10 @@ + // the state of this block + enum { state_none, state_requested, state_writing, state_finished }; + unsigned state:2; ++#if defined TORRENT_DEBUG || TORRENT_RELEASE_ASSERTS ++ // to allow verifying the invariant of blocks belonging to the right piece ++ int piece_index; ++#endif + }; + + // the peers that are downloading this piece +diff -ur ../libtorrent-rasterbar-0.16.0/include/libtorrent/torrent.hpp ./include/libtorrent/torrent.hpp +--- ../libtorrent-rasterbar-0.16.0/include/libtorrent/torrent.hpp 2012-03-29 22:28:20.000000000 -0700 ++++ ./include/libtorrent/torrent.hpp 2012-05-07 14:02:41.000000000 -0700 +@@ -500,7 +500,9 @@ + // returns true if we have downloaded the given piece + bool have_piece(int index) const + { +- return has_picker()?m_picker->have_piece(index):true; ++ if (!valid_metadata()) return false; ++ if (!has_picker()) return true; ++ return m_picker->have_piece(index); + } + + // called when we learn that we have a piece +diff -ur ../libtorrent-rasterbar-0.16.0/include/libtorrent/utp_stream.hpp ./include/libtorrent/utp_stream.hpp +--- ../libtorrent-rasterbar-0.16.0/include/libtorrent/utp_stream.hpp 2012-03-26 19:03:11.000000000 -0700 ++++ ./include/libtorrent/utp_stream.hpp 2012-05-07 14:02:41.000000000 -0700 +@@ -192,7 +192,7 @@ + void io_control(IO_Control_Command& ioc, error_code& ec) {} + + #ifndef BOOST_NO_EXCEPTIONS +- void bind(endpoint_type const& endpoint) {} ++ void bind(endpoint_type const& /*endpoint*/) {} + #endif + + void bind(endpoint_type const& endpoint, error_code& ec); +@@ -206,7 +206,7 @@ + error_code set_option(SettableSocketOption const& opt, error_code& ec) { return ec; } + + void close(); +- void close(error_code const& ec) { close(); } ++ void close(error_code const& /*ec*/) { close(); } + bool is_open() const { return m_open; } + + int read_buffer_size() const; +@@ -245,7 +245,7 @@ + endpoint_type remote_endpoint(error_code& ec) const; + + std::size_t available() const; +- std::size_t available(error_code& ec) const { return available(); } ++ std::size_t available(error_code& /*ec*/) const { return available(); } + + asio::io_service& get_io_service() { return m_io_service; } + +diff -ur ../libtorrent-rasterbar-0.16.0/src/asio.cpp ./src/asio.cpp +--- ../libtorrent-rasterbar-0.16.0/src/asio.cpp 2012-03-26 19:02:55.000000000 -0700 ++++ ./src/asio.cpp 2012-05-07 14:01:55.000000000 -0700 +@@ -1,3 +1,7 @@ + // builds all boost.asio source as a separate compilation unit ++#include <boost/version.hpp> ++ ++#if BOOST_VERSION >= 104500 + #include <boost/asio/impl/src.hpp> ++#endif + +diff -ur ../libtorrent-rasterbar-0.16.0/src/asio_ssl.cpp ./src/asio_ssl.cpp +--- ../libtorrent-rasterbar-0.16.0/src/asio_ssl.cpp 2012-03-26 19:02:55.000000000 -0700 ++++ ./src/asio_ssl.cpp 2012-05-07 14:01:55.000000000 -0700 +@@ -1,3 +1,7 @@ + // builds all boost.asio SSL source as a separate compilation unit ++#include <boost/version.hpp> ++ ++#if BOOST_VERSION >= 104610 + #include <boost/asio/ssl/impl/src.hpp> ++#endif + +diff -ur ../libtorrent-rasterbar-0.16.0/src/bandwidth_queue_entry.cpp ./src/bandwidth_queue_entry.cpp +--- ../libtorrent-rasterbar-0.16.0/src/bandwidth_queue_entry.cpp 2012-03-26 19:02:55.000000000 -0700 ++++ ./src/bandwidth_queue_entry.cpp 2012-05-07 14:01:55.000000000 -0700 +@@ -54,9 +54,13 @@ + TORRENT_ASSERT(assigned < request_size); + int quota = request_size - assigned; + TORRENT_ASSERT(quota >= 0); ++ --ttl; ++ if (quota == 0) return quota; ++ + for (int j = 0; j < 5 && channel[j]; ++j) + { + if (channel[j]->throttle() == 0) continue; ++ if (channel[j]->tmp == 0) continue; + quota = (std::min)(int(boost::int64_t(channel[j]->distribute_quota) + * priority / channel[j]->tmp), quota); + } +@@ -64,7 +68,6 @@ + for (int j = 0; j < 5 && channel[j]; ++j) + channel[j]->use_quota(quota); + TORRENT_ASSERT(assigned <= request_size); +- --ttl; + return quota; + } + } +diff -ur ../libtorrent-rasterbar-0.16.0/src/create_torrent.cpp ./src/create_torrent.cpp +--- ../libtorrent-rasterbar-0.16.0/src/create_torrent.cpp 2012-03-26 19:02:55.000000000 -0700 ++++ ./src/create_torrent.cpp 2012-05-07 14:01:48.000000000 -0700 +@@ -167,6 +167,9 @@ + file_pool fp; + std::string utf8; + wchar_utf8(p, utf8); ++#if TORRENT_USE_UNC_PATHS ++ utf8 = canonicalize_path(utf8); ++#endif + boost::scoped_ptr<storage_interface> st( + default_storage_constructor(const_cast<file_storage&>(t.files()), 0, utf8, fp + , std::vector<boost::uint8_t>())); +@@ -195,8 +198,13 @@ + , boost::function<void(int)> f, error_code& ec) + { + file_pool fp; ++#if TORRENT_USE_UNC_PATHS ++ std::string path = canonicalize_path(p); ++#else ++ std::string const& path = p; ++#endif + boost::scoped_ptr<storage_interface> st( +- default_storage_constructor(const_cast<file_storage&>(t.files()), 0, p, fp ++ default_storage_constructor(const_cast<file_storage&>(t.files()), 0, path, fp + , std::vector<boost::uint8_t>())); + + // if we're calculating file hashes as well, use this hasher +diff -ur ../libtorrent-rasterbar-0.16.0/src/disk_buffer_pool.cpp ./src/disk_buffer_pool.cpp +--- ../libtorrent-rasterbar-0.16.0/src/disk_buffer_pool.cpp 2012-03-26 19:02:55.000000000 -0700 ++++ ./src/disk_buffer_pool.cpp 2012-05-07 14:01:55.000000000 -0700 +@@ -38,6 +38,10 @@ + #include <sys/mman.h> + #endif + ++#ifdef TORRENT_DISK_STATS ++#include "libtorrent/time.hpp" ++#endif ++ + namespace libtorrent + { + disk_buffer_pool::disk_buffer_pool(int block_size) +diff -ur ../libtorrent-rasterbar-0.16.0/src/disk_io_thread.cpp ./src/disk_io_thread.cpp +--- ../libtorrent-rasterbar-0.16.0/src/disk_io_thread.cpp 2012-04-09 20:53:39.000000000 -0700 ++++ ./src/disk_io_thread.cpp 2012-05-07 14:01:55.000000000 -0700 +@@ -1452,7 +1452,14 @@ + // sizing the disk cache size when it's set to + // automatic. + #ifdef TORRENT_BSD ++#ifdef HW_MEMSIZE + int mib[2] = { CTL_HW, HW_MEMSIZE }; ++#else ++ // not entirely sure this sysctl supports 64 ++ // bit return values, but it's probably better ++ // than not building ++ int mib[2] = { CTL_HW, HW_PHYSMEM }; ++#endif + size_t len = sizeof(m_physical_ram); + if (sysctl(mib, 2, &m_physical_ram, &len, NULL, 0) != 0) + m_physical_ram = 0; +diff -ur ../libtorrent-rasterbar-0.16.0/src/file.cpp ./src/file.cpp +--- ../libtorrent-rasterbar-0.16.0/src/file.cpp 2012-03-26 19:02:55.000000000 -0700 ++++ ./src/file.cpp 2012-05-07 14:01:48.000000000 -0700 +@@ -536,6 +536,69 @@ + #endif + } + ++#if TORRENT_USE_UNC_PATHS ++ std::string canonicalize_path(std::string const& f) ++ { ++ std::string ret; ++ ret.resize(f.size()); ++ char* write_cur = &ret[0]; ++ char* last_write_sep = write_cur; ++ ++ char const* read_cur = f.c_str(); ++ char const* last_read_sep = read_cur; ++ ++ // the last_*_sep pointers point to one past ++ // the last path separator encountered and is ++ // initializes to the first character in the path ++ while (*read_cur) ++ { ++ if (*read_cur != '\\') ++ { ++ *write_cur++ = *read_cur++; ++ continue; ++ } ++ int element_len = read_cur - last_read_sep; ++ if (element_len == 1 && memcmp(last_read_sep, ".", 1) == 0) ++ { ++ --write_cur; ++ ++read_cur; ++ last_read_sep = read_cur; ++ continue; ++ } ++ if (element_len == 2 && memcmp(last_read_sep, "..", 2) == 0) ++ { ++ // find the previous path separator ++ if (last_write_sep > &ret[0]) ++ { ++ --last_write_sep; ++ while (last_write_sep > &ret[0] ++ && last_write_sep[-1] != '\\') ++ --last_write_sep; ++ } ++ write_cur = last_write_sep; ++ // find the previous path separator ++ if (last_write_sep > &ret[0]) ++ { ++ --last_write_sep; ++ while (last_write_sep > &ret[0] ++ && last_write_sep[-1] != '\\') ++ --last_write_sep; ++ } ++ ++read_cur; ++ last_read_sep = read_cur; ++ continue; ++ } ++ *write_cur++ = *read_cur++; ++ last_write_sep = write_cur; ++ last_read_sep = read_cur; ++ } ++ // terminate destination string ++ *write_cur = 0; ++ ret.resize(write_cur - &ret[0]); ++ return ret; ++ } ++#endif ++ + size_type file_size(std::string const& f) + { + error_code ec; +@@ -811,14 +874,12 @@ + FILE_SHARE_READ, + }; + ++ std::string p = convert_separators(path); + #if TORRENT_USE_UNC_PATHS + // UNC paths must be absolute +- std::string p = convert_separators(path); +- // network paths are not supported by UNC paths ++ // network paths are already UNC paths + if (path.substr(0,2) == "\\\\") p = path; + else p = "\\\\?\\" + (is_complete(p) ? p : combine_path(current_working_directory(), p)); +-#else +- std::string p = convert_separators(path); + #endif + + #if TORRENT_USE_WSTRING +@@ -1407,7 +1468,6 @@ + if (GetLastError() != ERROR_IO_PENDING) + { + TORRENT_ASSERT(GetLastError() != ERROR_BAD_ARGUMENTS); +- TORRENT_ASSERT(GetLastError() != ERROR_BAD_ARGUMENTS); + ec.assign(GetLastError(), get_system_category()); + CloseHandle(ol.hEvent); + return -1; +diff -ur ../libtorrent-rasterbar-0.16.0/src/file_pool.cpp ./src/file_pool.cpp +--- ../libtorrent-rasterbar-0.16.0/src/file_pool.cpp 2012-03-26 19:02:55.000000000 -0700 ++++ ./src/file_pool.cpp 2012-05-07 14:01:55.000000000 -0700 +@@ -162,7 +162,7 @@ + FILE_IO_PRIORITY_HINT_INFO priorityHint; + priorityHint.PriorityHint = IoPriorityHintLow; + SetFileInformationByHandle(e.file_ptr->native_handle(), +- FileIoPriorityHintInfo, &priorityHint, sizeof(PriorityHint)); ++ FileIoPriorityHintInfo, &priorityHint, sizeof(priorityHint)); + } + #endif + #endif +diff -ur ../libtorrent-rasterbar-0.16.0/src/http_seed_connection.cpp ./src/http_seed_connection.cpp +--- ../libtorrent-rasterbar-0.16.0/src/http_seed_connection.cpp 2012-03-26 19:02:55.000000000 -0700 ++++ ./src/http_seed_connection.cpp 2012-05-07 14:01:55.000000000 -0700 +@@ -65,6 +65,7 @@ + , web_seed_entry::headers_t const& extra_headers) + : web_connection_base(ses, t, s, remote, url, peerinfo, auth, extra_headers) + , m_url(url) ++ , m_response_left(0) + , m_chunk_pos(0) + , m_partial_chunk_header(0) + { +diff -ur ../libtorrent-rasterbar-0.16.0/src/i2p_stream.cpp ./src/i2p_stream.cpp +--- ../libtorrent-rasterbar-0.16.0/src/i2p_stream.cpp 2012-03-26 19:02:55.000000000 -0700 ++++ ./src/i2p_stream.cpp 2012-05-07 14:01:55.000000000 -0700 +@@ -288,9 +288,9 @@ + } + + ptr = string_tokenize(next, ' ', &next); +- if (ptr == 0 || strcmp(expect1, ptr)) { handle_error(invalid_response, h); return; } ++ if (ptr == 0 || expect1 == 0 || strcmp(expect1, ptr)) { handle_error(invalid_response, h); return; } + ptr = string_tokenize(next, ' ', &next); +- if (ptr == 0 || strcmp(expect2, ptr)) { handle_error(invalid_response, h); return; } ++ if (ptr == 0 || expect2 == 0 || strcmp(expect2, ptr)) { handle_error(invalid_response, h); return; } + + int result = 0; + char const* message = 0; +diff -ur ../libtorrent-rasterbar-0.16.0/src/kademlia/routing_table.cpp ./src/kademlia/routing_table.cpp +--- ../libtorrent-rasterbar-0.16.0/src/kademlia/routing_table.cpp 2012-03-26 19:02:50.000000000 -0700 ++++ ./src/kademlia/routing_table.cpp 2012-05-07 14:01:48.000000000 -0700 +@@ -113,8 +113,8 @@ + + if (deepest_bucket == 0) return 1 + deepest_size; + +- if (deepest_size < m_bucket_size / 2) return (1 << deepest_bucket) * m_bucket_size; +- else return (2 << deepest_bucket) * deepest_size; ++ if (deepest_size < m_bucket_size / 2) return (size_type(1) << deepest_bucket) * m_bucket_size; ++ else return (size_type(2) << deepest_bucket) * deepest_size; + } + + #if (defined TORRENT_DHT_VERBOSE_LOGGING || defined TORRENT_DEBUG) && TORRENT_USE_IOSTREAM +diff -ur ../libtorrent-rasterbar-0.16.0/src/peer_connection.cpp ./src/peer_connection.cpp +--- ../libtorrent-rasterbar-0.16.0/src/peer_connection.cpp 2012-04-04 20:41:21.000000000 -0700 ++++ ./src/peer_connection.cpp 2012-05-07 14:01:55.000000000 -0700 +@@ -346,6 +346,7 @@ + , m_holepunch_mode(false) + , m_ignore_stats(false) + , m_corked(false) ++ , m_has_metadata(true) + #if defined TORRENT_DEBUG || TORRENT_RELEASE_ASSERTS + , m_in_constructor(true) + , m_disconnect_started(false) +@@ -3286,6 +3287,13 @@ + return; + } + ++ // we can't download pieces in these states ++ if (t->state() == torrent_status::checking_files ++ || t->state() == torrent_status::checking_resume_data ++ || t->state() == torrent_status::downloading_metadata ++ || t->state() == torrent_status::allocating) ++ return; ++ + if ((int)m_download_queue.size() >= m_desired_queue_size + || t->upload_mode()) return; + +@@ -3869,13 +3877,14 @@ + if (peer_info_struct()) + { + policy::peer* pi = peer_info_struct(); ++ TORRENT_ASSERT(pi->in_use); + p.source = pi->source; + p.failcount = pi->failcount; + p.num_hashfails = pi->hashfails; + p.flags |= pi->on_parole ? peer_info::on_parole : 0; + p.flags |= pi->optimistically_unchoked ? peer_info::optimistic_unchoke : 0; + #ifndef TORRENT_DISABLE_GEO_IP +- p.inet_as = pi->inet_as->first; ++ p.inet_as = pi->inet_as ? pi->inet_as->first : 0xffff; + #endif + } + else +@@ -4677,7 +4686,13 @@ + // assume 20 kB/s + upload_capacity = (std::max)(20000, m_ses.m_peak_up_rate + 10000); + } +- priority = (boost::uint64_t(m_est_reciprocation_rate) << 10) / upload_capacity; ++ int estimated_reciprocation_rate = m_est_reciprocation_rate; ++ // we cannot send faster than our upload rate anyway ++ if (estimated_reciprocation_rate < upload_capacity) ++ estimated_reciprocation_rate = upload_capacity; ++ ++ priority = (boost::uint64_t(estimated_reciprocation_rate) << 14) / upload_capacity; ++ if (priority > 0xffff) priority = 0xffff; + } + else + { +@@ -4685,7 +4700,7 @@ + if (priority > 255) priority = 255; + priority += t->priority() << 8; + } +- TORRENT_ASSERT(priority < 0xffff); ++ TORRENT_ASSERT(priority <= 0xffff); + + // peers that we are not interested in are non-prioritized + TORRENT_ASSERT((m_channel_state[upload_channel] & peer_info::bw_limit) == 0); +@@ -4760,15 +4775,16 @@ + && t) + { + int ret = 0; +- if (!m_ignore_bandwidth_limits) ++ bool utp = m_socket->get<utp_stream>() != 0; ++ bool ignore_limits = m_ignore_bandwidth_limits ++ || (!m_ses.m_settings.rate_limit_utp && utp); ++ if (!ignore_limits) + { +- bool utp = m_socket->get<utp_stream>() != 0; +- + // in this case, we have data to send, but no + // bandwidth. So, we simply request bandwidth + // from the bandwidth manager + ret = request_upload_bandwidth( +- (m_ses.m_settings.rate_limit_utp || !utp) ? &m_ses.m_upload_channel : 0 ++ &m_ses.m_upload_channel + , &t->m_bandwidth_channel[upload_channel] + , &m_bandwidth_channel[upload_channel] + , !utp ? &m_ses.m_tcp_upload_channel : 0); +@@ -4913,15 +4929,16 @@ + && t) + { + int ret = 0; +- if (!m_ignore_bandwidth_limits) ++ bool utp = m_socket->get<utp_stream>() != 0; ++ bool ignore_limits = m_ignore_bandwidth_limits ++ || (!m_ses.m_settings.rate_limit_utp && utp); ++ if (!ignore_limits) + { +- bool utp = m_socket->get<utp_stream>() != 0; +- + // in this case, we have outstanding data to + // receive, but no bandwidth quota. So, we simply + // request bandwidth from the bandwidth manager + ret = request_download_bandwidth( +- (m_ses.m_settings.rate_limit_utp || !utp) ? &m_ses.m_download_channel : 0 ++ &m_ses.m_download_channel + , &t->m_bandwidth_channel[download_channel] + , &m_bandwidth_channel[download_channel] + , !utp ? &m_ses.m_tcp_download_channel : 0); +diff -ur ../libtorrent-rasterbar-0.16.0/src/piece_picker.cpp ./src/piece_picker.cpp +--- ../libtorrent-rasterbar-0.16.0/src/piece_picker.cpp 2012-04-03 21:24:17.000000000 -0700 ++++ ./src/piece_picker.cpp 2012-05-07 14:01:55.000000000 -0700 +@@ -44,9 +44,10 @@ + #include "libtorrent/bitfield.hpp" + #include "libtorrent/random.hpp" + +-#ifdef TORRENT_DEBUG ++#if defined TORRENT_DEBUG || TORRENT_RELEASE_ASSERTS + #include "libtorrent/peer_connection.hpp" + #include "libtorrent/torrent.hpp" ++#include "libtorrent/policy.hpp" // for policy::peer + #endif + + #include "libtorrent/invariant_check.hpp" +@@ -189,6 +190,9 @@ + ret.info[i].num_peers = 0; + ret.info[i].state = block_info::state_none; + ret.info[i].peer = 0; ++#if defined TORRENT_DEBUG || TORRENT_RELEASE_ASSERTS ++ ret.info[i].piece_index = piece; ++#endif + } + return ret; + } +@@ -304,6 +308,8 @@ + int num_writing = 0; + for (int k = 0; k < num_blocks; ++k) + { ++ TORRENT_ASSERT(i->info[k].piece_index == i->index); ++ TORRENT_ASSERT(i->info[k].peer == 0 || static_cast<policy::peer*>(i->info[k].peer)->in_use); + if (i->info[k].state == block_info::state_finished) + { + ++num_finished; +@@ -827,6 +833,7 @@ + int num_blocks = blocks_in_piece(i->index); + for (int k = 0; k < num_blocks; ++k) + { ++ TORRENT_ASSERT(i->info[k].piece_index == index); + TORRENT_ASSERT(i->info[k].state == block_info::state_finished); + TORRENT_ASSERT(i->info[k].num_peers == 0); + } +@@ -1367,6 +1374,8 @@ + , int options, std::vector<int> const& suggested_pieces + , int num_peers) const + { ++ TORRENT_ASSERT(peer == 0 || static_cast<policy::peer*>(peer)->in_use); ++ + // prevent the number of partial pieces to grow indefinitely + // make this scale by the number of peers we have. For large + // scale clients, we would have more peers, and allow a higher +@@ -1613,6 +1622,8 @@ + for (int j = 0; j < num_blocks_in_piece; ++j) + { + block_info const& info = i->info[j]; ++ TORRENT_ASSERT(info.peer == 0 || static_cast<policy::peer*>(info.peer)->in_use); ++ TORRENT_ASSERT(info.piece_index == i->index); + if (info.state != block_info::state_requested + || info.peer == peer) + continue; +@@ -1650,6 +1661,7 @@ + for (int j = 0; j < num_blocks_in_piece; ++j) + { + block_info const& info = i->info[j]; ++ TORRENT_ASSERT(info.piece_index == i->index); + if (info.state != block_info::state_none) continue; + std::vector<piece_block>::iterator k = std::find( + interesting_blocks.begin(), interesting_blocks.end() +@@ -1695,6 +1707,7 @@ + for (int j = 0; j < num_blocks_in_piece; ++j) + { + block_info const& info = k->info[j]; ++ TORRENT_ASSERT(info.piece_index == k->index); + if (info.state == block_info::state_finished) continue; + TORRENT_ASSERT(info.peer != 0); + } +@@ -1736,7 +1749,10 @@ + { + for (std::vector<block_info>::iterator i = m_block_info.begin() + , end(m_block_info.end()); i != end; ++i) ++ { ++ TORRENT_ASSERT(i->peer == 0 || static_cast<policy::peer*>(i->peer)->in_use); + if (i->peer == peer) i->peer = 0; ++ } + } + + namespace +@@ -1753,6 +1769,8 @@ + for (int j = 0; j < num_blocks_in_piece; ++j) + { + piece_picker::block_info const& info = p.info[j]; ++ TORRENT_ASSERT(info.peer == 0 || static_cast<policy::peer*>(info.peer)->in_use); ++ TORRENT_ASSERT(info.piece_index == p.index); + if (info.state != piece_picker::block_info::state_none + && info.peer != peer) + { +@@ -1882,6 +1900,7 @@ + { + // ignore completed blocks and already requested blocks + block_info const& info = dp.info[j]; ++ TORRENT_ASSERT(info.piece_index == dp.index); + if (info.state != block_info::state_none) continue; + backup_blocks2.push_back(piece_block(dp.index, j)); + } +@@ -1892,6 +1911,7 @@ + { + // ignore completed blocks and already requested blocks + block_info const& info = dp.info[j]; ++ TORRENT_ASSERT(info.piece_index == dp.index); + if (info.state != block_info::state_none) continue; + + // if the piece is fast and the peer is slow, or vice versa, +@@ -1985,6 +2005,7 @@ + #ifdef TORRENT_DEBUG + for (int k = 0; k < max_blocks; ++k) + { ++ TORRENT_ASSERT(i->info[k].piece_index == index); + TORRENT_ASSERT(i->info[k].state == block_info::state_finished + || i->info[k].state == block_info::state_writing); + } +@@ -2033,6 +2054,7 @@ + std::vector<downloading_piece>::const_iterator i = find_dl_piece(block.piece_index); + + TORRENT_ASSERT(i != m_downloads.end()); ++ TORRENT_ASSERT(i->info[block.block_index].piece_index == block.piece_index); + return i->info[block.block_index].state == block_info::state_requested; + } + +@@ -2046,6 +2068,7 @@ + if (m_piece_map[block.piece_index].downloading == 0) return false; + std::vector<downloading_piece>::const_iterator i = find_dl_piece(block.piece_index); + TORRENT_ASSERT(i != m_downloads.end()); ++ TORRENT_ASSERT(i->info[block.block_index].piece_index == block.piece_index); + return i->info[block.block_index].state == block_info::state_finished + || i->info[block.block_index].state == block_info::state_writing; + } +@@ -2060,12 +2083,14 @@ + if (m_piece_map[block.piece_index].downloading == 0) return false; + std::vector<downloading_piece>::const_iterator i = find_dl_piece(block.piece_index); + TORRENT_ASSERT(i != m_downloads.end()); ++ TORRENT_ASSERT(i->info[block.block_index].piece_index == block.piece_index); + return i->info[block.block_index].state == block_info::state_finished; + } + + bool piece_picker::mark_as_downloading(piece_block block + , void* peer, piece_state_t state) + { ++ TORRENT_ASSERT(peer == 0 || static_cast<policy::peer*>(peer)->in_use); + TORRENT_ASSERT(state != piece_picker::none); + TORRENT_ASSERT(block.piece_index >= 0); + TORRENT_ASSERT(block.block_index >= 0); +@@ -2088,6 +2113,7 @@ + downloading_piece& dp = add_download_piece(block.piece_index); + dp.state = state; + block_info& info = dp.info[block.block_index]; ++ TORRENT_ASSERT(info.piece_index == block.piece_index); + info.state = block_info::state_requested; + info.peer = peer; + info.num_peers = 1; +@@ -2102,6 +2128,7 @@ + std::vector<downloading_piece>::iterator i = find_dl_piece(block.piece_index); + TORRENT_ASSERT(i != m_downloads.end()); + block_info& info = i->info[block.block_index]; ++ TORRENT_ASSERT(info.piece_index == block.piece_index); + if (info.state == block_info::state_writing + || info.state == block_info::state_finished) + return false; +@@ -2135,6 +2162,7 @@ + TORRENT_ASSERT(i != m_downloads.end()); + + block_info const& info = i->info[block.block_index]; ++ TORRENT_ASSERT(info.piece_index == block.piece_index); + return info.num_peers; + } + +@@ -2156,6 +2184,8 @@ + TORRENT_PIECE_PICKER_INVARIANT_CHECK; + #endif + ++ TORRENT_ASSERT(peer == 0 || static_cast<policy::peer*>(peer)->in_use); ++ + TORRENT_ASSERT(block.piece_index >= 0); + TORRENT_ASSERT(block.block_index >= 0); + TORRENT_ASSERT(block.piece_index < m_piece_map.size()); +@@ -2181,6 +2211,7 @@ + downloading_piece& dp = add_download_piece(block.piece_index); + dp.state = none; + block_info& info = dp.info[block.block_index]; ++ TORRENT_ASSERT(info.piece_index == block.piece_index); + info.state = block_info::state_writing; + info.peer = peer; + info.num_peers = 0; +@@ -2194,6 +2225,8 @@ + TORRENT_ASSERT(i != m_downloads.end()); + block_info& info = i->info[block.block_index]; + ++ TORRENT_ASSERT(info.piece_index == block.piece_index); ++ + info.peer = peer; + if (info.state == block_info::state_requested) --i->requested; + TORRENT_ASSERT(i->requested >= 0); +@@ -2203,6 +2236,7 @@ + + ++i->writing; + info.state = block_info::state_writing; ++ TORRENT_ASSERT(info.piece_index == block.piece_index); + + // all other requests for this block should have been + // cancelled now +@@ -2228,6 +2262,7 @@ + if (i == m_downloads.end()) return; + + block_info& info = i->info[block.block_index]; ++ TORRENT_ASSERT(info.piece_index == block.piece_index); + TORRENT_ASSERT(info.state == block_info::state_writing); + TORRENT_ASSERT(info.num_peers == 0); + +@@ -2263,6 +2298,7 @@ + + void piece_picker::mark_as_finished(piece_block block, void* peer) + { ++ TORRENT_ASSERT(peer == 0 || static_cast<policy::peer*>(peer)->in_use); + TORRENT_ASSERT(block.piece_index >= 0); + TORRENT_ASSERT(block.block_index >= 0); + TORRENT_ASSERT(block.piece_index < m_piece_map.size()); +@@ -2289,6 +2325,7 @@ + downloading_piece& dp = add_download_piece(block.piece_index); + dp.state = none; + block_info& info = dp.info[block.block_index]; ++ TORRENT_ASSERT(info.piece_index == block.piece_index); + info.peer = peer; + TORRENT_ASSERT(info.state == block_info::state_none); + TORRENT_ASSERT(info.num_peers == 0); +@@ -2308,6 +2345,7 @@ + std::vector<downloading_piece>::iterator i = find_dl_piece(block.piece_index); + TORRENT_ASSERT(i != m_downloads.end()); + block_info& info = i->info[block.block_index]; ++ TORRENT_ASSERT(info.piece_index == block.piece_index); + + if (info.state == block_info::state_finished) return; + +@@ -2340,6 +2378,7 @@ + d.clear(); + for (int j = 0, end(blocks_in_piece(index)); j != end; ++j) + { ++ TORRENT_ASSERT(i->info[j].peer == 0 || static_cast<policy::peer*>(i->info[j].peer)->in_use); + d.push_back(i->info[j].peer); + } + } +@@ -2352,10 +2391,13 @@ + + TORRENT_ASSERT(block.block_index >= 0); + ++ TORRENT_ASSERT(i->info[block.block_index].piece_index == block.piece_index); + if (i->info[block.block_index].state == block_info::state_none) + return 0; + +- return i->info[block.block_index].peer; ++ void* peer = i->info[block.block_index].peer; ++ TORRENT_ASSERT(peer == 0 || static_cast<policy::peer*>(peer)->in_use); ++ return peer; + } + + // this is called when a request is rejected or when +@@ -2366,6 +2408,8 @@ + TORRENT_PIECE_PICKER_INVARIANT_CHECK; + #endif + ++ TORRENT_ASSERT(peer == 0 || static_cast<policy::peer*>(peer)->in_use); ++ + TORRENT_ASSERT(block.piece_index >= 0); + TORRENT_ASSERT(block.block_index >= 0); + TORRENT_ASSERT(block.piece_index < m_piece_map.size()); +@@ -2381,6 +2425,8 @@ + TORRENT_ASSERT(i != m_downloads.end()); + + block_info& info = i->info[block.block_index]; ++ TORRENT_ASSERT(info.peer == 0 || static_cast<policy::peer*>(info.peer)->in_use); ++ TORRENT_ASSERT(info.piece_index == block.piece_index); + + TORRENT_ASSERT(info.state != block_info::state_none); + +@@ -2407,7 +2453,7 @@ + info.state = block_info::state_none; + --i->requested; + update_full(*i); +- } ++ } + + // if there are no other blocks in this piece + // that's being downloaded, remove it from the list +diff -ur ../libtorrent-rasterbar-0.16.0/src/policy.cpp ./src/policy.cpp +--- ../libtorrent-rasterbar-0.16.0/src/policy.cpp 2012-04-10 20:14:39.000000000 -0700 ++++ ./src/policy.cpp 2012-05-07 14:01:55.000000000 -0700 +@@ -1029,6 +1029,14 @@ + pp.source |= src; + if (!was_conn_cand && is_connect_candidate(pp, m_finished)) + ++m_num_connect_candidates; ++ // calling disconnect() on a peer, may actually end ++ // up "garbage collecting" its policy::peer entry ++ // as well, if it's considered useless (which this specific) ++ // case will, since it was an incoming peer that just disconnected ++ // and we allow multiple connections per IP. Because of that, ++ // we need to make sure we don't let it do that, by unlinking ++ // the peer_connection from the policy::peer first. ++ p->connection->set_peer_info(0); + p->connection->disconnect(errors::duplicate_peer_id); + erase_peer(p); + return false; +diff -ur ../libtorrent-rasterbar-0.16.0/src/session.cpp ./src/session.cpp +--- ../libtorrent-rasterbar-0.16.0/src/session.cpp 2012-04-10 20:18:57.000000000 -0700 ++++ ./src/session.cpp 2012-05-07 14:01:48.000000000 -0700 +@@ -1261,7 +1261,7 @@ + , utp_dynamic_sock_buf(true) + , utp_loss_multiplier(50) // specified in percent + , mixed_mode_algorithm(peer_proportional) +- , rate_limit_utp(false) ++ , rate_limit_utp(true) + , listen_queue_size(5) + , announce_double_nat(false) + , torrent_connect_boost(10) +diff -ur ../libtorrent-rasterbar-0.16.0/src/session_impl.cpp ./src/session_impl.cpp +--- ../libtorrent-rasterbar-0.16.0/src/session_impl.cpp 2012-04-05 21:39:49.000000000 -0700 ++++ ./src/session_impl.cpp 2012-05-07 14:01:55.000000000 -0700 +@@ -4310,6 +4310,7 @@ + TORRENT_ASSERT(p); + policy::peer* pi = p->peer_info_struct(); + if (!pi) continue; ++ if (pi->web_seed) continue; + torrent* t = p->associated_torrent().lock().get(); + if (!t) continue; + if (t->is_paused()) continue; +@@ -4408,7 +4409,8 @@ + torrent* t = p->associated_torrent().lock().get(); + policy::peer* pi = p->peer_info_struct(); + +- if (p->ignore_unchoke_slots() || t == 0 || pi == 0 || t->is_paused()) continue; ++ if (p->ignore_unchoke_slots() || t == 0 || pi == 0 || pi->web_seed || t->is_paused()) ++ continue; + + if (m_settings.choking_algorithm == session_settings::bittyrant_choker) + { +diff -ur ../libtorrent-rasterbar-0.16.0/src/torrent.cpp ./src/torrent.cpp +--- ../libtorrent-rasterbar-0.16.0/src/torrent.cpp 2012-04-11 00:20:14.000000000 -0700 ++++ ./src/torrent.cpp 2012-05-07 14:01:55.000000000 -0700 +@@ -433,6 +433,10 @@ + #if defined TORRENT_DEBUG || TORRENT_RELEASE_ASSERTS + m_resume_data_loaded = false; + #endif ++#if TORRENT_USE_UNC_PATHS ++ m_save_path = canonicalize_path(m_save_path); ++#endif ++ + if (!m_apply_ip_filter) ++m_ses.m_non_filtered_torrents; + + if (!p.ti || !p.ti->is_valid()) +@@ -2048,14 +2052,15 @@ + m_net_interfaces.clear(); + + char* str = strdup(net_interfaces.c_str()); ++ char* ptr = str; + +- while (str) ++ while (ptr) + { +- char* space = strchr(str, ','); ++ char* space = strchr(ptr, ','); + if (space) *space++ = 0; + error_code ec; +- address a(address::from_string(str, ec)); +- str = space; ++ address a(address::from_string(ptr, ec)); ++ ptr = space; + if (ec) continue; + m_net_interfaces.push_back(tcp::endpoint(a, 0)); + } +@@ -3633,7 +3638,7 @@ + } + while (i != m_time_critical_pieces.begin() && i->deadline < boost::prior(i)->deadline) + { +- std::iter_swap(i, boost::next(i)); ++ std::iter_swap(i, boost::prior(i)); + --i; + } + return; +@@ -3687,21 +3692,26 @@ + read_piece(i->piece); + } + +- // update the average download time and average +- // download time deviation +- int dl_time = total_milliseconds(time_now() - i->first_requested); +- +- if (m_average_piece_time == 0) +- { +- m_average_piece_time = dl_time; +- } +- else +- { +- int diff = abs(int(dl_time - m_average_piece_time)); +- if (m_piece_time_deviation == 0) m_piece_time_deviation = diff; +- else m_piece_time_deviation = (m_piece_time_deviation * 6 + diff * 4) / 10; +- +- m_average_piece_time = (m_average_piece_time * 6 + dl_time * 4) / 10; ++ // if first_requested is min_time(), it wasn't requested as a critical piece ++ // and we shouldn't adjust any average download times ++ if (i->first_requested != min_time()) ++ { ++ // update the average download time and average ++ // download time deviation ++ int dl_time = total_milliseconds(time_now() - i->first_requested); ++ ++ if (m_average_piece_time == 0) ++ { ++ m_average_piece_time = dl_time; ++ } ++ else ++ { ++ int diff = abs(int(dl_time - m_average_piece_time)); ++ if (m_piece_time_deviation == 0) m_piece_time_deviation = diff; ++ else m_piece_time_deviation = (m_piece_time_deviation * 6 + diff * 4) / 10; ++ ++ m_average_piece_time = (m_average_piece_time * 6 + dl_time * 4) / 10; ++ } + } + } + m_time_critical_pieces.erase(i); +@@ -4317,7 +4327,14 @@ + web->removed = true; + return; + } ++ peer_connection * peer = web->peer_info.connection; ++ if (peer) { ++ TORRENT_ASSERT(peer->m_in_use == 1337); ++ peer->set_peer_info(0); ++ } + if (has_picker()) picker().clear_peer(&web->peer_info); ++ ++ + m_web_seeds.erase(web); + } + +@@ -4503,6 +4520,14 @@ + + if (m_ses.is_aborted()) return; + ++#ifndef TORRENT_DISABLE_GEO_IP ++ int as = m_ses.as_for_ip(host->endpoint().address()); ++#ifdef TORRENT_DEBUG ++ web->peer_info.inet_as_num = as; ++#endif ++ web->peer_info.inet_as = m_ses.lookup_as(as); ++#endif ++ + if (int(m_connections.size()) >= m_max_connections + || m_ses.num_connections() >= m_ses.settings().connections_limit) + return; +@@ -5351,6 +5376,7 @@ + i != end(); ++i) + { + peer_connection* peer = *i; ++ TORRENT_ASSERT(peer->m_in_use == 1337); + + // incoming peers that haven't finished the handshake should + // not be included in this list +@@ -5792,9 +5818,9 @@ + for (std::set<peer_connection*>::iterator i = m_connections.begin() + , end(m_connections.end()); i != end; ++i) + { +- peer_connection* p = *i; +- if (!p->is_connecting()) continue; +- p->disconnect(errors::too_many_connections); ++ peer_connection* peer = *i; ++ if (!peer->is_connecting()) continue; ++ peer->disconnect(errors::too_many_connections); + break; + } + } +@@ -6221,12 +6247,22 @@ + + if (m_owning_storage.get()) + { +- m_owning_storage->async_move_storage(save_path ++#if TORRENT_USE_UNC_PATHS ++ std::string path = canonicalize_path(save_path); ++#else ++ std::string const& path = save_path; ++#endif ++ m_owning_storage->async_move_storage(path + , boost::bind(&torrent::on_storage_moved, shared_from_this(), _1, _2)); + } + else + { ++#if TORRENT_USE_UNC_PATHS ++ m_save_path = canonicalize_path(save_path); ++#else ++ + m_save_path = save_path; ++#endif + if (alerts().should_post<storage_moved_alert>()) + { + alerts().post_alert(storage_moved_alert(get_handle(), m_save_path)); +@@ -7858,6 +7894,7 @@ + , (boost::bind(&policy::peer::connection, boost::bind(&web_seed_entry::peer_info, _1)) == p)); + TORRENT_ASSERT(i != m_web_seeds.end()); + if (i == m_web_seeds.end()) return; ++ p->set_peer_info(0); + if (has_picker()) picker().clear_peer(&i->peer_info); + m_web_seeds.erase(i); + } +diff -ur ../libtorrent-rasterbar-0.16.0/src/torrent_info.cpp ./src/torrent_info.cpp +--- ../libtorrent-rasterbar-0.16.0/src/torrent_info.cpp 2012-03-29 21:09:02.000000000 -0700 ++++ ./src/torrent_info.cpp 2012-05-07 14:01:48.000000000 -0700 +@@ -643,7 +643,8 @@ + } + + torrent_info::torrent_info(std::string const& filename, int flags) +- : m_piece_hashes(0) ++ : m_merkle_first_leaf(0) ++ , m_piece_hashes(0) + , m_creation_date(0) + , m_info_section_size(0) + , m_multifile(false) +@@ -695,7 +696,8 @@ + #endif + + torrent_info::torrent_info(lazy_entry const& torrent_file, error_code& ec, int flags) +- : m_piece_hashes(0) ++ : m_merkle_first_leaf(0) ++ , m_piece_hashes(0) + , m_creation_date(0) + , m_info_section_size(0) + , m_multifile(false) +diff -ur ../libtorrent-rasterbar-0.16.0/src/utp_stream.cpp ./src/utp_stream.cpp +--- ../libtorrent-rasterbar-0.16.0/src/utp_stream.cpp 2012-03-26 19:02:55.000000000 -0700 ++++ ./src/utp_stream.cpp 2012-05-07 14:01:48.000000000 -0700 +@@ -2882,6 +2882,16 @@ + + m_cwnd = boost::int64_t(m_mtu) << 16; + if (m_outbuf.size()) ++m_num_timeouts; ++ ++ if (m_num_timeouts > m_sm->num_resends()) ++ { ++ // the connection is dead ++ m_error = asio::error::timed_out; ++ m_state = UTP_STATE_ERROR_WAIT; ++ test_socket_state(); ++ return; ++ } ++ + m_timeout = now + milliseconds(packet_timeout()); + + UTP_LOGV("%8p: timeout resetting cwnd:%d\n" +diff -ur ../libtorrent-rasterbar-0.16.0/src/web_peer_connection.cpp ./src/web_peer_connection.cpp +--- ../libtorrent-rasterbar-0.16.0/src/web_peer_connection.cpp 2012-04-09 20:53:39.000000000 -0700 ++++ ./src/web_peer_connection.cpp 2012-05-07 14:01:55.000000000 -0700 +@@ -71,6 +71,7 @@ + , web_seed_entry::headers_t const& extra_headers) + : web_connection_base(ses, t, s, remote, url, peerinfo, auth, extra_headers) + , m_url(url) ++ , m_received_body(0) + , m_range_pos(0) + , m_block_pos(0) + , m_chunk_pos(0) +@@ -84,9 +85,10 @@ + shared_ptr<torrent> tor = t.lock(); + TORRENT_ASSERT(tor); + +- // we always prefer downloading 1 MB chunks +- // from web seeds +- prefer_whole_pieces((1024 * 1024) / tor->torrent_file().piece_length()); ++ // we always prefer downloading 1 MiB chunks ++ // from web seeds, or whole pieces if pieces ++ // are larger than a MiB ++ prefer_whole_pieces((std::min)((1024 * 1024) / tor->torrent_file().piece_length(), 1)); + + // we want large blocks as well, so + // we can request more bytes at once +diff -ur ../libtorrent-rasterbar-0.16.0/test/test_piece_picker.cpp ./test/test_piece_picker.cpp +--- ../libtorrent-rasterbar-0.16.0/test/test_piece_picker.cpp 2012-04-09 20:53:39.000000000 -0700 ++++ ./test/test_piece_picker.cpp 2012-05-07 14:02:34.000000000 -0700 +@@ -221,13 +221,18 @@ + + int test_main() + { +- +- int tmp1; +- int tmp2; +- int tmp3; + tcp::endpoint endp; + piece_picker::downloading_piece st; ++ policy::ipv4_peer tmp1(endp, false, 0); ++ policy::ipv4_peer tmp2(endp, false, 0); ++ policy::ipv4_peer tmp3(endp, false, 0); + policy::ipv4_peer peer_struct(endp, true, 0); ++#if defined TORRENT_DEBUG || TORRENT_RELEASE_ASSERTS ++ tmp1.in_use = true; ++ tmp2.in_use = true; ++ tmp3.in_use = true; ++ peer_struct.in_use = true; ++#endif + std::vector<piece_block> picked; + boost::shared_ptr<piece_picker> p; + const std::vector<int> empty_vector; +@@ -303,23 +308,23 @@ + TEST_CHECK(p->is_requested(piece_block(0, 0)) == false); + TEST_CHECK(std::find(picked.begin(), picked.end(), piece_block(0,0)) != picked.end()); + +- p->mark_as_downloading(piece_block(0, 2), (void*)1337, piece_picker::fast); +- p->mark_as_writing(piece_block(0, 2), (void*)1337); +- p->abort_download(piece_block(0, 2), (void*)1337); +- p->mark_as_downloading(piece_block(0, 2), (void*)7, piece_picker::fast); +- p->mark_as_writing(piece_block(0, 2), (void*)7); ++ p->mark_as_downloading(piece_block(0, 2), &tmp1, piece_picker::fast); ++ p->mark_as_writing(piece_block(0, 2), &tmp1); ++ p->abort_download(piece_block(0, 2), &tmp1); ++ p->mark_as_downloading(piece_block(0, 2), &tmp2, piece_picker::fast); ++ p->mark_as_writing(piece_block(0, 2), &tmp2); + + std::vector<void*> d; + p->get_downloaders(d, 0); +- TEST_CHECK(d[2] == (void*)7); ++ TEST_CHECK(d[2] == &tmp2); + +- p->mark_as_downloading(piece_block(0, 3), (void*)1337, piece_picker::fast); +- p->abort_download(piece_block(0, 3), (void*)1337); +- p->mark_as_downloading(piece_block(0, 3), (void*)7, piece_picker::fast); +- p->mark_as_writing(piece_block(0, 3), (void*)7); ++ p->mark_as_downloading(piece_block(0, 3), &tmp1, piece_picker::fast); ++ p->abort_download(piece_block(0, 3), &tmp1); ++ p->mark_as_downloading(piece_block(0, 3), &tmp2, piece_picker::fast); ++ p->mark_as_writing(piece_block(0, 3), &tmp2); + + p->get_downloaders(d, 0); +- TEST_CHECK(d[3] == (void*)7); ++ TEST_CHECK(d[3] == &tmp2); + + // ======================================================== + +diff -ur ../libtorrent-rasterbar-0.16.0/test/test_primitives.cpp ./test/test_primitives.cpp +--- ../libtorrent-rasterbar-0.16.0/test/test_primitives.cpp 2012-03-29 21:09:02.000000000 -0700 ++++ ./test/test_primitives.cpp 2012-05-07 14:02:34.000000000 -0700 +@@ -871,6 +871,15 @@ + TEST_EQUAL(combine_path("test1", "test2"), "test1/test2"); + #endif + ++#if TORRENT_USE_UNC_PATHS ++ TEST_EQUAL(canonicalize_path("c:\\a\\..\\b"), "c:\\b"); ++ TEST_EQUAL(canonicalize_path("a\\..\\b"), "b"); ++ TEST_EQUAL(canonicalize_path("a\\..\\.\\b"), "b"); ++ TEST_EQUAL(canonicalize_path("\\.\\a"), "\\a"); ++ TEST_EQUAL(canonicalize_path("\\\\bla\\.\\a"), "\\\\bla\\a"); ++ TEST_EQUAL(canonicalize_path("c:\\bla\\a"), "c:\\bla\\a"); ++#endif ++ + TEST_EQUAL(extension("blah"), ""); + TEST_EQUAL(extension("blah.exe"), ".exe"); + TEST_EQUAL(extension("blah.foo.bar"), ".bar"); diff --git a/net-p2p/libtorrent-rasterbar-16/pkg-descr b/net-p2p/libtorrent-rasterbar-16/pkg-descr new file mode 100644 index 000000000000..1056baf8fd27 --- /dev/null +++ b/net-p2p/libtorrent-rasterbar-16/pkg-descr @@ -0,0 +1,14 @@ +libtorrent is a C++ library that aims to be a good alternative to all the +other bittorrent implementations around. It is a library and not a full +featured client. + +The main goals of libtorrent are: + * to be cpu efficient + * to be memory efficient + * to be very easy to use + +The 0.16 branch adds uTP support. + +Note that this is NOT the same library as the libtorrent port! + +WWW: http://www.rasterbar.com/products/libtorrent/index.html diff --git a/net-p2p/libtorrent-rasterbar-16/pkg-plist b/net-p2p/libtorrent-rasterbar-16/pkg-plist new file mode 100644 index 000000000000..1375015d8515 --- /dev/null +++ b/net-p2p/libtorrent-rasterbar-16/pkg-plist @@ -0,0 +1,141 @@ +include/libtorrent/ConvertUTF.h +include/libtorrent/add_torrent_params.hpp +include/libtorrent/address.hpp +include/libtorrent/alert.hpp +include/libtorrent/alert_types.hpp +include/libtorrent/alloca.hpp +include/libtorrent/allocator.hpp +include/libtorrent/assert.hpp +include/libtorrent/aux_/session_impl.hpp +include/libtorrent/bandwidth_limit.hpp +include/libtorrent/bandwidth_manager.hpp +include/libtorrent/bandwidth_queue_entry.hpp +include/libtorrent/bandwidth_socket.hpp +include/libtorrent/bencode.hpp +include/libtorrent/bitfield.hpp +include/libtorrent/bloom_filter.hpp +include/libtorrent/broadcast_socket.hpp +include/libtorrent/bt_peer_connection.hpp +include/libtorrent/buffer.hpp +include/libtorrent/build_config.hpp +include/libtorrent/chained_buffer.hpp +include/libtorrent/config.hpp +include/libtorrent/connection_queue.hpp +include/libtorrent/copy_ptr.hpp +include/libtorrent/create_torrent.hpp +include/libtorrent/deadline_timer.hpp +include/libtorrent/debug.hpp +include/libtorrent/disk_buffer_holder.hpp +include/libtorrent/disk_buffer_pool.hpp +include/libtorrent/disk_io_thread.hpp +include/libtorrent/entry.hpp +include/libtorrent/enum_net.hpp +include/libtorrent/error.hpp +include/libtorrent/error_code.hpp +include/libtorrent/escape_string.hpp +include/libtorrent/extensions.hpp +include/libtorrent/extensions/logger.hpp +include/libtorrent/extensions/lt_trackers.hpp +include/libtorrent/extensions/metadata_transfer.hpp +include/libtorrent/extensions/smart_ban.hpp +include/libtorrent/extensions/ut_metadata.hpp +include/libtorrent/extensions/ut_pex.hpp +include/libtorrent/file.hpp +include/libtorrent/file_pool.hpp +include/libtorrent/file_storage.hpp +include/libtorrent/fingerprint.hpp +include/libtorrent/gzip.hpp +include/libtorrent/hasher.hpp +include/libtorrent/http_connection.hpp +include/libtorrent/http_parser.hpp +include/libtorrent/http_seed_connection.hpp +include/libtorrent/http_stream.hpp +include/libtorrent/http_tracker_connection.hpp +include/libtorrent/i2p_stream.hpp +include/libtorrent/identify_client.hpp +include/libtorrent/instantiate_connection.hpp +include/libtorrent/intrusive_ptr_base.hpp +include/libtorrent/invariant_check.hpp +include/libtorrent/io.hpp +include/libtorrent/io_service.hpp +include/libtorrent/io_service_fwd.hpp +include/libtorrent/ip_filter.hpp +include/libtorrent/kademlia/dht_tracker.hpp +include/libtorrent/kademlia/find_data.hpp +include/libtorrent/kademlia/logging.hpp +include/libtorrent/kademlia/msg.hpp +include/libtorrent/kademlia/node.hpp +include/libtorrent/kademlia/node_entry.hpp +include/libtorrent/kademlia/node_id.hpp +include/libtorrent/kademlia/observer.hpp +include/libtorrent/kademlia/refresh.hpp +include/libtorrent/kademlia/routing_table.hpp +include/libtorrent/kademlia/rpc_manager.hpp +include/libtorrent/kademlia/traversal_algorithm.hpp +include/libtorrent/lazy_entry.hpp +include/libtorrent/lsd.hpp +include/libtorrent/magnet_uri.hpp +include/libtorrent/max.hpp +include/libtorrent/natpmp.hpp +include/libtorrent/packet_buffer.hpp +include/libtorrent/parse_url.hpp +include/libtorrent/pch.hpp +include/libtorrent/pe_crypto.hpp +include/libtorrent/peer.hpp +include/libtorrent/peer_connection.hpp +include/libtorrent/peer_id.hpp +include/libtorrent/peer_info.hpp +include/libtorrent/peer_request.hpp +include/libtorrent/piece_block_progress.hpp +include/libtorrent/piece_picker.hpp +include/libtorrent/policy.hpp +include/libtorrent/proxy_base.hpp +include/libtorrent/ptime.hpp +include/libtorrent/puff.hpp +include/libtorrent/random.hpp +include/libtorrent/rsa.hpp +include/libtorrent/rss.hpp +include/libtorrent/session.hpp +include/libtorrent/session_settings.hpp +include/libtorrent/session_status.hpp +include/libtorrent/settings.hpp +include/libtorrent/size_type.hpp +include/libtorrent/sliding_average.hpp +include/libtorrent/socket.hpp +include/libtorrent/socket_io.hpp +include/libtorrent/socket_type.hpp +include/libtorrent/socket_type_fwd.hpp +include/libtorrent/socks5_stream.hpp +include/libtorrent/ssl_stream.hpp +include/libtorrent/stat.hpp +include/libtorrent/storage.hpp +include/libtorrent/storage_defs.hpp +include/libtorrent/thread.hpp +include/libtorrent/time.hpp +include/libtorrent/timestamp_history.hpp +include/libtorrent/tommath.h +include/libtorrent/tommath_class.h +include/libtorrent/tommath_superclass.h +include/libtorrent/torrent.hpp +include/libtorrent/torrent_handle.hpp +include/libtorrent/torrent_info.hpp +include/libtorrent/tracker_manager.hpp +include/libtorrent/udp_socket.hpp +include/libtorrent/udp_tracker_connection.hpp +include/libtorrent/union_endpoint.hpp +include/libtorrent/upnp.hpp +include/libtorrent/utf8.hpp +include/libtorrent/utp_socket_manager.hpp +include/libtorrent/utp_stream.hpp +include/libtorrent/version.hpp +include/libtorrent/web_connection_base.hpp +include/libtorrent/web_peer_connection.hpp +include/libtorrent/xml_parse.hpp +lib/libtorrent-rasterbar.la +lib/libtorrent-rasterbar.so +lib/libtorrent-rasterbar.so.6 +libdata/pkgconfig/libtorrent-rasterbar.pc +@dirrm include/libtorrent/aux_ +@dirrm include/libtorrent/extensions +@dirrm include/libtorrent/kademlia +@dirrm include/libtorrent |