diff options
| -rw-r--r-- | proxy.c | 53 |
1 files changed, 33 insertions, 20 deletions
| @@ -380,22 +380,27 @@ static void handle_read( int64 peersocket ) { | |||
| 380 | 380 | ||
| 381 | /* The new connection is good, send our tracker_id on incoming connections */ | 381 | /* The new connection is good, send our tracker_id on incoming connections */ |
| 382 | if( peer->state == FLAG_CONNECTING ) | 382 | if( peer->state == FLAG_CONNECTING ) |
| 383 | io_trywrite( peersocket, (void*)&g_tracker_id, sizeof( g_tracker_id ) ); | 383 | if( io_trywrite( peersocket, (void*)&g_tracker_id, sizeof( g_tracker_id ) ) != sizeof( g_tracker_id ) ) |
| 384 | goto close_socket; | ||
| 384 | 385 | ||
| 385 | peer->tracker_id = tracker_id; | 386 | peer->tracker_id = tracker_id; |
| 386 | PROXYPEER_SETCONNECTED( peer->state ); | 387 | PROXYPEER_SETCONNECTED( peer->state ); |
| 387 | 388 | ||
| 388 | fprintf( stderr, "Incoming connection successful.\n" ); | 389 | if( peer->state & FLAG_OUTGOING ) |
| 390 | fprintf( stderr, "succeeded.\n" ); | ||
| 391 | else | ||
| 392 | fprintf( stderr, "Incoming connection successful.\n" ); | ||
| 389 | 393 | ||
| 390 | break; | 394 | break; |
| 391 | close_socket: | 395 | close_socket: |
| 396 | fprintf( stderr, "Handshake incomplete, closing socket\n" ); | ||
| 392 | io_close( peersocket ); | 397 | io_close( peersocket ); |
| 393 | reset_info_block( peer ); | 398 | reset_info_block( peer ); |
| 394 | break; | 399 | break; |
| 395 | case FLAG_CONNECTED: | 400 | case FLAG_CONNECTED: |
| 396 | /* Here we acutally expect data from peer | 401 | /* Here we acutally expect data from peer |
| 397 | indata_length should be less than 20+256*7 bytes, for incomplete torrent entries */ | 402 | indata_length should be less than 20+256*7 bytes, for incomplete torrent entries */ |
| 398 | datalen = io_tryread( peersocket, (void*)(peer->indata + peer->indata_length), sizeof( peer->indata ) - peer->indata_length ); | 403 | datalen = io_tryread( peersocket, (void*)(peer->indata + peer->indata_length), sizeof( peer->indata ) - peer->indata_length ); |
| 399 | if( !datalen || datalen < -1 ) { | 404 | if( !datalen || datalen < -1 ) { |
| 400 | fprintf( stderr, "Connection closed by remote peer.\n" ); | 405 | fprintf( stderr, "Connection closed by remote peer.\n" ); |
| 401 | io_close( peersocket ); | 406 | io_close( peersocket ); |
| @@ -432,12 +437,15 @@ static void handle_write( int64 peersocket ) { | |||
| 432 | break; | 437 | break; |
| 433 | } | 438 | } |
| 434 | 439 | ||
| 435 | io_trywrite( peersocket, (void*)&g_tracker_id, sizeof( g_tracker_id ) ); | 440 | if( io_trywrite( peersocket, (void*)&g_tracker_id, sizeof( g_tracker_id ) ) == sizeof( g_tracker_id ) ) { |
| 436 | PROXYPEER_SETWAITTRACKERID( peer->state ); | 441 | PROXYPEER_SETWAITTRACKERID( peer->state ); |
| 437 | fprintf( stderr, " succeeded.\n" ); | 442 | io_dontwantwrite( peersocket ); |
| 438 | 443 | io_wantread( peersocket ); | |
| 439 | io_dontwantwrite( peersocket ); | 444 | } else { |
| 440 | io_wantread( peersocket ); | 445 | fprintf( stderr, "Handshake incomplete, closing socket\n" ); |
| 446 | io_close( peersocket ); | ||
| 447 | reset_info_block( peer ); | ||
| 448 | } | ||
| 441 | break; | 449 | break; |
| 442 | case FLAG_CONNECTED: | 450 | case FLAG_CONNECTED: |
| 443 | switch( iob_send( peersocket, &peer->outdata ) ) { | 451 | switch( iob_send( peersocket, &peer->outdata ) ) { |
| @@ -612,7 +620,7 @@ static void * streamsync_worker( void * args ) { | |||
| 612 | } | 620 | } |
| 613 | 621 | ||
| 614 | /* Maximal memory requirement: max 3 blocks, max torrents * 20 + max peers * 7 */ | 622 | /* Maximal memory requirement: max 3 blocks, max torrents * 20 + max peers * 7 */ |
| 615 | mem = 3 * ( 4 + 1 + 1 + 2 ) + ( count_one + count_two ) * 19 + count_def * ( 19 + 8 ) + | 623 | mem = 3 * ( 4 + 1 + 1 + 2 ) + ( count_one + count_two ) * ( 19 + 1 ) + count_def * ( 19 + 8 ) + |
| 616 | ( count_one + 2 * count_two + count_peers ) * 7; | 624 | ( count_one + 2 * count_two + count_peers ) * 7; |
| 617 | 625 | ||
| 618 | fprintf( stderr, "Mem: %zd\n", mem ); | 626 | fprintf( stderr, "Mem: %zd\n", mem ); |
| @@ -630,7 +638,7 @@ static void * streamsync_worker( void * args ) { | |||
| 630 | ptr_a[7] = count_one & 255; | 638 | ptr_a[7] = count_one & 255; |
| 631 | ptr_a += 8; | 639 | ptr_a += 8; |
| 632 | } else | 640 | } else |
| 633 | count_def += count_one; | 641 | count_def += count_one; |
| 634 | 642 | ||
| 635 | if( count_two > 8 || !count_def ) { | 643 | if( count_two > 8 || !count_def ) { |
| 636 | mem_b = 4 + 1 + 1 + 2 + count_two * ( 19 + 14 ); | 644 | mem_b = 4 + 1 + 1 + 2 + count_two * ( 19 + 14 ); |
| @@ -642,7 +650,7 @@ static void * streamsync_worker( void * args ) { | |||
| 642 | ptr_b[7] = count_two & 255; | 650 | ptr_b[7] = count_two & 255; |
| 643 | ptr_b += 8; | 651 | ptr_b += 8; |
| 644 | } else | 652 | } else |
| 645 | count_def += count_two; | 653 | count_def += count_two; |
| 646 | 654 | ||
| 647 | if( count_def ) { | 655 | if( count_def ) { |
| 648 | memcpy( ptr_c, &g_tracker_id, sizeof(g_tracker_id)); /* Offset 0: the tracker ID */ | 656 | memcpy( ptr_c, &g_tracker_id, sizeof(g_tracker_id)); /* Offset 0: the tracker ID */ |
| @@ -740,22 +748,23 @@ void livesync_ticker( ) { | |||
| 740 | } | 748 | } |
| 741 | 749 | ||
| 742 | static void livesync_proxytell( uint8_t prefix, uint8_t *info_hash, uint8_t *peer ) { | 750 | static void livesync_proxytell( uint8_t prefix, uint8_t *info_hash, uint8_t *peer ) { |
| 743 | unsigned int i; | 751 | // unsigned int i; |
| 744 | 752 | ||
| 745 | *g_peerbuffer_pos = prefix; | 753 | *g_peerbuffer_pos = prefix; |
| 746 | memcpy( g_peerbuffer_pos + 1, info_hash, sizeof(ot_hash) - 1 ); | 754 | memcpy( g_peerbuffer_pos + 1, info_hash, sizeof(ot_hash) - 1 ); |
| 747 | memcpy( g_peerbuffer_pos + sizeof(ot_hash), peer, sizeof(ot_peer) - 1 ); | 755 | memcpy( g_peerbuffer_pos + sizeof(ot_hash), peer, sizeof(ot_peer) - 1 ); |
| 748 | 756 | ||
| 757 | #if 0 | ||
| 749 | /* Dump info_hash */ | 758 | /* Dump info_hash */ |
| 750 | for( i=0; i<sizeof(ot_hash); ++i ) | 759 | for( i=0; i<sizeof(ot_hash); ++i ) |
| 751 | printf( "%02X", g_peerbuffer_pos[i] ); | 760 | printf( "%02X", g_peerbuffer_pos[i] ); |
| 752 | putchar( ':' ); | 761 | putchar( ':' ); |
| 753 | 762 | #endif | |
| 754 | g_peerbuffer_pos += sizeof(ot_hash); | 763 | g_peerbuffer_pos += sizeof(ot_hash); |
| 755 | 764 | #if 0 | |
| 756 | printf( "%hhu.%hhu.%hhu.%hhu:%hu (%02X %02X)\n", g_peerbuffer_pos[0], g_peerbuffer_pos[1], g_peerbuffer_pos[2], g_peerbuffer_pos[3], | 765 | printf( "%hhu.%hhu.%hhu.%hhu:%hu (%02X %02X)\n", g_peerbuffer_pos[0], g_peerbuffer_pos[1], g_peerbuffer_pos[2], g_peerbuffer_pos[3], |
| 757 | g_peerbuffer_pos[4] | ( g_peerbuffer_pos[5] << 8 ), g_peerbuffer_pos[6], g_peerbuffer_pos[7] ); | 766 | g_peerbuffer_pos[4] | ( g_peerbuffer_pos[5] << 8 ), g_peerbuffer_pos[6], g_peerbuffer_pos[7] ); |
| 758 | 767 | #endif | |
| 759 | g_peerbuffer_pos += sizeof(ot_peer); | 768 | g_peerbuffer_pos += sizeof(ot_peer); |
| 760 | 769 | ||
| 761 | if( g_peerbuffer_pos >= g_peerbuffer_highwater ) | 770 | if( g_peerbuffer_pos >= g_peerbuffer_highwater ) |
| @@ -794,10 +803,14 @@ printf( "type: %hhu, prefix: %02X, torrentcount: %zd\n", peer->packet_type, peer | |||
| 794 | do peers |= ( 0x7f & *data ) << ( 7 * shift ); | 803 | do peers |= ( 0x7f & *data ) << ( 7 * shift ); |
| 795 | while ( *(data++) & 0x80 && shift++ < 6 ); | 804 | while ( *(data++) & 0x80 && shift++ < 6 ); |
| 796 | } | 805 | } |
| 797 | 806 | #if 0 | |
| 807 | printf( "peers: %zd\n", peers ); | ||
| 808 | #endif | ||
| 798 | /* Ensure enough data being read to hold all peers */ | 809 | /* Ensure enough data being read to hold all peers */ |
| 799 | if( data + (OT_IP_SIZE + 3) * peers > dataend ) break; | 810 | if( data + (OT_IP_SIZE + 3) * peers > dataend ) { |
| 800 | 811 | data = hash; | |
| 812 | break; | ||
| 813 | } | ||
| 801 | while( peers-- ) { | 814 | while( peers-- ) { |
| 802 | livesync_proxytell( peer->packet_tprefix, hash, data ); | 815 | livesync_proxytell( peer->packet_tprefix, hash, data ); |
| 803 | data += OT_IP_SIZE + 3; | 816 | data += OT_IP_SIZE + 3; |
