1
0
Fork 0
mirror of https://github.com/transmission/transmission synced 2025-02-13 01:44:40 +00:00

(trunk libT) #1993: Check if UPNP port is still open. Patch from KyleK

This commit is contained in:
Charles Kerr 2009-04-22 16:00:45 +00:00
parent 919ab072ec
commit 577edddaea
3 changed files with 45 additions and 9 deletions

View file

@ -44,6 +44,7 @@ struct tr_shared
tr_port publicPort;
tr_timer * pulseTimer;
tr_timer * recheckTimer;
tr_upnp * upnp;
tr_natpmp * natpmp;
@ -83,7 +84,7 @@ getNatStateStr( int state )
}
static void
natPulse( tr_shared * s )
natPulse( tr_shared * s, tr_bool doPortCheck )
{
const tr_port port = s->publicPort;
const int isEnabled = s->isEnabled && !s->isShuttingDown;
@ -92,7 +93,7 @@ natPulse( tr_shared * s )
oldStatus = tr_sharedTraversalStatus( s );
s->natpmpStatus = tr_natpmpPulse( s->natpmp, port, isEnabled );
s->upnpStatus = tr_upnpPulse( s->upnp, port, isEnabled );
s->upnpStatus = tr_upnpPulse( s->upnp, port, isEnabled, doPortCheck );
newStatus = tr_sharedTraversalStatus( s );
if( newStatus != oldStatus )
@ -186,10 +187,10 @@ incomingPeersPulse( tr_shared * s )
static int
sharedPulse( void * vshared )
{
tr_bool keepPulsing = 1;
tr_bool keepPulsing = TRUE;
tr_shared * shared = vshared;
natPulse( shared );
natPulse( shared, FALSE );
if( !shared->isShuttingDown )
{
@ -199,18 +200,34 @@ sharedPulse( void * vshared )
{
tr_ninf( getKey( ), _( "Stopped" ) );
tr_timerFree( &shared->pulseTimer );
tr_timerFree( &shared->recheckTimer );
tr_socketListForEach( shared->bindSockets, &closeCb, shared );
tr_socketListFree( shared->bindSockets );
tr_natpmpClose( shared->natpmp );
tr_upnpClose( shared->upnp );
shared->session->shared = NULL;
tr_free( shared );
keepPulsing = 0;
keepPulsing = FALSE;
}
return keepPulsing;
}
static int
recheckPulse( void * vshared )
{
tr_bool keepPulsing = TRUE;
tr_shared * shared = vshared;
tr_ninf( getKey( ), _( "Checking to see if port %d is still open" ), shared->publicPort );
natPulse( shared, TRUE );
if( shared->isShuttingDown )
keepPulsing = FALSE;
return keepPulsing;
}
/***
****
***/
@ -225,12 +242,12 @@ tr_sharedInit( tr_session * session,
s->session = session;
s->publicPort = publicPort;
s->shouldChange = TRUE;
s->bindSockets = socks;
s->shouldChange = TRUE;
s->natpmp = tr_natpmpInit( );
s->upnp = tr_upnpInit( );
s->pulseTimer = tr_timerNew( session, sharedPulse, s, 1000 );
s->recheckTimer = tr_timerNew( session, recheckPulse, s, 1000*60*20 ); /* 20 minutes */
s->isEnabled = isEnabled;
s->upnpStatus = TR_PORT_UNMAPPED;
s->natpmpStatus = TR_PORT_UNMAPPED;

View file

@ -80,7 +80,8 @@ tr_upnpClose( tr_upnp * handle )
int
tr_upnpPulse( tr_upnp * handle,
int port,
int isEnabled )
int isEnabled,
int doPortCheck )
{
int ret;
@ -127,6 +128,24 @@ tr_upnpPulse( tr_upnp * handle,
handle->state = TR_UPNP_UNMAP;
}
if( isEnabled && handle->isMapped && doPortCheck )
{
char portStr[8];
char intPort[8];
char intClient[16];
int i;
tr_snprintf( portStr, sizeof( portStr ), "%d", handle->port );
i = UPNP_GetSpecificPortMappingEntry( handle->urls.controlURL,
handle->data.servicetype, portStr,
"TCP", intClient, intPort );
if( i != UPNPCOMMAND_SUCCESS )
{
tr_ninf( getKey( ), _( "Port %d isn't forwarded" ), handle->port );
handle->isMapped = FALSE;
}
}
if( handle->state == TR_UPNP_UNMAP )
{
char portStr[16];

View file

@ -25,6 +25,6 @@ void tr_upnpClose( tr_upnp * );
int tr_upnpPulse( tr_upnp *,
int port,
int isEnabled );
int isEnabled,
int doPortCheck );
#endif