diff options
| author | erdgeist <> | 2008-12-06 18:46:00 +0000 |
|---|---|---|
| committer | erdgeist <> | 2008-12-06 18:46:00 +0000 |
| commit | 08c71627839a9134367db354c8255f7a720e1ff3 (patch) | |
| tree | b429abf6b3c26c7f851b522f5d4fb6797ad02d29 | |
| parent | a4ed31d517f77a21afe12918a9cb256489daac74 (diff) | |
Renamed OT_FLAG to OT_PEERFLAG to make code easier to read
Introduced READ16/32 and WRITE16/32 makros to abstract loading/storing from unaligned addresses away on cpu's that can actually load/store everywhere
Removed all unnecessary memmoves, especially where it only moved 6 bytes in inner loop. I replaced them with WRITE16/32(READ16/32()) makros
| -rw-r--r-- | opentracker.c | 2 | ||||
| -rw-r--r-- | ot_accesslist.c | 2 | ||||
| -rw-r--r-- | ot_clean.c | 2 | ||||
| -rw-r--r-- | ot_fullscrape.c | 6 | ||||
| -rw-r--r-- | ot_http.c | 12 | ||||
| -rw-r--r-- | ot_livesync.c | 11 | ||||
| -rw-r--r-- | ot_udp.c | 12 | ||||
| -rw-r--r-- | ot_vector.c | 5 | ||||
| -rw-r--r-- | trackerlogic.c | 52 | ||||
| -rw-r--r-- | trackerlogic.h | 17 |
10 files changed, 67 insertions, 54 deletions
diff --git a/opentracker.c b/opentracker.c index f8587c9..d506085 100644 --- a/opentracker.c +++ b/opentracker.c | |||
| @@ -165,7 +165,7 @@ static void handle_accept( const int64 serversocket ) { | |||
| 165 | io_wantread( i ); | 165 | io_wantread( i ); |
| 166 | 166 | ||
| 167 | memset( h, 0, sizeof( struct http_data ) ); | 167 | memset( h, 0, sizeof( struct http_data ) ); |
| 168 | memmove( h->ip, ip, sizeof( ip ) ); | 168 | WRITE32(h->ip,0,READ32(ip,0)); |
| 169 | 169 | ||
| 170 | stats_issue_event( EVENT_ACCEPT, FLAG_TCP, ntohl(*(uint32_t*)ip)); | 170 | stats_issue_event( EVENT_ACCEPT, FLAG_TCP, ntohl(*(uint32_t*)ip)); |
| 171 | 171 | ||
diff --git a/ot_accesslist.c b/ot_accesslist.c index d306aeb..f4c21c5 100644 --- a/ot_accesslist.c +++ b/ot_accesslist.c | |||
| @@ -105,7 +105,7 @@ static unsigned int g_adminip_count = 0; | |||
| 105 | int accesslist_blessip( char *ip, ot_permissions permissions ) { | 105 | int accesslist_blessip( char *ip, ot_permissions permissions ) { |
| 106 | if( g_adminip_count >= OT_ADMINIP_MAX ) | 106 | if( g_adminip_count >= OT_ADMINIP_MAX ) |
| 107 | return -1; | 107 | return -1; |
| 108 | memmove( g_adminip_addresses + g_adminip_count, ip, 4 ); | 108 | WRITE32(g_adminip_addresses + g_adminip_count,0,READ32(ip,0)); |
| 109 | g_adminip_permissions[ g_adminip_count++ ] = permissions; | 109 | g_adminip_permissions[ g_adminip_count++ ] = permissions; |
| 110 | #ifdef _DEBUG | 110 | #ifdef _DEBUG |
| 111 | uint8_t *_ip = (uint8_t*)ip; | 111 | uint8_t *_ip = (uint8_t*)ip; |
| @@ -35,7 +35,7 @@ static ssize_t clean_single_bucket( ot_peer *peers, size_t peer_count, time_t ti | |||
| 35 | OT_PEERTIME( peers ) = timediff; | 35 | OT_PEERTIME( peers ) = timediff; |
| 36 | *(uint64_t*)(insert_point++) = *(uint64_t*)(peers++); | 36 | *(uint64_t*)(insert_point++) = *(uint64_t*)(peers++); |
| 37 | } else | 37 | } else |
| 38 | if( OT_FLAG( peers++ ) & PEER_FLAG_SEEDING ) | 38 | if( OT_PEERFLAG( peers++ ) & PEER_FLAG_SEEDING ) |
| 39 | (*removed_seeders)++; | 39 | (*removed_seeders)++; |
| 40 | 40 | ||
| 41 | return peers - insert_point; | 41 | return peers - insert_point; |
diff --git a/ot_fullscrape.c b/ot_fullscrape.c index dfad640..5f61afd 100644 --- a/ot_fullscrape.c +++ b/ot_fullscrape.c | |||
| @@ -113,7 +113,7 @@ static int fullscrape_increase( int *iovec_entries, struct iovec **iovector, | |||
| 113 | } | 113 | } |
| 114 | 114 | ||
| 115 | static void fullscrape_make( int *iovec_entries, struct iovec **iovector, ot_tasktype mode ) { | 115 | static void fullscrape_make( int *iovec_entries, struct iovec **iovector, ot_tasktype mode ) { |
| 116 | int bucket; | 116 | int bucket,i; |
| 117 | char *r, *re; | 117 | char *r, *re; |
| 118 | #ifdef WANT_COMPRESSION_GZIP | 118 | #ifdef WANT_COMPRESSION_GZIP |
| 119 | char compress_buffer[OT_SCRAPE_MAXENTRYLEN]; | 119 | char compress_buffer[OT_SCRAPE_MAXENTRYLEN]; |
| @@ -163,7 +163,7 @@ static void fullscrape_make( int *iovec_entries, struct iovec **iovector, ot_tas | |||
| 163 | 163 | ||
| 164 | /* push hash as bencoded string */ | 164 | /* push hash as bencoded string */ |
| 165 | *r++='2'; *r++='0'; *r++=':'; | 165 | *r++='2'; *r++='0'; *r++=':'; |
| 166 | memmove( r, hash, 20 ); r+=20; | 166 | for(i=0;i<20;i+=4) WRITE32(r+=4,0,READ32(hash,i)); |
| 167 | 167 | ||
| 168 | /* push rest of the scrape string */ | 168 | /* push rest of the scrape string */ |
| 169 | r += sprintf( r, "d8:completei%zde10:downloadedi%zde10:incompletei%zdee", peer_list->seed_count, peer_list->down_count, peer_list->peer_count-peer_list->seed_count ); | 169 | r += sprintf( r, "d8:completei%zde10:downloadedi%zde10:incompletei%zdee", peer_list->seed_count, peer_list->down_count, peer_list->peer_count-peer_list->seed_count ); |
| @@ -174,7 +174,7 @@ static void fullscrape_make( int *iovec_entries, struct iovec **iovector, ot_tas | |||
| 174 | r += sprintf( r, ":%zd:%zd\n", peer_list->seed_count, peer_list->peer_count-peer_list->seed_count ); | 174 | r += sprintf( r, ":%zd:%zd\n", peer_list->seed_count, peer_list->peer_count-peer_list->seed_count ); |
| 175 | break; | 175 | break; |
| 176 | case TASK_FULLSCRAPE_TPB_BINARY: | 176 | case TASK_FULLSCRAPE_TPB_BINARY: |
| 177 | memmove( r, hash, 20 ); r+=20; | 177 | for(i=0;i<20;i+=4) WRITE32(r+=4,0,READ32(hash,i)); |
| 178 | *(uint32_t*)r++ = htonl( (uint32_t)peer_list->seed_count ); | 178 | *(uint32_t*)r++ = htonl( (uint32_t)peer_list->seed_count ); |
| 179 | *(uint32_t*)r++ = htonl( (uint32_t)( peer_list->peer_count-peer_list->seed_count) ); | 179 | *(uint32_t*)r++ = htonl( (uint32_t)( peer_list->peer_count-peer_list->seed_count) ); |
| 180 | break; | 180 | break; |
| @@ -399,7 +399,7 @@ static ssize_t http_handle_announce( const int64 client_socket, char *data ) { | |||
| 399 | 399 | ||
| 400 | OT_SETIP( &peer, ((struct http_data*)io_getcookie( client_socket ) )->ip ); | 400 | OT_SETIP( &peer, ((struct http_data*)io_getcookie( client_socket ) )->ip ); |
| 401 | OT_SETPORT( &peer, &port ); | 401 | OT_SETPORT( &peer, &port ); |
| 402 | OT_FLAG( &peer ) = 0; | 402 | OT_PEERFLAG( &peer ) = 0; |
| 403 | numwant = 50; | 403 | numwant = 50; |
| 404 | scanon = 1; | 404 | scanon = 1; |
| 405 | 405 | ||
| @@ -427,7 +427,7 @@ static ssize_t http_handle_announce( const int64 client_socket, char *data ) { | |||
| 427 | } else if( !byte_diff( data, 4, "left" ) ) { | 427 | } else if( !byte_diff( data, 4, "left" ) ) { |
| 428 | if( ( len = scan_urlencoded_query( &c, data = c, SCAN_SEARCHPATH_VALUE ) ) <= 0 ) HTTPERROR_400_PARAM; | 428 | if( ( len = scan_urlencoded_query( &c, data = c, SCAN_SEARCHPATH_VALUE ) ) <= 0 ) HTTPERROR_400_PARAM; |
| 429 | if( scan_fixed_int( data, len, &tmp ) ) tmp = 0; | 429 | if( scan_fixed_int( data, len, &tmp ) ) tmp = 0; |
| 430 | if( !tmp ) OT_FLAG( &peer ) |= PEER_FLAG_SEEDING; | 430 | if( !tmp ) OT_PEERFLAG( &peer ) |= PEER_FLAG_SEEDING; |
| 431 | } else | 431 | } else |
| 432 | scan_urlencoded_skipvalue( &c ); | 432 | scan_urlencoded_skipvalue( &c ); |
| 433 | break; | 433 | break; |
| @@ -438,10 +438,10 @@ static ssize_t http_handle_announce( const int64 client_socket, char *data ) { | |||
| 438 | case -1: | 438 | case -1: |
| 439 | HTTPERROR_400_PARAM; | 439 | HTTPERROR_400_PARAM; |
| 440 | case 7: | 440 | case 7: |
| 441 | if( !byte_diff( data, 7, "stopped" ) ) OT_FLAG( &peer ) |= PEER_FLAG_STOPPED; | 441 | if( !byte_diff( data, 7, "stopped" ) ) OT_PEERFLAG( &peer ) |= PEER_FLAG_STOPPED; |
| 442 | break; | 442 | break; |
| 443 | case 9: | 443 | case 9: |
| 444 | if( !byte_diff( data, 9, "completed" ) ) OT_FLAG( &peer ) |= PEER_FLAG_COMPLETED; | 444 | if( !byte_diff( data, 9, "completed" ) ) OT_PEERFLAG( &peer ) |= PEER_FLAG_COMPLETED; |
| 445 | default: /* Fall through intended */ | 445 | default: /* Fall through intended */ |
| 446 | break; | 446 | break; |
| 447 | } | 447 | } |
| @@ -481,7 +481,7 @@ static ssize_t http_handle_announce( const int64 client_socket, char *data ) { | |||
| 481 | if( !hash ) | 481 | if( !hash ) |
| 482 | return sprintf( static_outbuf + SUCCESS_HTTP_HEADER_LENGTH, "d14:failure reason80:Your client forgot to send your torrent's info_hash. Please upgrade your client.e" ); | 482 | return sprintf( static_outbuf + SUCCESS_HTTP_HEADER_LENGTH, "d14:failure reason80:Your client forgot to send your torrent's info_hash. Please upgrade your client.e" ); |
| 483 | 483 | ||
| 484 | if( OT_FLAG( &peer ) & PEER_FLAG_STOPPED ) | 484 | if( OT_PEERFLAG( &peer ) & PEER_FLAG_STOPPED ) |
| 485 | len = remove_peer_from_torrent( hash, &peer, SUCCESS_HTTP_HEADER_LENGTH + static_outbuf, FLAG_TCP ); | 485 | len = remove_peer_from_torrent( hash, &peer, SUCCESS_HTTP_HEADER_LENGTH + static_outbuf, FLAG_TCP ); |
| 486 | else { | 486 | else { |
| 487 | torrent = add_peer_to_torrent( hash, &peer WANT_SYNC_PARAM( 0 ) ); | 487 | torrent = add_peer_to_torrent( hash, &peer WANT_SYNC_PARAM( 0 ) ); |
| @@ -498,7 +498,7 @@ ssize_t http_handle_request( const int64 client_socket, char *data, size_t recv_ | |||
| 498 | #ifdef _DEBUG_HTTPERROR | 498 | #ifdef _DEBUG_HTTPERROR |
| 499 | if( recv_length >= sizeof( debug_request ) ) | 499 | if( recv_length >= sizeof( debug_request ) ) |
| 500 | recv_length = sizeof( debug_request) - 1; | 500 | recv_length = sizeof( debug_request) - 1; |
| 501 | memcpy( debug_request, recv_header, recv_length ); | 501 | memmove( debug_request, recv_header, recv_length ); |
| 502 | debug_request[ recv_length ] = 0; | 502 | debug_request[ recv_length ] = 0; |
| 503 | #endif | 503 | #endif |
| 504 | 504 | ||
diff --git a/ot_livesync.c b/ot_livesync.c index 1b1efe0..b447e83 100644 --- a/ot_livesync.c +++ b/ot_livesync.c | |||
| @@ -94,10 +94,11 @@ static void livesync_issuepacket( ) { | |||
| 94 | 94 | ||
| 95 | /* Inform live sync about whats going on. */ | 95 | /* Inform live sync about whats going on. */ |
| 96 | void livesync_tell( ot_hash * const info_hash, const ot_peer * const peer ) { | 96 | void livesync_tell( ot_hash * const info_hash, const ot_peer * const peer ) { |
| 97 | memmove( livesync_outbuffer_pos , info_hash, sizeof(ot_hash)); | 97 | int i; |
| 98 | memmove( livesync_outbuffer_pos + sizeof(ot_hash), peer, sizeof(ot_peer)); | 98 | for(i=0;i<20;i+=4) WRITE32(livesync_outbuffer_pos+=4,0,READ32(info_hash,i)); |
| 99 | 99 | WRITE32(livesync_outbuffer_pos+=4,0,READ32(peer,0)); | |
| 100 | livesync_outbuffer_pos += sizeof(ot_hash) + sizeof(ot_peer); | 100 | WRITE32(livesync_outbuffer_pos+=4,0,READ32(peer,4)); |
| 101 | |||
| 101 | if( livesync_outbuffer_pos >= livesync_outbuffer_highwater ) | 102 | if( livesync_outbuffer_pos >= livesync_outbuffer_highwater ) |
| 102 | livesync_issuepacket(); | 103 | livesync_issuepacket(); |
| 103 | } | 104 | } |
| @@ -146,7 +147,7 @@ static void * livesync_worker( void * args ) { | |||
| 146 | ot_peer *peer = (ot_peer*)(livesync_inbuffer + off + sizeof(ot_hash)); | 147 | ot_peer *peer = (ot_peer*)(livesync_inbuffer + off + sizeof(ot_hash)); |
| 147 | ot_hash *hash = (ot_hash*)(livesync_inbuffer + off); | 148 | ot_hash *hash = (ot_hash*)(livesync_inbuffer + off); |
| 148 | 149 | ||
| 149 | if( OT_FLAG(peer) & PEER_FLAG_STOPPED ) | 150 | if( OT_PEERFLAG(peer) & PEER_FLAG_STOPPED ) |
| 150 | remove_peer_from_torrent(hash, peer, NULL, FLAG_MCA); | 151 | remove_peer_from_torrent(hash, peer, NULL, FLAG_MCA); |
| 151 | else | 152 | else |
| 152 | add_peer_to_torrent( hash, peer WANT_SYNC_PARAM(1)); | 153 | add_peer_to_torrent( hash, peer WANT_SYNC_PARAM(1)); |
| @@ -27,7 +27,7 @@ static void udp_make_connectionid( uint32_t * connid, const char * remoteip ) { | |||
| 27 | (void)remoteip; | 27 | (void)remoteip; |
| 28 | 28 | ||
| 29 | /* Use a static secret for now */ | 29 | /* Use a static secret for now */ |
| 30 | memcpy( connid, g_static_connid, 8 ); | 30 | memmove( connid, g_static_connid, 8 ); |
| 31 | } | 31 | } |
| 32 | 32 | ||
| 33 | static int udp_test_connectionid( const uint32_t * const connid, const char * remoteip ) { | 33 | static int udp_test_connectionid( const uint32_t * const connid, const char * remoteip ) { |
| @@ -94,21 +94,21 @@ void handle_udp4( int64 serversocket ) { | |||
| 94 | 94 | ||
| 95 | OT_SETIP( &peer, remoteip ); | 95 | OT_SETIP( &peer, remoteip ); |
| 96 | OT_SETPORT( &peer, &port ); | 96 | OT_SETPORT( &peer, &port ); |
| 97 | OT_FLAG( &peer ) = 0; | 97 | OT_PEERFLAG( &peer ) = 0; |
| 98 | 98 | ||
| 99 | switch( event ) { | 99 | switch( event ) { |
| 100 | case 1: OT_FLAG( &peer ) |= PEER_FLAG_COMPLETED; break; | 100 | case 1: OT_PEERFLAG( &peer ) |= PEER_FLAG_COMPLETED; break; |
| 101 | case 3: OT_FLAG( &peer ) |= PEER_FLAG_STOPPED; break; | 101 | case 3: OT_PEERFLAG( &peer ) |= PEER_FLAG_STOPPED; break; |
| 102 | default: break; | 102 | default: break; |
| 103 | } | 103 | } |
| 104 | 104 | ||
| 105 | if( !left ) | 105 | if( !left ) |
| 106 | OT_FLAG( &peer ) |= PEER_FLAG_SEEDING; | 106 | OT_PEERFLAG( &peer ) |= PEER_FLAG_SEEDING; |
| 107 | 107 | ||
| 108 | outpacket[0] = htonl( 1 ); /* announce action */ | 108 | outpacket[0] = htonl( 1 ); /* announce action */ |
| 109 | outpacket[1] = inpacket[12/4]; | 109 | outpacket[1] = inpacket[12/4]; |
| 110 | 110 | ||
| 111 | if( OT_FLAG( &peer ) & PEER_FLAG_STOPPED ) /* Peer is gone. */ | 111 | if( OT_PEERFLAG( &peer ) & PEER_FLAG_STOPPED ) /* Peer is gone. */ |
| 112 | r = remove_peer_from_torrent( hash, &peer, static_outbuf, FLAG_UDP ); | 112 | r = remove_peer_from_torrent( hash, &peer, static_outbuf, FLAG_UDP ); |
| 113 | else { | 113 | else { |
| 114 | torrent = add_peer_to_torrent( hash, &peer WANT_SYNC_PARAM( 0 ) ); | 114 | torrent = add_peer_to_torrent( hash, &peer WANT_SYNC_PARAM( 0 ) ); |
diff --git a/ot_vector.c b/ot_vector.c index 7d2a1a9..154d1c8 100644 --- a/ot_vector.c +++ b/ot_vector.c | |||
| @@ -16,9 +16,6 @@ | |||
| 16 | #include "uint32.h" | 16 | #include "uint32.h" |
| 17 | #include "uint16.h" | 17 | #include "uint16.h" |
| 18 | 18 | ||
| 19 | #define READ16(addr,offs) ((int16_t)uint16_read((offs)+(uint8_t*)(addr))) | ||
| 20 | #define READ32(addr,offs) ((int32_t)uint32_read((offs)+(uint8_t*)(addr))) | ||
| 21 | |||
| 22 | static int vector_compare_peer(const void *peer1, const void *peer2 ) { | 19 | static int vector_compare_peer(const void *peer1, const void *peer2 ) { |
| 23 | int32_t cmp = READ32(peer1,0) - READ32(peer2,0); | 20 | int32_t cmp = READ32(peer1,0) - READ32(peer2,0); |
| 24 | if (cmp == 0) cmp = READ16(peer1,4) - READ16(peer2,4); | 21 | if (cmp == 0) cmp = READ16(peer1,4) - READ16(peer2,4); |
| @@ -166,7 +163,7 @@ int vector_remove_peer( ot_vector *vector, ot_peer *peer ) { | |||
| 166 | match = binary_search_peer( peer, vector->data, vector->size, &exactmatch ); | 163 | match = binary_search_peer( peer, vector->data, vector->size, &exactmatch ); |
| 167 | if( !exactmatch ) return 0; | 164 | if( !exactmatch ) return 0; |
| 168 | 165 | ||
| 169 | exactmatch = ( OT_FLAG( match ) & PEER_FLAG_SEEDING ) ? 2 : 1; | 166 | exactmatch = ( OT_PEERFLAG( match ) & PEER_FLAG_SEEDING ) ? 2 : 1; |
| 170 | memmove( match, match + 1, sizeof(ot_peer) * ( end - match - 1 ) ); | 167 | memmove( match, match + 1, sizeof(ot_peer) * ( end - match - 1 ) ); |
| 171 | 168 | ||
| 172 | vector->size--; | 169 | vector->size--; |
diff --git a/trackerlogic.c b/trackerlogic.c index 4c6b5b0..d7fca69 100644 --- a/trackerlogic.c +++ b/trackerlogic.c | |||
| @@ -62,8 +62,8 @@ ot_torrent *add_peer_to_torrent( ot_hash *hash, ot_peer *peer WANT_SYNC_PARAM( | |||
| 62 | 62 | ||
| 63 | if( !exactmatch ) { | 63 | if( !exactmatch ) { |
| 64 | /* Create a new torrent entry, then */ | 64 | /* Create a new torrent entry, then */ |
| 65 | memmove( &torrent->hash, hash, sizeof( ot_hash ) ); | 65 | int i; for(i=0;i<20;i+=4) WRITE32(&torrent->hash,i,READ32(hash,i)); |
| 66 | 66 | ||
| 67 | if( !( torrent->peer_list = malloc( sizeof (ot_peerlist) ) ) ) { | 67 | if( !( torrent->peer_list = malloc( sizeof (ot_peerlist) ) ) ) { |
| 68 | vector_remove_torrent( torrents_list, torrent ); | 68 | vector_remove_torrent( torrents_list, torrent ); |
| 69 | mutex_bucket_unlock_by_hash( hash ); | 69 | mutex_bucket_unlock_by_hash( hash ); |
| @@ -86,8 +86,8 @@ ot_torrent *add_peer_to_torrent( ot_hash *hash, ot_peer *peer WANT_SYNC_PARAM( | |||
| 86 | OT_PEERTIME( peer ) = 0; | 86 | OT_PEERTIME( peer ) = 0; |
| 87 | 87 | ||
| 88 | /* Sanitize flags: Whoever claims to have completed download, must be a seeder */ | 88 | /* Sanitize flags: Whoever claims to have completed download, must be a seeder */ |
| 89 | if( ( OT_FLAG( peer ) & ( PEER_FLAG_COMPLETED | PEER_FLAG_SEEDING ) ) == PEER_FLAG_COMPLETED ) | 89 | if( ( OT_PEERFLAG( peer ) & ( PEER_FLAG_COMPLETED | PEER_FLAG_SEEDING ) ) == PEER_FLAG_COMPLETED ) |
| 90 | OT_FLAG( peer ) ^= PEER_FLAG_COMPLETED; | 90 | OT_PEERFLAG( peer ) ^= PEER_FLAG_COMPLETED; |
| 91 | 91 | ||
| 92 | /* If we hadn't had a match create peer there */ | 92 | /* If we hadn't had a match create peer there */ |
| 93 | if( !exactmatch ) { | 93 | if( !exactmatch ) { |
| @@ -96,13 +96,13 @@ ot_torrent *add_peer_to_torrent( ot_hash *hash, ot_peer *peer WANT_SYNC_PARAM( | |||
| 96 | if( !from_sync ) | 96 | if( !from_sync ) |
| 97 | livesync_tell( hash, peer ); | 97 | livesync_tell( hash, peer ); |
| 98 | else | 98 | else |
| 99 | OT_FLAG( peer ) |= PEER_FLAG_FROM_SYNC; | 99 | OT_PEERFLAG( peer ) |= PEER_FLAG_FROM_SYNC; |
| 100 | #endif | 100 | #endif |
| 101 | 101 | ||
| 102 | torrent->peer_list->peer_count++; | 102 | torrent->peer_list->peer_count++; |
| 103 | if( OT_FLAG(peer) & PEER_FLAG_COMPLETED ) | 103 | if( OT_PEERFLAG(peer) & PEER_FLAG_COMPLETED ) |
| 104 | torrent->peer_list->down_count++; | 104 | torrent->peer_list->down_count++; |
| 105 | if( OT_FLAG(peer) & PEER_FLAG_SEEDING ) | 105 | if( OT_PEERFLAG(peer) & PEER_FLAG_SEEDING ) |
| 106 | torrent->peer_list->seed_count++; | 106 | torrent->peer_list->seed_count++; |
| 107 | 107 | ||
| 108 | } else { | 108 | } else { |
| @@ -114,7 +114,7 @@ ot_torrent *add_peer_to_torrent( ot_hash *hash, ot_peer *peer WANT_SYNC_PARAM( | |||
| 114 | int i; | 114 | int i; |
| 115 | for( i=0;i<20;++i)printf("%02X",(*hash)[i]); | 115 | for( i=0;i<20;++i)printf("%02X",(*hash)[i]); |
| 116 | if( g_this_peerid_data ) g_this_peerid_data[g_this_peerid_len] = 0; | 116 | if( g_this_peerid_data ) g_this_peerid_data[g_this_peerid_len] = 0; |
| 117 | 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_FLAG(peer_dest), g_this_peerid_data ? g_this_peerid_data : "-" ); | 117 | 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 : "-" ); |
| 118 | } | 118 | } |
| 119 | #endif | 119 | #endif |
| 120 | 120 | ||
| @@ -123,19 +123,19 @@ ot_torrent *add_peer_to_torrent( ot_hash *hash, ot_peer *peer WANT_SYNC_PARAM( | |||
| 123 | fresh "completed" reports */ | 123 | fresh "completed" reports */ |
| 124 | if( !from_sync ) { | 124 | if( !from_sync ) { |
| 125 | if( OT_PEERTIME( peer_dest ) > OT_CLIENT_SYNC_RENEW_BOUNDARY || | 125 | if( OT_PEERTIME( peer_dest ) > OT_CLIENT_SYNC_RENEW_BOUNDARY || |
| 126 | ( !(OT_FLAG(peer_dest) & PEER_FLAG_COMPLETED ) && (OT_FLAG(peer) & PEER_FLAG_COMPLETED ) ) ) | 126 | ( !(OT_PEERFLAG(peer_dest) & PEER_FLAG_COMPLETED ) && (OT_PEERFLAG(peer) & PEER_FLAG_COMPLETED ) ) ) |
| 127 | livesync_tell( hash, peer ); | 127 | livesync_tell( hash, peer ); |
| 128 | } | 128 | } |
| 129 | #endif | 129 | #endif |
| 130 | 130 | ||
| 131 | if( (OT_FLAG(peer_dest) & PEER_FLAG_SEEDING ) && !(OT_FLAG(peer) & PEER_FLAG_SEEDING ) ) | 131 | if( (OT_PEERFLAG(peer_dest) & PEER_FLAG_SEEDING ) && !(OT_PEERFLAG(peer) & PEER_FLAG_SEEDING ) ) |
| 132 | torrent->peer_list->seed_count--; | 132 | torrent->peer_list->seed_count--; |
| 133 | if( !(OT_FLAG(peer_dest) & PEER_FLAG_SEEDING ) && (OT_FLAG(peer) & PEER_FLAG_SEEDING ) ) | 133 | if( !(OT_PEERFLAG(peer_dest) & PEER_FLAG_SEEDING ) && (OT_PEERFLAG(peer) & PEER_FLAG_SEEDING ) ) |
| 134 | torrent->peer_list->seed_count++; | 134 | torrent->peer_list->seed_count++; |
| 135 | if( !(OT_FLAG(peer_dest) & PEER_FLAG_COMPLETED ) && (OT_FLAG(peer) & PEER_FLAG_COMPLETED ) ) | 135 | if( !(OT_PEERFLAG(peer_dest) & PEER_FLAG_COMPLETED ) && (OT_PEERFLAG(peer) & PEER_FLAG_COMPLETED ) ) |
| 136 | torrent->peer_list->down_count++; | 136 | torrent->peer_list->down_count++; |
| 137 | if( OT_FLAG(peer_dest) & PEER_FLAG_COMPLETED ) | 137 | if( OT_PEERFLAG(peer_dest) & PEER_FLAG_COMPLETED ) |
| 138 | OT_FLAG( peer ) |= PEER_FLAG_COMPLETED; | 138 | OT_PEERFLAG( peer ) |= PEER_FLAG_COMPLETED; |
| 139 | } | 139 | } |
| 140 | 140 | ||
| 141 | *(uint64_t*)(peer_dest) = *(uint64_t*)(peer); | 141 | *(uint64_t*)(peer_dest) = *(uint64_t*)(peer); |
| @@ -163,8 +163,10 @@ static size_t return_peers_all( ot_peerlist *peer_list, char *reply ) { | |||
| 163 | for( bucket = 0; bucket<num_buckets; ++bucket ) { | 163 | for( bucket = 0; bucket<num_buckets; ++bucket ) { |
| 164 | ot_peer * peers = (ot_peer*)bucket_list[bucket].data; | 164 | ot_peer * peers = (ot_peer*)bucket_list[bucket].data; |
| 165 | size_t peer_count = bucket_list[bucket].size; | 165 | size_t peer_count = bucket_list[bucket].size; |
| 166 | while( peer_count-- ) | 166 | while( peer_count-- ) { |
| 167 | memmove( r+=6, peers++, 6 ); | 167 | WRITE32(r+=4,0,READ32(peers,0)); |
| 168 | WRITE16(r+=2,0,READ16(peers++,4)); | ||
| 169 | } | ||
| 168 | } | 170 | } |
| 169 | 171 | ||
| 170 | return r - reply; | 172 | return r - reply; |
| @@ -194,6 +196,8 @@ static size_t return_peers_selection( ot_peerlist *peer_list, size_t amount, cha | |||
| 194 | bucket_offset = random() % peer_list->peer_count; | 196 | bucket_offset = random() % peer_list->peer_count; |
| 195 | 197 | ||
| 196 | while( amount-- ) { | 198 | while( amount-- ) { |
| 199 | ot_peer * peer; | ||
| 200 | |||
| 197 | /* This is the aliased, non shifted range, next value may fall into */ | 201 | /* This is the aliased, non shifted range, next value may fall into */ |
| 198 | unsigned int diff = ( ( ( amount + 1 ) * shifted_step ) >> shift ) - | 202 | unsigned int diff = ( ( ( amount + 1 ) * shifted_step ) >> shift ) - |
| 199 | ( ( amount * shifted_step ) >> shift ); | 203 | ( ( amount * shifted_step ) >> shift ); |
| @@ -203,9 +207,9 @@ static size_t return_peers_selection( ot_peerlist *peer_list, size_t amount, cha | |||
| 203 | bucket_offset -= bucket_list[bucket_index].size; | 207 | bucket_offset -= bucket_list[bucket_index].size; |
| 204 | bucket_index = ( bucket_index + 1 ) % num_buckets; | 208 | bucket_index = ( bucket_index + 1 ) % num_buckets; |
| 205 | } | 209 | } |
| 206 | 210 | peer = ((ot_peer*)bucket_list[bucket_index].data) + bucket_offset; | |
| 207 | memmove( r, ((ot_peer*)bucket_list[bucket_index].data) + bucket_offset, 6 ); | 211 | WRITE32(r+=4,0,READ32(peer,0)); |
| 208 | r += 6; | 212 | WRITE16(r+=2,0,READ16(peer,4)); |
| 209 | } | 213 | } |
| 210 | return r - reply; | 214 | return r - reply; |
| 211 | } | 215 | } |
| @@ -288,9 +292,11 @@ size_t return_tcp_scrape_for_torrent( ot_hash *hash_list, int amount, char *repl | |||
| 288 | if( clean_single_torrent( torrent ) ) { | 292 | if( clean_single_torrent( torrent ) ) { |
| 289 | vector_remove_torrent( torrents_list, torrent ); | 293 | vector_remove_torrent( torrents_list, torrent ); |
| 290 | } else { | 294 | } else { |
| 291 | memmove( r, "20:", 3 ); memmove( r+3, hash, 20 ); | 295 | int j; |
| 292 | r += sprintf( r+23, "d8:completei%zde10:downloadedi%zde10:incompletei%zdee", | 296 | *r++='2';*r++='0';*r++=':'; |
| 293 | torrent->peer_list->seed_count, torrent->peer_list->down_count, torrent->peer_list->peer_count-torrent->peer_list->seed_count ) + 23; | 297 | for(j=0;j<20;j+=4) WRITE32(r+=4,0,READ32(hash,i)); |
| 298 | r += sprintf( r, "d8:completei%zde10:downloadedi%zde10:incompletei%zdee", | ||
| 299 | torrent->peer_list->seed_count, torrent->peer_list->down_count, torrent->peer_list->peer_count-torrent->peer_list->seed_count ); | ||
| 294 | } | 300 | } |
| 295 | } | 301 | } |
| 296 | mutex_bucket_unlock_by_hash( hash ); | 302 | mutex_bucket_unlock_by_hash( hash ); |
| @@ -310,7 +316,7 @@ size_t remove_peer_from_torrent( ot_hash *hash, ot_peer *peer, char *reply, PROT | |||
| 310 | 316 | ||
| 311 | #ifdef WANT_SYNC_LIVE | 317 | #ifdef WANT_SYNC_LIVE |
| 312 | if( proto != FLAG_MCA ) { | 318 | if( proto != FLAG_MCA ) { |
| 313 | OT_FLAG( peer ) |= PEER_FLAG_STOPPED; | 319 | OT_PEERFLAG( peer ) |= PEER_FLAG_STOPPED; |
| 314 | livesync_tell( hash, peer ); | 320 | livesync_tell( hash, peer ); |
| 315 | } | 321 | } |
| 316 | #endif | 322 | #endif |
diff --git a/trackerlogic.h b/trackerlogic.h index 81bd97a..1705928 100644 --- a/trackerlogic.h +++ b/trackerlogic.h | |||
| @@ -11,6 +11,15 @@ | |||
| 11 | #include <time.h> | 11 | #include <time.h> |
| 12 | #include <stdint.h> | 12 | #include <stdint.h> |
| 13 | 13 | ||
| 14 | /* Libowfat */ | ||
| 15 | #include <uint16.h> | ||
| 16 | #include <uint32.h> | ||
| 17 | |||
| 18 | #define READ16(addr,offs) ((int16_t)uint16_read((offs)+(uint8_t*)(addr))) | ||
| 19 | #define READ32(addr,offs) ((int32_t)uint32_read((offs)+(uint8_t*)(addr))) | ||
| 20 | #define WRITE16(addr,offs,val) uint16_pack((offs)+(uint8_t*)(addr),(val)) | ||
| 21 | #define WRITE32(addr,offs,val) uint32_pack((offs)+(uint8_t*)(addr),(val)) | ||
| 22 | |||
| 14 | typedef uint8_t ot_hash[20]; | 23 | typedef uint8_t ot_hash[20]; |
| 15 | typedef time_t ot_time; | 24 | typedef time_t ot_time; |
| 16 | 25 | ||
| @@ -55,10 +64,10 @@ static const uint8_t PEER_FLAG_STOPPED = 0x20; | |||
| 55 | static const uint8_t PEER_FLAG_FROM_SYNC = 0x10; | 64 | static const uint8_t PEER_FLAG_FROM_SYNC = 0x10; |
| 56 | static const uint8_t PEER_FLAG_LEECHING = 0x00; | 65 | static const uint8_t PEER_FLAG_LEECHING = 0x00; |
| 57 | 66 | ||
| 58 | #define OT_SETIP( peer, ip ) memmove((peer),(ip),4); | 67 | #define OT_SETIP(peer,ip) WRITE32((peer),0,READ32((ip),0)) |
| 59 | #define OT_SETPORT( peer, port ) memmove(((uint8_t*)peer)+4,(port),2); | 68 | #define OT_SETPORT(peer,port) WRITE16((peer),4,READ16((port),0)) |
| 60 | #define OT_FLAG(peer) (((uint8_t*)(peer))[6]) | 69 | #define OT_PEERFLAG(peer) (((uint8_t*)(peer))[6]) |
| 61 | #define OT_PEERTIME(peer) (((uint8_t*)(peer))[7]) | 70 | #define OT_PEERTIME(peer) (((uint8_t*)(peer))[7]) |
| 62 | 71 | ||
| 63 | #define OT_PEER_COMPARE_SIZE ((size_t)6) | 72 | #define OT_PEER_COMPARE_SIZE ((size_t)6) |
| 64 | #define OT_HASH_COMPARE_SIZE (sizeof(ot_hash)) | 73 | #define OT_HASH_COMPARE_SIZE (sizeof(ot_hash)) |
