summaryrefslogtreecommitdiff
path: root/trackerlogic.c
diff options
context:
space:
mode:
Diffstat (limited to 'trackerlogic.c')
-rw-r--r--trackerlogic.c47
1 files changed, 15 insertions, 32 deletions
diff --git a/trackerlogic.c b/trackerlogic.c
index 38be9f7..5eff5c0 100644
--- a/trackerlogic.c
+++ b/trackerlogic.c
@@ -41,12 +41,7 @@ void free_peerlist( ot_peerlist *peer_list ) {
41 free( peer_list ); 41 free( peer_list );
42} 42}
43 43
44#ifdef _DEBUG_PEERID 44size_t add_peer_to_torrent_and_return_peers( ot_hash hash, ot_peer *peer, PROTO_FLAG proto, size_t amount, char * reply ) {
45extern size_t g_this_peerid_len;
46extern char *g_this_peerid_data;
47#endif
48
49size_t add_peer_to_torrent_and_return_peers( ot_hash *hash, ot_peer *peer, PROTO_FLAG proto, size_t amount, char * reply ) {
50 int exactmatch, delta_torrentcount = 0; 45 int exactmatch, delta_torrentcount = 0;
51 size_t reply_size; 46 size_t reply_size;
52 ot_torrent *torrent; 47 ot_torrent *torrent;
@@ -66,7 +61,7 @@ size_t add_peer_to_torrent_and_return_peers( ot_hash *hash, ot_peer *peer, PROTO
66 61
67 if( !exactmatch ) { 62 if( !exactmatch ) {
68 /* Create a new torrent entry, then */ 63 /* Create a new torrent entry, then */
69 int i; for(i=0;i<20;i+=4) WRITE32(&torrent->hash,i,READ32(hash,i)); 64 memcpy( torrent->hash, hash, sizeof(ot_hash) );
70 65
71 if( !( torrent->peer_list = malloc( sizeof (ot_peerlist) ) ) ) { 66 if( !( torrent->peer_list = malloc( sizeof (ot_peerlist) ) ) ) {
72 vector_remove_torrent( torrents_list, torrent ); 67 vector_remove_torrent( torrents_list, torrent );
@@ -114,16 +109,6 @@ size_t add_peer_to_torrent_and_return_peers( ot_hash *hash, ot_peer *peer, PROTO
114 } else { 109 } else {
115 stats_issue_event( EVENT_RENEW, 0, OT_PEERTIME( peer_dest ) ); 110 stats_issue_event( EVENT_RENEW, 0, OT_PEERTIME( peer_dest ) );
116 111
117#ifdef _DEBUG_PEERID
118 if( OT_PEERTIME( peer_dest ) < 2 ) {
119 uint8_t *_ip = (uint8_t*)peer_dest;
120 int i;
121 for( i=0;i<20;++i)printf("%02X",(*hash)[i]);
122 if( g_this_peerid_data ) g_this_peerid_data[g_this_peerid_len] = 0;
123 printf( " %d.%d.%d.%d:%d\t%d %02X %s\n", _ip[0], _ip[1], _ip[2], _ip[3], OT_PEERTIME( peer_dest ), *(uint16_t*)( ((char*)peer_dest)+4 ), OT_PEERFLAG(peer_dest), g_this_peerid_data ? g_this_peerid_data : "-" );
124 }
125#endif
126
127#ifdef WANT_SYNC_LIVE 112#ifdef WANT_SYNC_LIVE
128 /* Won't live sync peers that come back too fast. Only exception: 113 /* Won't live sync peers that come back too fast. Only exception:
129 fresh "completed" reports */ 114 fresh "completed" reports */
@@ -144,7 +129,7 @@ size_t add_peer_to_torrent_and_return_peers( ot_hash *hash, ot_peer *peer, PROTO
144 OT_PEERFLAG( peer ) |= PEER_FLAG_COMPLETED; 129 OT_PEERFLAG( peer ) |= PEER_FLAG_COMPLETED;
145 } 130 }
146 131
147 *(uint64_t*)(peer_dest) = *(uint64_t*)(peer); 132 *peer_dest = *peer;
148#ifdef WANT_SYNC 133#ifdef WANT_SYNC
149 if( proto == FLAG_MCA ) { 134 if( proto == FLAG_MCA ) {
150 mutex_bucket_unlock_by_hash( hash, delta_torrentcount ); 135 mutex_bucket_unlock_by_hash( hash, delta_torrentcount );
@@ -153,7 +138,7 @@ size_t add_peer_to_torrent_and_return_peers( ot_hash *hash, ot_peer *peer, PROTO
153#endif 138#endif
154 139
155 reply_size = return_peers_for_torrent( torrent, amount, reply, proto ); 140 reply_size = return_peers_for_torrent( torrent, amount, reply, proto );
156 mutex_bucket_unlock_by_hash( &torrent->hash, delta_torrentcount ); 141 mutex_bucket_unlock_by_hash( torrent->hash, delta_torrentcount );
157 return reply_size; 142 return reply_size;
158} 143}
159 144
@@ -171,9 +156,9 @@ static size_t return_peers_all( ot_peerlist *peer_list, char *reply ) {
171 ot_peer * peers = (ot_peer*)bucket_list[bucket].data; 156 ot_peer * peers = (ot_peer*)bucket_list[bucket].data;
172 size_t peer_count = bucket_list[bucket].size; 157 size_t peer_count = bucket_list[bucket].size;
173 while( peer_count-- ) { 158 while( peer_count-- ) {
174 WRITE32(r,0,READ32(peers,0)); 159 memcpy(r,peers,OT_PEER_COMPARE_SIZE);
175 WRITE16(r,4,READ16(peers++,4)); 160 peers+=sizeof(ot_peer);
176 r+=6; 161 r+=OT_PEER_COMPARE_SIZE;
177 } 162 }
178 } 163 }
179 164
@@ -216,9 +201,8 @@ static size_t return_peers_selection( ot_peerlist *peer_list, size_t amount, cha
216 bucket_index = ( bucket_index + 1 ) % num_buckets; 201 bucket_index = ( bucket_index + 1 ) % num_buckets;
217 } 202 }
218 peer = ((ot_peer*)bucket_list[bucket_index].data) + bucket_offset; 203 peer = ((ot_peer*)bucket_list[bucket_index].data) + bucket_offset;
219 WRITE32(r,0,READ32(peer,0)); 204 memcpy(r,peer,OT_PEER_COMPARE_SIZE);
220 WRITE16(r,4,READ16(peer,4)); 205 r+=OT_PEER_COMPARE_SIZE;
221 r+=6;
222 } 206 }
223 return r - reply; 207 return r - reply;
224} 208}
@@ -236,7 +220,7 @@ size_t return_peers_for_torrent( ot_torrent *torrent, size_t amount, char *reply
236 220
237 if( proto == FLAG_TCP ) { 221 if( proto == FLAG_TCP ) {
238 int erval = OT_CLIENT_REQUEST_INTERVAL_RANDOM; 222 int erval = OT_CLIENT_REQUEST_INTERVAL_RANDOM;
239 r += sprintf( r, "d8:completei%zde10:downloadedi%zde10:incompletei%zde8:intervali%ie12:min intervali%ie5:peers%zd:", peer_list->seed_count, peer_list->down_count, peer_list->peer_count-peer_list->seed_count, erval, erval/2, 6*amount ); 223 r += sprintf( r, "d8:completei%zde10:downloadedi%zde10:incompletei%zde8:intervali%ie12:min intervali%ie5:peers" PEERS6 "%zd:", peer_list->seed_count, peer_list->down_count, peer_list->peer_count-peer_list->seed_count, erval, erval/2, OT_PEER_COMPARE_SIZE*amount );
240 } else { 224 } else {
241 *(uint32_t*)(r+0) = htonl( OT_CLIENT_REQUEST_INTERVAL_RANDOM ); 225 *(uint32_t*)(r+0) = htonl( OT_CLIENT_REQUEST_INTERVAL_RANDOM );
242 *(uint32_t*)(r+4) = htonl( peer_list->peer_count ); 226 *(uint32_t*)(r+4) = htonl( peer_list->peer_count );
@@ -258,7 +242,7 @@ size_t return_peers_for_torrent( ot_torrent *torrent, size_t amount, char *reply
258} 242}
259 243
260/* Fetches scrape info for a specific torrent */ 244/* Fetches scrape info for a specific torrent */
261size_t return_udp_scrape_for_torrent( ot_hash *hash, char *reply ) { 245size_t return_udp_scrape_for_torrent( ot_hash hash, char *reply ) {
262 int exactmatch, delta_torrentcount = 0; 246 int exactmatch, delta_torrentcount = 0;
263 ot_vector *torrents_list = mutex_bucket_lock_by_hash( hash ); 247 ot_vector *torrents_list = mutex_bucket_lock_by_hash( hash );
264 ot_torrent *torrent = binary_search( hash, torrents_list->data, torrents_list->size, sizeof( ot_torrent ), OT_HASH_COMPARE_SIZE, &exactmatch ); 248 ot_torrent *torrent = binary_search( hash, torrents_list->data, torrents_list->size, sizeof( ot_torrent ), OT_HASH_COMPARE_SIZE, &exactmatch );
@@ -292,7 +276,7 @@ size_t return_tcp_scrape_for_torrent( ot_hash *hash_list, int amount, char *repl
292 276
293 for( i=0; i<amount; ++i ) { 277 for( i=0; i<amount; ++i ) {
294 ot_hash *hash = hash_list + i; 278 ot_hash *hash = hash_list + i;
295 ot_vector *torrents_list = mutex_bucket_lock_by_hash( hash ); 279 ot_vector *torrents_list = mutex_bucket_lock_by_hash( *hash );
296 ot_torrent *torrent = binary_search( hash, torrents_list->data, torrents_list->size, sizeof( ot_torrent ), OT_HASH_COMPARE_SIZE, &exactmatch ); 280 ot_torrent *torrent = binary_search( hash, torrents_list->data, torrents_list->size, sizeof( ot_torrent ), OT_HASH_COMPARE_SIZE, &exactmatch );
297 281
298 if( exactmatch ) { 282 if( exactmatch ) {
@@ -300,14 +284,13 @@ size_t return_tcp_scrape_for_torrent( ot_hash *hash_list, int amount, char *repl
300 vector_remove_torrent( torrents_list, torrent ); 284 vector_remove_torrent( torrents_list, torrent );
301 delta_torrentcount = -1; 285 delta_torrentcount = -1;
302 } else { 286 } else {
303 int j;
304 *r++='2';*r++='0';*r++=':'; 287 *r++='2';*r++='0';*r++=':';
305 for(j=0;j<20;j+=4) WRITE32(r,j,READ32(hash,j)); r += 20; 288 memcpy( r, hash, sizeof(ot_hash) ); r+=sizeof(ot_hash);
306 r += sprintf( r, "d8:completei%zde10:downloadedi%zde10:incompletei%zdee", 289 r += sprintf( r, "d8:completei%zde10:downloadedi%zde10:incompletei%zdee",
307 torrent->peer_list->seed_count, torrent->peer_list->down_count, torrent->peer_list->peer_count-torrent->peer_list->seed_count ); 290 torrent->peer_list->seed_count, torrent->peer_list->down_count, torrent->peer_list->peer_count-torrent->peer_list->seed_count );
308 } 291 }
309 } 292 }
310 mutex_bucket_unlock_by_hash( hash, delta_torrentcount ); 293 mutex_bucket_unlock_by_hash( *hash, delta_torrentcount );
311 } 294 }
312 295
313 *r++ = 'e'; *r++ = 'e'; 296 *r++ = 'e'; *r++ = 'e';
@@ -315,7 +298,7 @@ size_t return_tcp_scrape_for_torrent( ot_hash *hash_list, int amount, char *repl
315} 298}
316 299
317static ot_peerlist dummy_list; 300static ot_peerlist dummy_list;
318size_t remove_peer_from_torrent( ot_hash *hash, ot_peer *peer, char *reply, PROTO_FLAG proto ) { 301size_t remove_peer_from_torrent( ot_hash hash, ot_peer *peer, char *reply, PROTO_FLAG proto ) {
319 int exactmatch; 302 int exactmatch;
320 size_t reply_size = 0; 303 size_t reply_size = 0;
321 ot_vector *torrents_list = mutex_bucket_lock_by_hash( hash ); 304 ot_vector *torrents_list = mutex_bucket_lock_by_hash( hash );