merged RC_1_1 into master
This commit is contained in:
commit
500bb24dba
|
@ -35,6 +35,7 @@ set(sources
|
||||||
escape_string
|
escape_string
|
||||||
string_util
|
string_util
|
||||||
file
|
file
|
||||||
|
fingerprint
|
||||||
gzip
|
gzip
|
||||||
hasher
|
hasher
|
||||||
hex
|
hex
|
||||||
|
|
|
@ -42,6 +42,7 @@
|
||||||
* resume data no longer has timestamps of files
|
* resume data no longer has timestamps of files
|
||||||
* require C++11 to build libtorrent
|
* require C++11 to build libtorrent
|
||||||
|
|
||||||
|
* add utility function for generating peer ID fingerprint
|
||||||
* fix bug in last-seen-complete
|
* fix bug in last-seen-complete
|
||||||
* remove file size limit in torrent_info filename constructor
|
* remove file size limit in torrent_info filename constructor
|
||||||
* fix tail-padding for last file in create_torrent
|
* fix tail-padding for last file in create_torrent
|
||||||
|
|
1
Jamfile
1
Jamfile
|
@ -605,6 +605,7 @@ SOURCES =
|
||||||
escape_string
|
escape_string
|
||||||
string_util
|
string_util
|
||||||
file
|
file
|
||||||
|
fingerprint
|
||||||
gzip
|
gzip
|
||||||
hasher
|
hasher
|
||||||
hex
|
hex
|
||||||
|
|
|
@ -10,6 +10,7 @@ void bind_fingerprint()
|
||||||
using namespace boost::python;
|
using namespace boost::python;
|
||||||
using namespace libtorrent;
|
using namespace libtorrent;
|
||||||
|
|
||||||
|
#ifndef TORRENT_NO_DEPRECATE
|
||||||
class_<fingerprint>("fingerprint", no_init)
|
class_<fingerprint>("fingerprint", no_init)
|
||||||
.def(
|
.def(
|
||||||
init<char const*,int,int,int,int>(
|
init<char const*,int,int,int,int>(
|
||||||
|
@ -23,5 +24,6 @@ void bind_fingerprint()
|
||||||
.def_readonly("revision_version", &fingerprint::revision_version)
|
.def_readonly("revision_version", &fingerprint::revision_version)
|
||||||
.def_readonly("tag_version", &fingerprint::tag_version)
|
.def_readonly("tag_version", &fingerprint::tag_version)
|
||||||
;
|
;
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -949,7 +949,7 @@ bool handle_alert(libtorrent::session& ses, libtorrent::alert* a
|
||||||
save_file(filename, buffer);
|
save_file(filename, buffer);
|
||||||
|
|
||||||
files.insert(std::pair<std::string, libtorrent::torrent_handle>(filename, h));
|
files.insert(std::pair<std::string, libtorrent::torrent_handle>(filename, h));
|
||||||
hash_to_filename.insert(std::make_pair(hash, filename));
|
hash_to_filename[hash] = filename;
|
||||||
non_files.erase(h);
|
non_files.erase(h);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -38,90 +38,61 @@ POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
|
||||||
#include "libtorrent/config.hpp"
|
#include "libtorrent/config.hpp"
|
||||||
#include "libtorrent/peer_id.hpp"
|
#include "libtorrent/peer_id.hpp"
|
||||||
#include "libtorrent/assert.hpp"
|
|
||||||
#include "libtorrent/export.hpp"
|
#include "libtorrent/export.hpp"
|
||||||
|
|
||||||
namespace libtorrent
|
namespace libtorrent
|
||||||
{
|
{
|
||||||
|
|
||||||
|
// This is a utility function to produce a client ID fingerprint formatted to
|
||||||
|
// the most common convention.
|
||||||
|
//
|
||||||
|
// The name string should contain exactly two characters. These are the
|
||||||
|
// characters unique to your client, used to identify it. Make sure not to
|
||||||
|
// clash with anybody else. Here are some taken id's:
|
||||||
|
//
|
||||||
|
// +----------+-----------------------+
|
||||||
|
// | id chars | client |
|
||||||
|
// +==========+=======================+
|
||||||
|
// | 'AZ' | Azureus |
|
||||||
|
// +----------+-----------------------+
|
||||||
|
// | 'LT' | libtorrent (default) |
|
||||||
|
// +----------+-----------------------+
|
||||||
|
// | 'BX' | BittorrentX |
|
||||||
|
// +----------+-----------------------+
|
||||||
|
// | 'MT' | Moonlight Torrent |
|
||||||
|
// +----------+-----------------------+
|
||||||
|
// | 'TS' | Torrent Storm |
|
||||||
|
// +----------+-----------------------+
|
||||||
|
// | 'SS' | Swarm Scope |
|
||||||
|
// +----------+-----------------------+
|
||||||
|
// | 'XT' | Xan Torrent |
|
||||||
|
// +----------+-----------------------+
|
||||||
|
//
|
||||||
|
// There's an informal directory of client id's here_.
|
||||||
|
//
|
||||||
|
// .. _here: http://wiki.theory.org/BitTorrentSpecification#peer_id
|
||||||
|
//
|
||||||
|
// The ``major``, ``minor``, ``revision`` and ``tag`` parameters are used to identify the
|
||||||
|
// version of your client.
|
||||||
|
TORRENT_EXPORT std::string generate_fingerprint(std::string name
|
||||||
|
, int major, int minor = 0, int revision = 0, int tag = 0);
|
||||||
|
|
||||||
// The fingerprint class represents information about a client and its version. It is used
|
// The fingerprint class represents information about a client and its version. It is used
|
||||||
// to encode this information into the client's peer id.
|
// to encode this information into the client's peer id.
|
||||||
struct TORRENT_DEPRECATED_EXPORT fingerprint
|
struct TORRENT_DEPRECATED TORRENT_DEPRECATED_EXPORT fingerprint
|
||||||
{
|
{
|
||||||
|
fingerprint(const char* id_string, int major, int minor, int revision, int tag);
|
||||||
|
|
||||||
// The constructor takes a ``char const*`` that should point to a string constant containing
|
#ifndef TORRENT_NO_DEPRECATE
|
||||||
// exactly two characters. These are the characters that should be unique for your client. Make
|
|
||||||
// sure not to clash with anybody else. Here are some taken id's:
|
|
||||||
//
|
|
||||||
// +----------+-----------------------+
|
|
||||||
// | id chars | client |
|
|
||||||
// +==========+=======================+
|
|
||||||
// | 'AZ' | Azureus |
|
|
||||||
// +----------+-----------------------+
|
|
||||||
// | 'LT' | libtorrent (default) |
|
|
||||||
// +----------+-----------------------+
|
|
||||||
// | 'BX' | BittorrentX |
|
|
||||||
// +----------+-----------------------+
|
|
||||||
// | 'MT' | Moonlight Torrent |
|
|
||||||
// +----------+-----------------------+
|
|
||||||
// | 'TS' | Torrent Storm |
|
|
||||||
// +----------+-----------------------+
|
|
||||||
// | 'SS' | Swarm Scope |
|
|
||||||
// +----------+-----------------------+
|
|
||||||
// | 'XT' | Xan Torrent |
|
|
||||||
// +----------+-----------------------+
|
|
||||||
//
|
|
||||||
// There's an informal directory of client id's here_.
|
|
||||||
//
|
|
||||||
// .. _here: http://wiki.theory.org/BitTorrentSpecification#peer_id
|
|
||||||
//
|
|
||||||
// The ``major``, ``minor``, ``revision`` and ``tag`` parameters are used to identify the
|
|
||||||
// version of your client.
|
|
||||||
fingerprint(const char* id_string, int major, int minor, int revision, int tag)
|
|
||||||
: major_version(major)
|
|
||||||
, minor_version(minor)
|
|
||||||
, revision_version(revision)
|
|
||||||
, tag_version(tag)
|
|
||||||
{
|
|
||||||
TORRENT_ASSERT(id_string);
|
|
||||||
TORRENT_ASSERT(major >= 0);
|
|
||||||
TORRENT_ASSERT(minor >= 0);
|
|
||||||
TORRENT_ASSERT(revision >= 0);
|
|
||||||
TORRENT_ASSERT(tag >= 0);
|
|
||||||
TORRENT_ASSERT(std::strlen(id_string) == 2);
|
|
||||||
name[0] = id_string[0];
|
|
||||||
name[1] = id_string[1];
|
|
||||||
}
|
|
||||||
|
|
||||||
// generates the actual string put in the peer-id, and return it.
|
// generates the actual string put in the peer-id, and return it.
|
||||||
std::string to_string() const
|
std::string to_string() const;
|
||||||
{
|
#endif
|
||||||
char s[100];
|
|
||||||
std::snprintf(s, 100, "-%c%c%c%c%c%c-"
|
|
||||||
, name[0], name[1]
|
|
||||||
, version_to_char(major_version)
|
|
||||||
, version_to_char(minor_version)
|
|
||||||
, version_to_char(revision_version)
|
|
||||||
, version_to_char(tag_version));
|
|
||||||
return s;
|
|
||||||
}
|
|
||||||
|
|
||||||
char name[2];
|
char name[2];
|
||||||
int major_version;
|
int major_version;
|
||||||
int minor_version;
|
int minor_version;
|
||||||
int revision_version;
|
int revision_version;
|
||||||
int tag_version;
|
int tag_version;
|
||||||
|
|
||||||
private:
|
|
||||||
|
|
||||||
char version_to_char(int v) const
|
|
||||||
{
|
|
||||||
if (v >= 0 && v < 10) return char('0' + v);
|
|
||||||
else if (v >= 10) return char('A' + (v - 10));
|
|
||||||
TORRENT_ASSERT_FAIL();
|
|
||||||
return '0';
|
|
||||||
}
|
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -35,21 +35,19 @@ POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
|
||||||
#include "libtorrent/config.hpp"
|
#include "libtorrent/config.hpp"
|
||||||
|
|
||||||
|
#ifndef TORRENT_NO_DEPRECATE
|
||||||
#include "libtorrent/aux_/disable_warnings_push.hpp"
|
#include "libtorrent/aux_/disable_warnings_push.hpp"
|
||||||
|
|
||||||
#include <boost/optional.hpp>
|
#include <boost/optional.hpp>
|
||||||
|
|
||||||
#include "libtorrent/aux_/disable_warnings_pop.hpp"
|
#include "libtorrent/aux_/disable_warnings_pop.hpp"
|
||||||
|
#endif
|
||||||
|
|
||||||
#include "libtorrent/peer_id.hpp"
|
#include "libtorrent/peer_id.hpp"
|
||||||
#include "libtorrent/fingerprint.hpp"
|
#include "libtorrent/fingerprint.hpp"
|
||||||
|
|
||||||
|
// TODO: hide this declaration when deprecated functions are disabled, and
|
||||||
|
// remove its internal use
|
||||||
namespace libtorrent
|
namespace libtorrent
|
||||||
{
|
{
|
||||||
|
|
||||||
// TODO: hide these declarations when deprecated functions are disabled, and
|
|
||||||
// expose them internally in a header under aux_.
|
|
||||||
|
|
||||||
// these functions don't really need to be public. This mechanism of
|
// these functions don't really need to be public. This mechanism of
|
||||||
// advertising client software and version is also out-dated.
|
// advertising client software and version is also out-dated.
|
||||||
|
|
||||||
|
@ -59,6 +57,16 @@ namespace libtorrent
|
||||||
TORRENT_DEPRECATED_EXPORT TORRENT_DEPRECATED
|
TORRENT_DEPRECATED_EXPORT TORRENT_DEPRECATED
|
||||||
std::string identify_client(const peer_id& p);
|
std::string identify_client(const peer_id& p);
|
||||||
|
|
||||||
|
#ifndef TORRENT_NO_DEPRECATE
|
||||||
|
|
||||||
|
#ifdef __GNUC__
|
||||||
|
#pragma GCC diagnostic push
|
||||||
|
#pragma GCC diagnostic ignored "-Wdeprecated-declarations"
|
||||||
|
#endif
|
||||||
|
#ifdef __clang__
|
||||||
|
#pragma clang diagnostic push
|
||||||
|
#pragma clang diagnostic ignored "-Wdeprecated-declarations"
|
||||||
|
#endif
|
||||||
// Returns an optional fingerprint if any can be identified from the peer
|
// Returns an optional fingerprint if any can be identified from the peer
|
||||||
// id. This can be used to automate the identification of clients. It will
|
// id. This can be used to automate the identification of clients. It will
|
||||||
// not be able to identify peers with non- standard encodings. Only Azureus
|
// not be able to identify peers with non- standard encodings. Only Azureus
|
||||||
|
@ -67,6 +75,15 @@ namespace libtorrent
|
||||||
boost::optional<fingerprint>
|
boost::optional<fingerprint>
|
||||||
client_fingerprint(peer_id const& p);
|
client_fingerprint(peer_id const& p);
|
||||||
|
|
||||||
|
#ifdef __GNUC__
|
||||||
|
#pragma GCC diagnostic pop
|
||||||
|
#endif
|
||||||
|
#ifdef __clang__
|
||||||
|
#pragma clang diagnostic pop
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif // TORRENT_NO_DEPRECATE
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif // TORRENT_IDENTIFY_CLIENT_HPP_INCLUDED
|
#endif // TORRENT_IDENTIFY_CLIENT_HPP_INCLUDED
|
||||||
|
|
|
@ -257,6 +257,14 @@ namespace libtorrent
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifndef TORRENT_NO_DEPRECATE
|
#ifndef TORRENT_NO_DEPRECATE
|
||||||
|
#ifdef __GNUC__
|
||||||
|
#pragma GCC diagnostic push
|
||||||
|
#pragma GCC diagnostic ignored "-Wdeprecated-declarations"
|
||||||
|
#endif
|
||||||
|
#ifdef __clang__
|
||||||
|
#pragma clang diagnostic push
|
||||||
|
#pragma clang diagnostic ignored "-Wdeprecated-declarations"
|
||||||
|
#endif
|
||||||
TORRENT_DEPRECATED
|
TORRENT_DEPRECATED
|
||||||
session(fingerprint const& print
|
session(fingerprint const& print
|
||||||
, int flags = start_default_features | add_default_plugins
|
, int flags = start_default_features | add_default_plugins
|
||||||
|
@ -309,6 +317,12 @@ namespace libtorrent
|
||||||
}
|
}
|
||||||
start(flags, std::move(pack), nullptr);
|
start(flags, std::move(pack), nullptr);
|
||||||
}
|
}
|
||||||
|
#ifdef __GNUC__
|
||||||
|
#pragma GCC diagnostic pop
|
||||||
|
#endif
|
||||||
|
#ifdef __clang__
|
||||||
|
#pragma clang diagnostic pop
|
||||||
|
#endif
|
||||||
#endif // TORRENT_NO_DEPRECATE
|
#endif // TORRENT_NO_DEPRECATE
|
||||||
|
|
||||||
// The destructor of session will notify all trackers that our torrents
|
// The destructor of session will notify all trackers that our torrents
|
||||||
|
|
|
@ -207,7 +207,10 @@ namespace libtorrent
|
||||||
|
|
||||||
// this is the fingerprint for the client. It will be used as the
|
// this is the fingerprint for the client. It will be used as the
|
||||||
// prefix to the peer_id. If this is 20 bytes (or longer) it will be
|
// prefix to the peer_id. If this is 20 bytes (or longer) it will be
|
||||||
// used as the peer-id
|
// truncated at 20 bytes and used as the entire peer-id
|
||||||
|
//
|
||||||
|
// There is a utility function, generate_fingerprint() that can be used
|
||||||
|
// to generate a standard client peer ID fingerprint prefix.
|
||||||
peer_fingerprint,
|
peer_fingerprint,
|
||||||
|
|
||||||
// This is a comma-separated list of IP port-pairs. They will be added
|
// This is a comma-separated list of IP port-pairs. They will be added
|
||||||
|
|
|
@ -75,6 +75,7 @@ libtorrent_rasterbar_la_SOURCES = \
|
||||||
file.cpp \
|
file.cpp \
|
||||||
file_pool.cpp \
|
file_pool.cpp \
|
||||||
file_storage.cpp \
|
file_storage.cpp \
|
||||||
|
fingerprint.cpp \
|
||||||
gzip.cpp \
|
gzip.cpp \
|
||||||
hasher.cpp \
|
hasher.cpp \
|
||||||
hex.cpp \
|
hex.cpp \
|
||||||
|
|
|
@ -3381,8 +3381,7 @@ namespace libtorrent
|
||||||
}
|
}
|
||||||
|
|
||||||
m_client_version = identify_client(pid);
|
m_client_version = identify_client(pid);
|
||||||
boost::optional<fingerprint> f = client_fingerprint(pid);
|
if (pid[0] == '-' && pid[1] == 'B' && pid[2] == 'C' && pid[7] == '-')
|
||||||
if (f && std::equal(f->name, f->name + 2, "BC"))
|
|
||||||
{
|
{
|
||||||
// if this is a bitcomet client, lower the request queue size limit
|
// if this is a bitcomet client, lower the request queue size limit
|
||||||
if (max_out_request_queue() > 50) max_out_request_queue(50);
|
if (max_out_request_queue() > 50) max_out_request_queue(50);
|
||||||
|
|
|
@ -335,6 +335,8 @@ namespace libtorrent
|
||||||
end = int(p->blocks_in_piece);
|
end = int(p->blocks_in_piece);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
TORRENT_ASSERT(end <= p->blocks_in_piece);
|
||||||
|
|
||||||
// count number of blocks that would be flushed
|
// count number of blocks that would be flushed
|
||||||
int num_blocks = 0;
|
int num_blocks = 0;
|
||||||
for (int i = end-1; i >= 0; --i)
|
for (int i = end-1; i >= 0; --i)
|
||||||
|
@ -2083,6 +2085,12 @@ namespace libtorrent
|
||||||
DLOG("kick_hasher: %d - %d (piece: %d offset: %d)\n"
|
DLOG("kick_hasher: %d - %d (piece: %d offset: %d)\n"
|
||||||
, cursor, end, int(pe->piece), ph->offset);
|
, cursor, end, int(pe->piece), ph->offset);
|
||||||
|
|
||||||
|
// save a local copy of offset to avoid concurrent access
|
||||||
|
int offset = ph->offset;
|
||||||
|
#if TORRENT_USE_ASSERTS
|
||||||
|
int old_offset = offset;
|
||||||
|
#endif
|
||||||
|
|
||||||
l.unlock();
|
l.unlock();
|
||||||
|
|
||||||
time_point start_time = clock_type::now();
|
time_point start_time = clock_type::now();
|
||||||
|
@ -2090,15 +2098,18 @@ namespace libtorrent
|
||||||
for (int i = cursor; i < end; ++i)
|
for (int i = cursor; i < end; ++i)
|
||||||
{
|
{
|
||||||
cached_block_entry& bl = pe->blocks[i];
|
cached_block_entry& bl = pe->blocks[i];
|
||||||
int const size = (std::min)(block_size, piece_size - ph->offset);
|
int const size = (std::min)(block_size, piece_size - offset);
|
||||||
ph->h.update(bl.buf, size);
|
ph->h.update(bl.buf, size);
|
||||||
ph->offset += size;
|
offset += size;
|
||||||
}
|
}
|
||||||
|
|
||||||
std::uint64_t hash_time = total_microseconds(clock_type::now() - start_time);
|
std::uint64_t hash_time = total_microseconds(clock_type::now() - start_time);
|
||||||
|
|
||||||
l.lock();
|
l.lock();
|
||||||
|
|
||||||
|
TORRENT_ASSERT(old_offset == ph->offset);
|
||||||
|
ph->offset = offset;
|
||||||
|
|
||||||
TORRENT_PIECE_ASSERT(pe->hashing, pe);
|
TORRENT_PIECE_ASSERT(pe->hashing, pe);
|
||||||
TORRENT_PIECE_ASSERT(pe->hash, pe);
|
TORRENT_PIECE_ASSERT(pe->hash, pe);
|
||||||
|
|
||||||
|
@ -2318,22 +2329,28 @@ namespace libtorrent
|
||||||
// to keep the cache footprint low, try to evict a volatile piece
|
// to keep the cache footprint low, try to evict a volatile piece
|
||||||
m_disk_cache.try_evict_one_volatile();
|
m_disk_cache.try_evict_one_volatile();
|
||||||
|
|
||||||
|
// save a local copy of offset to avoid concurrent access
|
||||||
|
int offset = ph->offset;
|
||||||
|
#if TORRENT_USE_ASSERTS
|
||||||
|
int old_offset = offset;
|
||||||
|
#endif
|
||||||
|
|
||||||
l.unlock();
|
l.unlock();
|
||||||
|
|
||||||
int ret = 0;
|
int ret = 0;
|
||||||
int next_locked_block = 0;
|
int next_locked_block = 0;
|
||||||
for (int i = ph->offset / block_size; i < blocks_in_piece; ++i)
|
for (int i = offset / block_size; i < blocks_in_piece; ++i)
|
||||||
{
|
{
|
||||||
file::iovec_t iov;
|
file::iovec_t iov;
|
||||||
iov.iov_len = (std::min)(block_size, piece_size - ph->offset);
|
iov.iov_len = (std::min)(block_size, piece_size - offset);
|
||||||
|
|
||||||
if (next_locked_block < num_locked_blocks
|
if (next_locked_block < num_locked_blocks
|
||||||
&& locked_blocks[next_locked_block] == i)
|
&& locked_blocks[next_locked_block] == i)
|
||||||
{
|
{
|
||||||
++next_locked_block;
|
++next_locked_block;
|
||||||
TORRENT_PIECE_ASSERT(pe->blocks[i].buf, pe);
|
TORRENT_PIECE_ASSERT(pe->blocks[i].buf, pe);
|
||||||
TORRENT_PIECE_ASSERT(ph->offset == i * block_size, pe);
|
TORRENT_PIECE_ASSERT(offset == i * block_size, pe);
|
||||||
ph->offset += int(iov.iov_len);
|
offset += int(iov.iov_len);
|
||||||
ph->h.update({pe->blocks[i].buf, iov.iov_len});
|
ph->h.update({pe->blocks[i].buf, iov.iov_len});
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
@ -2363,9 +2380,9 @@ namespace libtorrent
|
||||||
|
|
||||||
time_point start_time = clock_type::now();
|
time_point start_time = clock_type::now();
|
||||||
|
|
||||||
TORRENT_PIECE_ASSERT(ph->offset == i * block_size, pe);
|
TORRENT_PIECE_ASSERT(offset == i * block_size, pe);
|
||||||
ret = j->storage->get_storage_impl()->readv(iov, j->piece
|
ret = j->storage->get_storage_impl()->readv(iov, j->piece
|
||||||
, ph->offset, file_flags, j->error);
|
, offset, file_flags, j->error);
|
||||||
|
|
||||||
if (ret < 0)
|
if (ret < 0)
|
||||||
{
|
{
|
||||||
|
@ -2398,8 +2415,8 @@ namespace libtorrent
|
||||||
m_stats_counters.inc_stats_counter(counters::disk_job_time, read_time);
|
m_stats_counters.inc_stats_counter(counters::disk_job_time, read_time);
|
||||||
}
|
}
|
||||||
|
|
||||||
TORRENT_PIECE_ASSERT(ph->offset == i * block_size, pe);
|
TORRENT_PIECE_ASSERT(offset == i * block_size, pe);
|
||||||
ph->offset += int(iov.iov_len);
|
offset += int(iov.iov_len);
|
||||||
ph->h.update({static_cast<char const*>(iov.iov_base), iov.iov_len});
|
ph->h.update({static_cast<char const*>(iov.iov_base), iov.iov_len});
|
||||||
|
|
||||||
l.lock();
|
l.lock();
|
||||||
|
@ -2410,6 +2427,9 @@ namespace libtorrent
|
||||||
|
|
||||||
l.lock();
|
l.lock();
|
||||||
|
|
||||||
|
TORRENT_ASSERT(old_offset == ph->offset);
|
||||||
|
ph->offset = offset;
|
||||||
|
|
||||||
// decrement the refcounts of the blocks we just hashed
|
// decrement the refcounts of the blocks we just hashed
|
||||||
for (int i = 0; i < num_locked_blocks; ++i)
|
for (int i = 0; i < num_locked_blocks; ++i)
|
||||||
m_disk_cache.dec_block_refcount(pe, locked_blocks[i], block_cache::ref_hashing);
|
m_disk_cache.dec_block_refcount(pe, locked_blocks[i], block_cache::ref_hashing);
|
||||||
|
|
|
@ -0,0 +1,100 @@
|
||||||
|
/*
|
||||||
|
|
||||||
|
Copyright (c) 2016, Arvid Norberg
|
||||||
|
All rights reserved.
|
||||||
|
|
||||||
|
Redistribution and use in source and binary forms, with or without
|
||||||
|
modification, are permitted provided that the following conditions
|
||||||
|
are met:
|
||||||
|
|
||||||
|
* Redistributions of source code must retain the above copyright
|
||||||
|
notice, this list of conditions and the following disclaimer.
|
||||||
|
* Redistributions in binary form must reproduce the above copyright
|
||||||
|
notice, this list of conditions and the following disclaimer in
|
||||||
|
the documentation and/or other materials provided with the distribution.
|
||||||
|
* Neither the name of the author nor the names of its
|
||||||
|
contributors may be used to endorse or promote products derived
|
||||||
|
from this software without specific prior written permission.
|
||||||
|
|
||||||
|
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||||
|
AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||||
|
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||||
|
ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
|
||||||
|
LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||||
|
CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||||
|
SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||||
|
INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||||
|
CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||||
|
ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||||
|
POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "libtorrent/fingerprint.hpp"
|
||||||
|
#include "libtorrent/assert.hpp"
|
||||||
|
|
||||||
|
namespace libtorrent {
|
||||||
|
namespace {
|
||||||
|
|
||||||
|
char version_to_char(int const v)
|
||||||
|
{
|
||||||
|
if (v >= 0 && v < 10) return char('0' + v);
|
||||||
|
else if (v >= 10) return char('A' + (v - 10));
|
||||||
|
TORRENT_ASSERT_FAIL();
|
||||||
|
return '0';
|
||||||
|
}
|
||||||
|
|
||||||
|
} // anonymous namespace
|
||||||
|
|
||||||
|
std::string generate_fingerprint(std::string name, int const major
|
||||||
|
, int const minor
|
||||||
|
, int const revision
|
||||||
|
, int const tag)
|
||||||
|
{
|
||||||
|
TORRENT_ASSERT_PRECOND(major >= 0);
|
||||||
|
TORRENT_ASSERT_PRECOND(minor >= 0);
|
||||||
|
TORRENT_ASSERT_PRECOND(revision >= 0);
|
||||||
|
TORRENT_ASSERT_PRECOND(tag >= 0);
|
||||||
|
TORRENT_ASSERT_PRECOND(name.size() == 2);
|
||||||
|
if (name.size() < 2) name = "--";
|
||||||
|
|
||||||
|
std::string ret;
|
||||||
|
ret.resize(8);
|
||||||
|
ret[0] = '-';
|
||||||
|
ret[1] = name[0];
|
||||||
|
ret[2] = name[1];
|
||||||
|
ret[3] = version_to_char(major);
|
||||||
|
ret[4] = version_to_char(minor);
|
||||||
|
ret[5] = version_to_char(revision);
|
||||||
|
ret[6] = version_to_char(tag);
|
||||||
|
ret[7] = '-';
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
fingerprint::fingerprint(const char* id_string, int major, int minor
|
||||||
|
, int revision, int tag)
|
||||||
|
: major_version(major)
|
||||||
|
, minor_version(minor)
|
||||||
|
, revision_version(revision)
|
||||||
|
, tag_version(tag)
|
||||||
|
{
|
||||||
|
TORRENT_ASSERT(id_string);
|
||||||
|
TORRENT_ASSERT(major >= 0);
|
||||||
|
TORRENT_ASSERT(minor >= 0);
|
||||||
|
TORRENT_ASSERT(revision >= 0);
|
||||||
|
TORRENT_ASSERT(tag >= 0);
|
||||||
|
TORRENT_ASSERT(std::strlen(id_string) == 2);
|
||||||
|
name[0] = id_string[0];
|
||||||
|
name[1] = id_string[1];
|
||||||
|
}
|
||||||
|
|
||||||
|
#ifndef TORRENT_NO_DEPRECATE
|
||||||
|
std::string fingerprint::to_string() const
|
||||||
|
{
|
||||||
|
return generate_fingerprint(name, major_version, minor_version
|
||||||
|
, revision_version, tag_version);
|
||||||
|
}
|
||||||
|
#endif // TORRENT_NO_DEPRECATE
|
||||||
|
|
||||||
|
}
|
||||||
|
|
|
@ -35,9 +35,7 @@ POSSIBILITY OF SUCH DAMAGE.
|
||||||
#include <cstdio>
|
#include <cstdio>
|
||||||
|
|
||||||
#include "libtorrent/aux_/disable_warnings_push.hpp"
|
#include "libtorrent/aux_/disable_warnings_push.hpp"
|
||||||
|
|
||||||
#include <boost/optional.hpp>
|
#include <boost/optional.hpp>
|
||||||
|
|
||||||
#include "libtorrent/aux_/disable_warnings_pop.hpp"
|
#include "libtorrent/aux_/disable_warnings_pop.hpp"
|
||||||
|
|
||||||
#include "libtorrent/identify_client.hpp"
|
#include "libtorrent/identify_client.hpp"
|
||||||
|
@ -141,7 +139,9 @@ namespace
|
||||||
// must be ordered alphabetically
|
// must be ordered alphabetically
|
||||||
map_entry name_map[] =
|
map_entry name_map[] =
|
||||||
{
|
{
|
||||||
{"A", "ABC"}
|
{"7T", "aTorrent for android"}
|
||||||
|
, {"A", "ABC"}
|
||||||
|
, {"AB", "AnyEvent BitTorrent"}
|
||||||
, {"AG", "Ares"}
|
, {"AG", "Ares"}
|
||||||
, {"AR", "Arctic Torrent"}
|
, {"AR", "Arctic Torrent"}
|
||||||
, {"AT", "Artemis"}
|
, {"AT", "Artemis"}
|
||||||
|
@ -343,6 +343,8 @@ namespace
|
||||||
namespace libtorrent
|
namespace libtorrent
|
||||||
{
|
{
|
||||||
|
|
||||||
|
#ifndef TORRENT_NO_DEPRECATE
|
||||||
|
|
||||||
boost::optional<fingerprint> client_fingerprint(peer_id const& p)
|
boost::optional<fingerprint> client_fingerprint(peer_id const& p)
|
||||||
{
|
{
|
||||||
// look for azureus style id
|
// look for azureus style id
|
||||||
|
@ -360,6 +362,8 @@ namespace libtorrent
|
||||||
return f;
|
return f;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
std::string identify_client(peer_id const& p)
|
std::string identify_client(peer_id const& p)
|
||||||
{
|
{
|
||||||
char const* PID = p.data();
|
char const* PID = p.data();
|
||||||
|
|
|
@ -502,9 +502,9 @@ namespace libtorrent
|
||||||
// don't do full file allocations on network drives
|
// don't do full file allocations on network drives
|
||||||
#if TORRENT_USE_WSTRING
|
#if TORRENT_USE_WSTRING
|
||||||
std::wstring file_name = convert_to_wstring(m_save_path);
|
std::wstring file_name = convert_to_wstring(m_save_path);
|
||||||
int drive_type = GetDriveTypeW(file_name.c_str());
|
int const drive_type = GetDriveTypeW(file_name.c_str());
|
||||||
#else
|
#else
|
||||||
int drive_type = GetDriveTypeA(m_save_path.c_str());
|
int const drive_type = GetDriveTypeA(m_save_path.c_str());
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
if (drive_type == DRIVE_REMOTE)
|
if (drive_type == DRIVE_REMOTE)
|
||||||
|
@ -1246,7 +1246,8 @@ namespace libtorrent
|
||||||
if (m_file_created[file] == false)
|
if (m_file_created[file] == false)
|
||||||
{
|
{
|
||||||
error_code e;
|
error_code e;
|
||||||
h->set_size(files().file_size(file), e);
|
boost::int64_t const size = files().file_size(file);
|
||||||
|
h->set_size(size, e);
|
||||||
m_file_created.set_bit(file);
|
m_file_created.set_bit(file);
|
||||||
if (e)
|
if (e)
|
||||||
{
|
{
|
||||||
|
@ -1255,6 +1256,7 @@ namespace libtorrent
|
||||||
ec.operation = storage_error::fallocate;
|
ec.operation = storage_error::fallocate;
|
||||||
return h;
|
return h;
|
||||||
}
|
}
|
||||||
|
m_stat_cache.set_dirty(file);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return h;
|
return h;
|
||||||
|
|
|
@ -35,6 +35,7 @@ POSSIBILITY OF SUCH DAMAGE.
|
||||||
#include "libtorrent/socket_io.hpp" // for print_endpoint
|
#include "libtorrent/socket_io.hpp" // for print_endpoint
|
||||||
#include "libtorrent/announce_entry.hpp"
|
#include "libtorrent/announce_entry.hpp"
|
||||||
#include "libtorrent/hex.hpp" // from_hex
|
#include "libtorrent/hex.hpp" // from_hex
|
||||||
|
#include "libtorrent/fingerprint.hpp"
|
||||||
|
|
||||||
#include "test.hpp"
|
#include "test.hpp"
|
||||||
#include "setup_transfer.hpp"
|
#include "setup_transfer.hpp"
|
||||||
|
@ -141,6 +142,13 @@ TORRENT_TEST(primitives)
|
||||||
// test endpoint_to_bytes
|
// test endpoint_to_bytes
|
||||||
TEST_EQUAL(endpoint_to_bytes(udp::endpoint(address_v4::from_string("10.11.12.13"), 8080)), "\x0a\x0b\x0c\x0d\x1f\x90");
|
TEST_EQUAL(endpoint_to_bytes(udp::endpoint(address_v4::from_string("10.11.12.13"), 8080)), "\x0a\x0b\x0c\x0d\x1f\x90");
|
||||||
TEST_EQUAL(endpoint_to_bytes(udp::endpoint(address_v4::from_string("16.5.127.1"), 12345)), "\x10\x05\x7f\x01\x30\x39");
|
TEST_EQUAL(endpoint_to_bytes(udp::endpoint(address_v4::from_string("16.5.127.1"), 12345)), "\x10\x05\x7f\x01\x30\x39");
|
||||||
|
|
||||||
|
// test gen_fingerprint
|
||||||
|
TEST_EQUAL(generate_fingerprint("AB", 1, 2, 3, 4), "-AB1234-");
|
||||||
|
TEST_EQUAL(generate_fingerprint("AB", 1, 2), "-AB1200-");
|
||||||
|
TEST_EQUAL(generate_fingerprint("..", 1, 10), "-..1A00-");
|
||||||
|
TEST_EQUAL(generate_fingerprint("CZ", 1, 15), "-CZ1F00-");
|
||||||
|
TEST_EQUAL(generate_fingerprint("CZ", 1, 15, 16, 17), "-CZ1FGH-");
|
||||||
}
|
}
|
||||||
|
|
||||||
TORRENT_TEST(printf_int64)
|
TORRENT_TEST(printf_int64)
|
||||||
|
|
|
@ -214,7 +214,9 @@ void test_piece_priorities(bool test_deprecated = false)
|
||||||
alert const* a = wait_for_alert(ses, save_resume_data_alert::alert_type);
|
alert const* a = wait_for_alert(ses, save_resume_data_alert::alert_type);
|
||||||
|
|
||||||
TEST_CHECK(a);
|
TEST_CHECK(a);
|
||||||
if (save_resume_data_alert const* ra = alert_cast<save_resume_data_alert>(a))
|
save_resume_data_alert const* ra = alert_cast<save_resume_data_alert>(a);
|
||||||
|
TEST_CHECK(ra);
|
||||||
|
if (ra)
|
||||||
{
|
{
|
||||||
std::printf("%s\n", ra->resume_data->to_string().c_str());
|
std::printf("%s\n", ra->resume_data->to_string().c_str());
|
||||||
entry::string_type prios = (*ra->resume_data)["piece_priority"].string();
|
entry::string_type prios = (*ra->resume_data)["piece_priority"].string();
|
||||||
|
|
Loading…
Reference in New Issue