mirror of
				git://erdgeist.org/opentracker
				synced 2025-11-03 19:33:23 +08:00 
			
		
		
		
	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
This commit is contained in:
		
							parent
							
								
									a4ed31d517
								
							
						
					
					
						commit
						08c7162783
					
				@ -165,7 +165,7 @@ static void handle_accept( const int64 serversocket ) {
 | 
			
		||||
    io_wantread( i );
 | 
			
		||||
 | 
			
		||||
    memset( h, 0, sizeof( struct http_data ) );
 | 
			
		||||
    memmove( h->ip, ip, sizeof( ip ) );
 | 
			
		||||
    WRITE32(h->ip,0,READ32(ip,0));
 | 
			
		||||
 | 
			
		||||
    stats_issue_event( EVENT_ACCEPT, FLAG_TCP, ntohl(*(uint32_t*)ip));
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -105,7 +105,7 @@ static unsigned int   g_adminip_count = 0;
 | 
			
		||||
int accesslist_blessip( char *ip, ot_permissions permissions ) {
 | 
			
		||||
  if( g_adminip_count >= OT_ADMINIP_MAX )
 | 
			
		||||
    return -1;
 | 
			
		||||
  memmove( g_adminip_addresses + g_adminip_count, ip, 4 );
 | 
			
		||||
  WRITE32(g_adminip_addresses + g_adminip_count,0,READ32(ip,0));
 | 
			
		||||
  g_adminip_permissions[ g_adminip_count++ ] = permissions;
 | 
			
		||||
#ifdef _DEBUG
 | 
			
		||||
  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
 | 
			
		||||
      OT_PEERTIME( peers ) = timediff;
 | 
			
		||||
      *(uint64_t*)(insert_point++) = *(uint64_t*)(peers++);
 | 
			
		||||
    } else
 | 
			
		||||
      if( OT_FLAG( peers++ ) & PEER_FLAG_SEEDING )
 | 
			
		||||
      if( OT_PEERFLAG( peers++ ) & PEER_FLAG_SEEDING )
 | 
			
		||||
        (*removed_seeders)++;
 | 
			
		||||
 | 
			
		||||
  return peers - insert_point;
 | 
			
		||||
 | 
			
		||||
@ -113,7 +113,7 @@ static int fullscrape_increase( int *iovec_entries, struct iovec **iovector,
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void fullscrape_make( int *iovec_entries, struct iovec **iovector, ot_tasktype mode ) {
 | 
			
		||||
  int      bucket;
 | 
			
		||||
  int      bucket,i;
 | 
			
		||||
  char    *r, *re;
 | 
			
		||||
#ifdef WANT_COMPRESSION_GZIP
 | 
			
		||||
  char     compress_buffer[OT_SCRAPE_MAXENTRYLEN];
 | 
			
		||||
@ -163,7 +163,7 @@ static void fullscrape_make( int *iovec_entries, struct iovec **iovector, ot_tas
 | 
			
		||||
 | 
			
		||||
        /* push hash as bencoded string */
 | 
			
		||||
        *r++='2'; *r++='0'; *r++=':';
 | 
			
		||||
        memmove( r, hash, 20 ); r+=20;
 | 
			
		||||
        for(i=0;i<20;i+=4) WRITE32(r+=4,0,READ32(hash,i));
 | 
			
		||||
 | 
			
		||||
        /* push rest of the scrape string */
 | 
			
		||||
        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
 | 
			
		||||
        r += sprintf( r, ":%zd:%zd\n", peer_list->seed_count, peer_list->peer_count-peer_list->seed_count );
 | 
			
		||||
        break;
 | 
			
		||||
      case TASK_FULLSCRAPE_TPB_BINARY:
 | 
			
		||||
        memmove( r, hash, 20 ); r+=20;
 | 
			
		||||
        for(i=0;i<20;i+=4) WRITE32(r+=4,0,READ32(hash,i));
 | 
			
		||||
        *(uint32_t*)r++ = htonl( (uint32_t)peer_list->seed_count );
 | 
			
		||||
        *(uint32_t*)r++ = htonl( (uint32_t)( peer_list->peer_count-peer_list->seed_count) );
 | 
			
		||||
        break;
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										12
									
								
								ot_http.c
									
									
									
									
									
								
							
							
						
						
									
										12
									
								
								ot_http.c
									
									
									
									
									
								
							@ -399,7 +399,7 @@ static ssize_t http_handle_announce( const int64 client_socket, char *data ) {
 | 
			
		||||
 | 
			
		||||
  OT_SETIP( &peer, ((struct http_data*)io_getcookie( client_socket ) )->ip );
 | 
			
		||||
  OT_SETPORT( &peer, &port );
 | 
			
		||||
  OT_FLAG( &peer ) = 0;
 | 
			
		||||
  OT_PEERFLAG( &peer ) = 0;
 | 
			
		||||
  numwant = 50;
 | 
			
		||||
  scanon = 1;
 | 
			
		||||
 | 
			
		||||
@ -427,7 +427,7 @@ static ssize_t http_handle_announce( const int64 client_socket, char *data ) {
 | 
			
		||||
      } else if( !byte_diff( data, 4, "left" ) ) {
 | 
			
		||||
        if( ( len = scan_urlencoded_query( &c, data = c, SCAN_SEARCHPATH_VALUE ) ) <= 0 ) HTTPERROR_400_PARAM;
 | 
			
		||||
        if( scan_fixed_int( data, len, &tmp ) ) tmp = 0;
 | 
			
		||||
        if( !tmp ) OT_FLAG( &peer ) |= PEER_FLAG_SEEDING;
 | 
			
		||||
        if( !tmp ) OT_PEERFLAG( &peer ) |= PEER_FLAG_SEEDING;
 | 
			
		||||
      } else
 | 
			
		||||
        scan_urlencoded_skipvalue( &c );
 | 
			
		||||
      break;
 | 
			
		||||
@ -438,10 +438,10 @@ static ssize_t http_handle_announce( const int64 client_socket, char *data ) {
 | 
			
		||||
      case -1:
 | 
			
		||||
        HTTPERROR_400_PARAM;
 | 
			
		||||
      case 7:
 | 
			
		||||
        if( !byte_diff( data, 7, "stopped" ) ) OT_FLAG( &peer ) |= PEER_FLAG_STOPPED;
 | 
			
		||||
        if( !byte_diff( data, 7, "stopped" ) ) OT_PEERFLAG( &peer ) |= PEER_FLAG_STOPPED;
 | 
			
		||||
        break;
 | 
			
		||||
      case 9:
 | 
			
		||||
        if( !byte_diff( data, 9, "completed" ) ) OT_FLAG( &peer ) |= PEER_FLAG_COMPLETED;
 | 
			
		||||
        if( !byte_diff( data, 9, "completed" ) ) OT_PEERFLAG( &peer ) |= PEER_FLAG_COMPLETED;
 | 
			
		||||
      default: /* Fall through intended */
 | 
			
		||||
        break;
 | 
			
		||||
      }
 | 
			
		||||
@ -481,7 +481,7 @@ static ssize_t http_handle_announce( const int64 client_socket, char *data ) {
 | 
			
		||||
  if( !hash )
 | 
			
		||||
    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" );
 | 
			
		||||
 | 
			
		||||
  if( OT_FLAG( &peer ) & PEER_FLAG_STOPPED )
 | 
			
		||||
  if( OT_PEERFLAG( &peer ) & PEER_FLAG_STOPPED )
 | 
			
		||||
    len = remove_peer_from_torrent( hash, &peer, SUCCESS_HTTP_HEADER_LENGTH + static_outbuf, FLAG_TCP );
 | 
			
		||||
  else {
 | 
			
		||||
    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_
 | 
			
		||||
#ifdef _DEBUG_HTTPERROR
 | 
			
		||||
  if( recv_length >= sizeof( debug_request ) )
 | 
			
		||||
    recv_length = sizeof( debug_request) - 1;
 | 
			
		||||
  memcpy( debug_request, recv_header, recv_length );
 | 
			
		||||
  memmove( debug_request, recv_header, recv_length );
 | 
			
		||||
  debug_request[ recv_length ] = 0;
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -94,10 +94,11 @@ static void livesync_issuepacket( ) {
 | 
			
		||||
 | 
			
		||||
/* Inform live sync about whats going on. */
 | 
			
		||||
void livesync_tell( ot_hash * const info_hash, const ot_peer * const peer ) {
 | 
			
		||||
  memmove( livesync_outbuffer_pos                  , info_hash, sizeof(ot_hash));
 | 
			
		||||
  memmove( livesync_outbuffer_pos + sizeof(ot_hash), peer,      sizeof(ot_peer));
 | 
			
		||||
 | 
			
		||||
  livesync_outbuffer_pos += sizeof(ot_hash) + sizeof(ot_peer);
 | 
			
		||||
  int i;
 | 
			
		||||
  for(i=0;i<20;i+=4) WRITE32(livesync_outbuffer_pos+=4,0,READ32(info_hash,i));
 | 
			
		||||
  WRITE32(livesync_outbuffer_pos+=4,0,READ32(peer,0));
 | 
			
		||||
  WRITE32(livesync_outbuffer_pos+=4,0,READ32(peer,4));
 | 
			
		||||
  
 | 
			
		||||
  if( livesync_outbuffer_pos >= livesync_outbuffer_highwater )
 | 
			
		||||
    livesync_issuepacket();
 | 
			
		||||
}
 | 
			
		||||
@ -146,7 +147,7 @@ static void * livesync_worker( void * args ) {
 | 
			
		||||
      ot_peer *peer = (ot_peer*)(livesync_inbuffer + off + sizeof(ot_hash));
 | 
			
		||||
      ot_hash *hash = (ot_hash*)(livesync_inbuffer + off);
 | 
			
		||||
 | 
			
		||||
      if( OT_FLAG(peer) & PEER_FLAG_STOPPED )
 | 
			
		||||
      if( OT_PEERFLAG(peer) & PEER_FLAG_STOPPED )
 | 
			
		||||
        remove_peer_from_torrent(hash, peer, NULL, FLAG_MCA);
 | 
			
		||||
      else
 | 
			
		||||
        add_peer_to_torrent( hash, peer  WANT_SYNC_PARAM(1));
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										12
									
								
								ot_udp.c
									
									
									
									
									
								
							
							
						
						
									
										12
									
								
								ot_udp.c
									
									
									
									
									
								
							@ -27,7 +27,7 @@ static void udp_make_connectionid( uint32_t * connid, const char * remoteip ) {
 | 
			
		||||
  (void)remoteip;
 | 
			
		||||
 | 
			
		||||
  /* Use a static secret for now */
 | 
			
		||||
  memcpy( connid, g_static_connid, 8 );
 | 
			
		||||
  memmove( connid, g_static_connid, 8 );
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static int udp_test_connectionid( const uint32_t * const connid, const char * remoteip ) {
 | 
			
		||||
@ -94,21 +94,21 @@ void handle_udp4( int64 serversocket ) {
 | 
			
		||||
 | 
			
		||||
      OT_SETIP( &peer, remoteip );
 | 
			
		||||
      OT_SETPORT( &peer, &port );
 | 
			
		||||
      OT_FLAG( &peer ) = 0;
 | 
			
		||||
      OT_PEERFLAG( &peer ) = 0;
 | 
			
		||||
 | 
			
		||||
      switch( event ) {
 | 
			
		||||
        case 1: OT_FLAG( &peer ) |= PEER_FLAG_COMPLETED; break;
 | 
			
		||||
        case 3: OT_FLAG( &peer ) |= PEER_FLAG_STOPPED; break;
 | 
			
		||||
        case 1: OT_PEERFLAG( &peer ) |= PEER_FLAG_COMPLETED; break;
 | 
			
		||||
        case 3: OT_PEERFLAG( &peer ) |= PEER_FLAG_STOPPED; break;
 | 
			
		||||
        default: break;
 | 
			
		||||
      }
 | 
			
		||||
 | 
			
		||||
      if( !left )
 | 
			
		||||
        OT_FLAG( &peer )         |= PEER_FLAG_SEEDING;
 | 
			
		||||
        OT_PEERFLAG( &peer )         |= PEER_FLAG_SEEDING;
 | 
			
		||||
 | 
			
		||||
      outpacket[0] = htonl( 1 );    /* announce action */
 | 
			
		||||
      outpacket[1] = inpacket[12/4];
 | 
			
		||||
 | 
			
		||||
      if( OT_FLAG( &peer ) & PEER_FLAG_STOPPED ) /* Peer is gone. */
 | 
			
		||||
      if( OT_PEERFLAG( &peer ) & PEER_FLAG_STOPPED ) /* Peer is gone. */
 | 
			
		||||
        r = remove_peer_from_torrent( hash, &peer, static_outbuf, FLAG_UDP );
 | 
			
		||||
      else {
 | 
			
		||||
        torrent = add_peer_to_torrent( hash, &peer  WANT_SYNC_PARAM( 0 ) );
 | 
			
		||||
 | 
			
		||||
@ -16,9 +16,6 @@
 | 
			
		||||
#include "uint32.h"
 | 
			
		||||
#include "uint16.h"
 | 
			
		||||
 | 
			
		||||
#define READ16(addr,offs) ((int16_t)uint16_read((offs)+(uint8_t*)(addr)))
 | 
			
		||||
#define READ32(addr,offs) ((int32_t)uint32_read((offs)+(uint8_t*)(addr)))
 | 
			
		||||
 | 
			
		||||
static int vector_compare_peer(const void *peer1, const void *peer2 ) {
 | 
			
		||||
  int32_t       cmp = READ32(peer1,0) - READ32(peer2,0);
 | 
			
		||||
  if (cmp == 0) cmp = READ16(peer1,4) - READ16(peer2,4);
 | 
			
		||||
@ -166,7 +163,7 @@ int vector_remove_peer( ot_vector *vector, ot_peer *peer ) {
 | 
			
		||||
  match = binary_search_peer( peer, vector->data, vector->size,  &exactmatch );
 | 
			
		||||
  if( !exactmatch ) return 0;
 | 
			
		||||
 | 
			
		||||
  exactmatch = ( OT_FLAG( match ) & PEER_FLAG_SEEDING ) ? 2 : 1;
 | 
			
		||||
  exactmatch = ( OT_PEERFLAG( match ) & PEER_FLAG_SEEDING ) ? 2 : 1;
 | 
			
		||||
  memmove( match, match + 1, sizeof(ot_peer) * ( end - match - 1 ) );
 | 
			
		||||
 | 
			
		||||
  vector->size--;
 | 
			
		||||
 | 
			
		||||
@ -62,8 +62,8 @@ ot_torrent *add_peer_to_torrent( ot_hash *hash, ot_peer *peer  WANT_SYNC_PARAM(
 | 
			
		||||
 | 
			
		||||
  if( !exactmatch ) {
 | 
			
		||||
    /* Create a new torrent entry, then */
 | 
			
		||||
    memmove( &torrent->hash, hash, sizeof( ot_hash ) );
 | 
			
		||||
 | 
			
		||||
    int i; for(i=0;i<20;i+=4) WRITE32(&torrent->hash,i,READ32(hash,i));
 | 
			
		||||
    
 | 
			
		||||
    if( !( torrent->peer_list = malloc( sizeof (ot_peerlist) ) ) ) {
 | 
			
		||||
      vector_remove_torrent( torrents_list, torrent );
 | 
			
		||||
      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(
 | 
			
		||||
  OT_PEERTIME( peer ) = 0;
 | 
			
		||||
 | 
			
		||||
  /* Sanitize flags: Whoever claims to have completed download, must be a seeder */
 | 
			
		||||
  if( ( OT_FLAG( peer ) & ( PEER_FLAG_COMPLETED | PEER_FLAG_SEEDING ) ) == PEER_FLAG_COMPLETED )
 | 
			
		||||
    OT_FLAG( peer ) ^= PEER_FLAG_COMPLETED;
 | 
			
		||||
  if( ( OT_PEERFLAG( peer ) & ( PEER_FLAG_COMPLETED | PEER_FLAG_SEEDING ) ) == PEER_FLAG_COMPLETED )
 | 
			
		||||
    OT_PEERFLAG( peer ) ^= PEER_FLAG_COMPLETED;
 | 
			
		||||
 | 
			
		||||
  /* If we hadn't had a match create peer there */
 | 
			
		||||
  if( !exactmatch ) {
 | 
			
		||||
@ -96,13 +96,13 @@ ot_torrent *add_peer_to_torrent( ot_hash *hash, ot_peer *peer  WANT_SYNC_PARAM(
 | 
			
		||||
    if( !from_sync )
 | 
			
		||||
      livesync_tell( hash, peer );
 | 
			
		||||
    else
 | 
			
		||||
      OT_FLAG( peer ) |= PEER_FLAG_FROM_SYNC;
 | 
			
		||||
      OT_PEERFLAG( peer ) |= PEER_FLAG_FROM_SYNC;
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
    torrent->peer_list->peer_count++;
 | 
			
		||||
    if( OT_FLAG(peer) & PEER_FLAG_COMPLETED )
 | 
			
		||||
    if( OT_PEERFLAG(peer) & PEER_FLAG_COMPLETED )
 | 
			
		||||
      torrent->peer_list->down_count++;
 | 
			
		||||
    if( OT_FLAG(peer) & PEER_FLAG_SEEDING )
 | 
			
		||||
    if( OT_PEERFLAG(peer) & PEER_FLAG_SEEDING )
 | 
			
		||||
      torrent->peer_list->seed_count++;
 | 
			
		||||
 | 
			
		||||
  } else {
 | 
			
		||||
@ -114,7 +114,7 @@ ot_torrent *add_peer_to_torrent( ot_hash *hash, ot_peer *peer  WANT_SYNC_PARAM(
 | 
			
		||||
      int i;
 | 
			
		||||
      for( i=0;i<20;++i)printf("%02X",(*hash)[i]);
 | 
			
		||||
      if( g_this_peerid_data ) g_this_peerid_data[g_this_peerid_len] = 0;
 | 
			
		||||
      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 : "-" );
 | 
			
		||||
      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 : "-" );
 | 
			
		||||
    }
 | 
			
		||||
#endif
 | 
			
		||||
    
 | 
			
		||||
@ -123,19 +123,19 @@ ot_torrent *add_peer_to_torrent( ot_hash *hash, ot_peer *peer  WANT_SYNC_PARAM(
 | 
			
		||||
       fresh "completed" reports */
 | 
			
		||||
    if( !from_sync ) {
 | 
			
		||||
      if( OT_PEERTIME( peer_dest ) > OT_CLIENT_SYNC_RENEW_BOUNDARY ||
 | 
			
		||||
         ( !(OT_FLAG(peer_dest) & PEER_FLAG_COMPLETED ) && (OT_FLAG(peer) & PEER_FLAG_COMPLETED ) ) )
 | 
			
		||||
         ( !(OT_PEERFLAG(peer_dest) & PEER_FLAG_COMPLETED ) && (OT_PEERFLAG(peer) & PEER_FLAG_COMPLETED ) ) )
 | 
			
		||||
        livesync_tell( hash, peer );
 | 
			
		||||
    }
 | 
			
		||||
#endif
 | 
			
		||||
    
 | 
			
		||||
    if(  (OT_FLAG(peer_dest) & PEER_FLAG_SEEDING )   && !(OT_FLAG(peer) & PEER_FLAG_SEEDING ) )
 | 
			
		||||
    if(  (OT_PEERFLAG(peer_dest) & PEER_FLAG_SEEDING )   && !(OT_PEERFLAG(peer) & PEER_FLAG_SEEDING ) )
 | 
			
		||||
      torrent->peer_list->seed_count--;
 | 
			
		||||
    if( !(OT_FLAG(peer_dest) & PEER_FLAG_SEEDING )   &&  (OT_FLAG(peer) & PEER_FLAG_SEEDING ) )
 | 
			
		||||
    if( !(OT_PEERFLAG(peer_dest) & PEER_FLAG_SEEDING )   &&  (OT_PEERFLAG(peer) & PEER_FLAG_SEEDING ) )
 | 
			
		||||
      torrent->peer_list->seed_count++;
 | 
			
		||||
    if( !(OT_FLAG(peer_dest) & PEER_FLAG_COMPLETED ) &&  (OT_FLAG(peer) & PEER_FLAG_COMPLETED ) )
 | 
			
		||||
    if( !(OT_PEERFLAG(peer_dest) & PEER_FLAG_COMPLETED ) &&  (OT_PEERFLAG(peer) & PEER_FLAG_COMPLETED ) )
 | 
			
		||||
      torrent->peer_list->down_count++;
 | 
			
		||||
    if(   OT_FLAG(peer_dest) & PEER_FLAG_COMPLETED )
 | 
			
		||||
      OT_FLAG( peer ) |= PEER_FLAG_COMPLETED;
 | 
			
		||||
    if(   OT_PEERFLAG(peer_dest) & PEER_FLAG_COMPLETED )
 | 
			
		||||
      OT_PEERFLAG( peer ) |= PEER_FLAG_COMPLETED;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  *(uint64_t*)(peer_dest) = *(uint64_t*)(peer);
 | 
			
		||||
@ -163,8 +163,10 @@ static size_t return_peers_all( ot_peerlist *peer_list, char *reply ) {
 | 
			
		||||
  for( bucket = 0; bucket<num_buckets; ++bucket ) {
 | 
			
		||||
    ot_peer * peers = (ot_peer*)bucket_list[bucket].data;
 | 
			
		||||
    size_t    peer_count = bucket_list[bucket].size;
 | 
			
		||||
    while( peer_count-- )
 | 
			
		||||
      memmove( r+=6, peers++, 6 );
 | 
			
		||||
    while( peer_count-- ) {
 | 
			
		||||
      WRITE32(r+=4,0,READ32(peers,0));
 | 
			
		||||
      WRITE16(r+=2,0,READ16(peers++,4));
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  return r - reply;
 | 
			
		||||
@ -194,6 +196,8 @@ static size_t return_peers_selection( ot_peerlist *peer_list, size_t amount, cha
 | 
			
		||||
  bucket_offset = random() % peer_list->peer_count;
 | 
			
		||||
 | 
			
		||||
  while( amount-- ) {
 | 
			
		||||
    ot_peer * peer;
 | 
			
		||||
 | 
			
		||||
    /* This is the aliased, non shifted range, next value may fall into */
 | 
			
		||||
    unsigned int diff = ( ( ( amount + 1 ) * shifted_step ) >> shift ) -
 | 
			
		||||
                        ( (   amount       * shifted_step ) >> shift );
 | 
			
		||||
@ -203,9 +207,9 @@ static size_t return_peers_selection( ot_peerlist *peer_list, size_t amount, cha
 | 
			
		||||
      bucket_offset -= bucket_list[bucket_index].size;
 | 
			
		||||
      bucket_index = ( bucket_index + 1 ) % num_buckets;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    memmove( r, ((ot_peer*)bucket_list[bucket_index].data) + bucket_offset, 6 );
 | 
			
		||||
    r += 6;
 | 
			
		||||
    peer = ((ot_peer*)bucket_list[bucket_index].data) + bucket_offset;
 | 
			
		||||
    WRITE32(r+=4,0,READ32(peer,0));
 | 
			
		||||
    WRITE16(r+=2,0,READ16(peer,4));
 | 
			
		||||
  }
 | 
			
		||||
  return r - reply;
 | 
			
		||||
}
 | 
			
		||||
@ -288,9 +292,11 @@ size_t return_tcp_scrape_for_torrent( ot_hash *hash_list, int amount, char *repl
 | 
			
		||||
      if( clean_single_torrent( torrent ) ) {
 | 
			
		||||
        vector_remove_torrent( torrents_list, torrent );
 | 
			
		||||
      } else {
 | 
			
		||||
        memmove( r, "20:", 3 ); memmove( r+3, hash, 20 );
 | 
			
		||||
        r += sprintf( r+23, "d8:completei%zde10:downloadedi%zde10:incompletei%zdee",
 | 
			
		||||
          torrent->peer_list->seed_count, torrent->peer_list->down_count, torrent->peer_list->peer_count-torrent->peer_list->seed_count ) + 23;
 | 
			
		||||
        int j;
 | 
			
		||||
        *r++='2';*r++='0';*r++=':';
 | 
			
		||||
        for(j=0;j<20;j+=4) WRITE32(r+=4,0,READ32(hash,i));
 | 
			
		||||
        r += sprintf( r, "d8:completei%zde10:downloadedi%zde10:incompletei%zdee",
 | 
			
		||||
          torrent->peer_list->seed_count, torrent->peer_list->down_count, torrent->peer_list->peer_count-torrent->peer_list->seed_count );
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
    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
 | 
			
		||||
 | 
			
		||||
#ifdef WANT_SYNC_LIVE
 | 
			
		||||
  if( proto != FLAG_MCA ) {
 | 
			
		||||
    OT_FLAG( peer ) |= PEER_FLAG_STOPPED;
 | 
			
		||||
    OT_PEERFLAG( peer ) |= PEER_FLAG_STOPPED;
 | 
			
		||||
    livesync_tell( hash, peer );
 | 
			
		||||
  }
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
@ -11,6 +11,15 @@
 | 
			
		||||
#include <time.h>
 | 
			
		||||
#include <stdint.h>
 | 
			
		||||
 | 
			
		||||
/* Libowfat */
 | 
			
		||||
#include <uint16.h>
 | 
			
		||||
#include <uint32.h>
 | 
			
		||||
 | 
			
		||||
#define READ16(addr,offs)      ((int16_t)uint16_read((offs)+(uint8_t*)(addr)))
 | 
			
		||||
#define READ32(addr,offs)      ((int32_t)uint32_read((offs)+(uint8_t*)(addr)))
 | 
			
		||||
#define WRITE16(addr,offs,val) uint16_pack((offs)+(uint8_t*)(addr),(val))
 | 
			
		||||
#define WRITE32(addr,offs,val) uint32_pack((offs)+(uint8_t*)(addr),(val))
 | 
			
		||||
 | 
			
		||||
typedef uint8_t        ot_hash[20];
 | 
			
		||||
typedef time_t         ot_time;
 | 
			
		||||
 | 
			
		||||
@ -55,10 +64,10 @@ static const uint8_t PEER_FLAG_STOPPED   = 0x20;
 | 
			
		||||
static const uint8_t PEER_FLAG_FROM_SYNC = 0x10;
 | 
			
		||||
static const uint8_t PEER_FLAG_LEECHING  = 0x00;
 | 
			
		||||
 | 
			
		||||
#define OT_SETIP( peer, ip ) memmove((peer),(ip),4);
 | 
			
		||||
#define OT_SETPORT( peer, port ) memmove(((uint8_t*)peer)+4,(port),2);
 | 
			
		||||
#define OT_FLAG(peer) (((uint8_t*)(peer))[6])
 | 
			
		||||
#define OT_PEERTIME(peer) (((uint8_t*)(peer))[7])
 | 
			
		||||
#define OT_SETIP(peer,ip)     WRITE32((peer),0,READ32((ip),0))
 | 
			
		||||
#define OT_SETPORT(peer,port) WRITE16((peer),4,READ16((port),0))
 | 
			
		||||
#define OT_PEERFLAG(peer)     (((uint8_t*)(peer))[6])
 | 
			
		||||
#define OT_PEERTIME(peer)     (((uint8_t*)(peer))[7])
 | 
			
		||||
 | 
			
		||||
#define OT_PEER_COMPARE_SIZE ((size_t)6)
 | 
			
		||||
#define OT_HASH_COMPARE_SIZE (sizeof(ot_hash))
 | 
			
		||||
 | 
			
		||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user