|
|
|
@ -54,7 +54,7 @@ ot_byte *scratch_space = 0;
@@ -54,7 +54,7 @@ ot_byte *scratch_space = 0;
|
|
|
|
|
#define TESTSET( i ) (scratch_space[index]) |
|
|
|
|
#define RANDOM random() |
|
|
|
|
|
|
|
|
|
ot_torrent add_peer_to_torrent( ot_hash hash, ot_peer peer ) { |
|
|
|
|
ot_torrent add_peer_to_torrent( ot_hash *hash, ot_peer peer ) { |
|
|
|
|
ot_torrent torrent; |
|
|
|
|
ot_peer peer_dest; |
|
|
|
|
int exactmatch; |
|
|
|
@ -66,7 +66,7 @@ ot_torrent add_peer_to_torrent( ot_hash hash, ot_peer peer ) {
@@ -66,7 +66,7 @@ ot_torrent add_peer_to_torrent( ot_hash hash, ot_peer peer ) {
|
|
|
|
|
|
|
|
|
|
// Create a new torrent entry, then
|
|
|
|
|
MEMMOVE( &torrent->hash, hash, sizeof( ot_hash ) ); |
|
|
|
|
torrent->peer_list = map_file( to_hex( hash ) ); |
|
|
|
|
torrent->peer_list = map_file( to_hex( *hash ) ); |
|
|
|
|
torrent->peer_count = 0; |
|
|
|
|
torrent->seed_count = 0; |
|
|
|
|
} |
|
|
|
@ -106,8 +106,9 @@ inline int TESTVALIDPEER( ot_peer p ) { return p->death > NOW; }
@@ -106,8 +106,9 @@ inline int TESTVALIDPEER( ot_peer p ) { return p->death > NOW; }
|
|
|
|
|
// * it is not guaranteed to see all peers, so no assumptions on active seeders/peers may be done
|
|
|
|
|
// * since compact format cannot handle v6 addresses, it must be enabled by OT_COMPACT_ONLY
|
|
|
|
|
//
|
|
|
|
|
void return_peers_for_torrent( ot_torrent torrent, unsigned long amount, char *reply ) { |
|
|
|
|
size_t return_peers_for_torrent( ot_torrent torrent, unsigned long amount, char *reply ) { |
|
|
|
|
register ot_peer peer_base = torrent->peer_list; |
|
|
|
|
char *r = reply; |
|
|
|
|
unsigned long peer_count = torrent->peer_count; |
|
|
|
|
unsigned long selected_count = 0, invalid_count = 0; |
|
|
|
|
unsigned long index = 0; |
|
|
|
@ -132,9 +133,9 @@ void return_peers_for_torrent( ot_torrent torrent, unsigned long amount, char *r
@@ -132,9 +133,9 @@ void return_peers_for_torrent( ot_torrent torrent, unsigned long amount, char *r
|
|
|
|
|
index = 0; |
|
|
|
|
|
|
|
|
|
#ifndef OT_COMPACT_ONLY |
|
|
|
|
reply += FORMAT_FIXED_STRING( reply, "d5:peersl" ); |
|
|
|
|
r += FORMAT_FIXED_STRING( r, "d5:peersl" ); |
|
|
|
|
#else |
|
|
|
|
reply += FORMAT_FORMAT_STRING( reply, "d5:peers%li:",6*selected_count ); |
|
|
|
|
r += FORMAT_FORMAT_STRING( r, "d5:peers%li:",6*selected_count ); |
|
|
|
|
#endif |
|
|
|
|
|
|
|
|
|
while( selected_count-- ) { |
|
|
|
@ -142,11 +143,11 @@ void return_peers_for_torrent( ot_torrent torrent, unsigned long amount, char *r
@@ -142,11 +143,11 @@ void return_peers_for_torrent( ot_torrent torrent, unsigned long amount, char *r
|
|
|
|
|
while( !TESTSELECTED( index ) ) ++index; |
|
|
|
|
peer = peer_base + index; |
|
|
|
|
#ifdef OT_COMPACT_ONLY |
|
|
|
|
MEMMOVE( reply, &peer->ip, 4 ); |
|
|
|
|
MEMMOVE( reply+4, &peer->port, 2 ); |
|
|
|
|
reply += 6; |
|
|
|
|
MEMMOVE( r, &peer->ip, 4 ); |
|
|
|
|
MEMMOVE( r+4, &peer->port, 2 ); |
|
|
|
|
r += 6; |
|
|
|
|
#else |
|
|
|
|
reply += FORMAT_FORMAT_STRING( reply, "d2:ip%d:%s7:peer id20:%20c4:porti%ie", |
|
|
|
|
r += FORMAT_FORMAT_STRING( r, "d2:ip%d:%s7:peer id20:%20c4:porti%ie", |
|
|
|
|
peer->flags & PEER_IP_LENGTH_MASK, |
|
|
|
|
peer->ip, |
|
|
|
|
peer->id, |
|
|
|
@ -154,10 +155,11 @@ void return_peers_for_torrent( ot_torrent torrent, unsigned long amount, char *r
@@ -154,10 +155,11 @@ void return_peers_for_torrent( ot_torrent torrent, unsigned long amount, char *r
|
|
|
|
|
#endif |
|
|
|
|
} |
|
|
|
|
#ifndef OT_COMPACT_ONLY |
|
|
|
|
reply += FORMAT_FIXED_STRING( reply, "ee" ); |
|
|
|
|
r += FORMAT_FIXED_STRING( r, "ee" ); |
|
|
|
|
#else |
|
|
|
|
reply += FORMAT_FIXED_STRING( reply, "e" ); |
|
|
|
|
r += FORMAT_FIXED_STRING( r, "e" ); |
|
|
|
|
#endif |
|
|
|
|
return r - reply; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
// Compacts a torrents peer list
|
|
|
|
|