Changeset 39


Ignore:
Timestamp:
Jan 22, 2006, 12:58:18 AM (15 years ago)
Author:
joshe
Message:

Add some untested code to change update the tracker when the listening port changes.
Add some temporary debug code for changing the port.

Location:
branches/oneport/libtransmission
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • branches/oneport/libtransmission/tracker.c

    r26 r39  
    5252
    5353    int            bindPort;
     54    int            newPort;
    5455};
    5556
     
    7576
    7677    tc->bindPort = h->bindPort;
     78    tc->newPort  = -1;
    7779
    7880    return tc;
     
    9092
    9193    /* Do we need to send an event? */
    92     if( tc->started || tc->completed || tc->stopped )
     94    if( tc->started || tc->completed || tc->stopped || 0 < tc->newPort )
    9395    {
    9496        return 1;
     
    124126void tr_trackerChangePort( tr_tracker_t * tc, int port )
    125127{
    126     /* XXX this doesn't always work, should send stopped then started events */
    127     tc->bindPort = port;
     128    tc->newPort = port;
    128129}
    129130
     
    161162                ( tc->completed ? "sending 'completed'" :
    162163                  ( tc->stopped ? "sending 'stopped'" :
    163                     "getting peers" ) ) );
     164                    ( 0 < tc->newPort ? "sending 'stopped' to change port" :
     165                      "getting peers" ) ) ) );
    164166
    165167        tc->status  = TC_STATUS_CONNECT;
     
    247249    int        ret;
    248250
     251    if( tc->started && 0 < tc->newPort )
     252    {
     253        tc->bindPort = tc->newPort;
     254        tc->newPort = -1;
     255    }
     256
    249257    if( tc->started )
    250258        event = "&event=started";
    251259    else if( tc->completed )
    252260        event = "&event=completed";
    253     else if( tc->stopped )
     261    else if( tc->stopped || 0 < tc->newPort )
    254262        event = "&event=stopped";
    255263    else
     
    351359    if( i >= tc->pos - 18 )
    352360    {
    353         tr_err( "Tracker: no dictionary in answer" );
     361        tr_err( "Tracker: no dictionary in answer (%s)",
     362                tc->tor->info.trackerAddress );
    354363        // printf( "%s\n", tc->buf );
    355364        return;
     
    480489        tc->stopped = 0;
    481490    }
     491    else if( 0 < tc->newPort )
     492    {
     493        tc->started = 1;
     494    }
    482495
    483496cleanup:
  • branches/oneport/libtransmission/transmission.c

    r26 r39  
    3333static void acceptStop( tr_handle_t * h );
    3434
     35#define PORT_DEBUG
     36
    3537/***********************************************************************
    3638 * tr_init
     
    128130    }
    129131
     132#ifndef PORT_DEBUG
    130133    if( h->bindSocket > -1 )
    131134    {
     
    133136        tr_fdSocketClosed( h->fdlimit, 0 );
    134137    }
     138#endif
    135139
    136140    h->bindSocket = sock;
     
    627631    int           ii, jj;
    628632    uint8_t     * hash;
     633#ifdef PORT_DEBUG
     634    int           oldsocket;
     635    int           oldPeerCount;
     636    tr_peer_t   * oldPeers[TR_MAX_PEER_COUNT];
     637#endif
    629638
    630639    tr_dbg( "Accept thread started" );
     
    638647    tr_lockLock( &h->acceptLock );
    639648
     649#ifdef PORT_DEBUG
     650    oldsocket = h->bindSocket;
     651#endif
     652
    640653    while( !h->acceptDie )
    641654    {
     
    665678            if( tr_peerRead( NULL, h->acceptPeers[ii] ) )
    666679            {
     680                printf( "failed to read from peer on new port\n" );
    667681                tr_peerDestroy( h->fdlimit, h->acceptPeers[ii] );
    668682                goto removePeer;
     
    676690                                     SHA_DIGEST_LENGTH ) )
    677691                    {
    678                       tr_peerAttach( h->torrents[jj], h->acceptPeers[ii] );
    679                       tr_lockUnlock( &h->torrents[jj]->lock );
    680                       goto removePeer;
     692                        printf( "got peer on new port for \"%s\"\n",
     693                                h->torrents[jj]->info.name );
     694                        tr_peerAttach( h->torrents[jj], h->acceptPeers[ii] );
     695                        tr_lockUnlock( &h->torrents[jj]->lock );
     696                        goto removePeer;
    681697                    }
    682698                    tr_lockUnlock( &h->torrents[jj]->lock );
    683699                }
     700                printf( "failed to match hash for peer on new port\n" );
    684701                tr_peerDestroy( h->fdlimit, h->acceptPeers[ii] );
    685702                goto removePeer;
     
    693710        }
    694711
     712#ifdef PORT_DEBUG
     713        /* Check for incoming connections */
     714        if( oldsocket > -1 &&
     715            oldPeerCount < TR_MAX_PEER_COUNT &&
     716            !tr_fdSocketWillCreate( h->fdlimit, 0 ) )
     717        {
     718            int            s;
     719            struct in_addr addr;
     720            in_port_t      port;
     721            s = tr_netAccept( oldsocket, &addr, &port );
     722            if( s > -1 )
     723            {
     724                oldPeers[oldPeerCount++] = tr_peerInit( addr, port, s );
     725            }
     726            else
     727            {
     728                tr_fdSocketClosed( h->fdlimit, 0 );
     729            }
     730        }
     731
     732        for( ii = 0; ii < oldPeerCount; )
     733        {
     734            if( tr_peerRead( NULL, oldPeers[ii] ) )
     735            {
     736                printf( "failed to read from peer on old port\n" );
     737                tr_peerDestroy( h->fdlimit, oldPeers[ii] );
     738                goto removeOldPeer;
     739            }
     740            if( NULL != ( hash = tr_peerHash( oldPeers[ii] ) ) )
     741            {
     742                for( jj = 0; jj < h->torrentCount; jj++ )
     743                {
     744                    tr_lockLock( &h->torrents[jj]->lock );
     745                    if( 0 == memcmp( h->torrents[jj]->info.hash, hash,
     746                                     SHA_DIGEST_LENGTH ) )
     747                    {
     748                        printf( "got peer on old port for \"%s\"\n",
     749                                h->torrents[jj]->info.name );
     750                        tr_lockUnlock( &h->torrents[jj]->lock );
     751                        goto removeOldPeer;
     752                    }
     753                    tr_lockUnlock( &h->torrents[jj]->lock );
     754                }
     755                printf( "failed to match hash for peer on old port\n" );
     756                tr_peerDestroy( h->fdlimit, oldPeers[ii] );
     757                goto removeOldPeer;
     758            }
     759            ii++;
     760            continue;
     761           removeOldPeer:
     762            oldPeerCount--;
     763            memmove( &oldPeers[ii], &oldPeers[ii+1],
     764                     ( oldPeerCount - ii ) * sizeof( tr_peer_t * ) );
     765        }
     766#endif
     767
    695768        /* Wait up to 20 ms */
    696769        date2 = tr_date();
Note: See TracChangeset for help on using the changeset viewer.