session->bandwidth = tr_bandwidthNew( session, NULL );
session->lock = tr_lockNew( );
session->tag = tr_strdup( tag );
+ session->magicNumber = SESSION_MAGIC_NUMBER;
+
dbgmsg( "tr_sessionInit: the session's top-level bandwidth object is %p", session->bandwidth );
tr_bencInitDict( &settings, 0 );
tr_sessionInitImpl( void * vsession )
{
tr_session * session = vsession;
+
+ assert( tr_isSession( session ) );
/* first %s is the application name
second %s is the version number */
void
tr_sessionSetDownloadDir( tr_session * session, const char * dir )
{
+ assert( tr_isSession( session ) );
+
if( session->downloadDir != dir )
{
tr_free( session->downloadDir );
const char *
tr_sessionGetDownloadDir( const tr_session * session )
{
+ assert( tr_isSession( session ) );
+
return session->downloadDir;
}
void
tr_globalLock( tr_session * session )
{
+ assert( tr_isSession( session ) );
+
tr_lockLock( session->lock );
}
void
tr_globalUnlock( tr_session * session )
{
+ assert( tr_isSession( session ) );
+
tr_lockUnlock( session->lock );
}
tr_bool
tr_globalIsLocked( const tr_session * session )
{
- return session && tr_lockHave( session->lock );
+ return tr_isSession( session ) && tr_lockHave( session->lock );
}
/***********************************************************************
static void
setPortImpl( tr_session * session, tr_port port )
{
- struct bind_port_data * data = tr_new( struct bind_port_data, 1 );
+ struct bind_port_data * data;
+
+ assert( tr_isSession( session ) );
+
+ data = tr_new( struct bind_port_data, 1 );
data->session = session;
data->port = port;
tr_runInEventThread( session, tr_setBindPortImpl, data );
tr_sessionSetPeerPort( tr_session * session,
tr_port port )
{
+ assert( tr_isSession( session ) );
+
session->isPortRandom = FALSE;
session->peerPort = port;
setPortImpl( session, session->peerPort );
tr_port
tr_sessionSetPeerPortRandom( tr_session * session )
{
+ assert( tr_isSession( session ) );
+
session->isPortRandom = TRUE;
session->peerPort = getRandomPort( session );
setPortImpl( session, session->peerPort );
tr_port
tr_sessionGetPeerPort( const tr_session * session )
{
- assert( session );
+ assert( tr_isSession( session ) );
return session->peerPort;
}
tr_port_forwarding
tr_sessionGetPortForwarding( const tr_session * session )
{
+ assert( tr_isSession( session ) );
+
return tr_sharedTraversalStatus( session->shared );
}
static void
updateBandwidth( tr_session * session, tr_direction dir )
{
- const tr_bool zeroCase = session->speedLimit[dir] < 1 && session->isSpeedLimited[dir];
+ tr_bool zeroCase;
+
+ assert( tr_isSession( session ) );
+
+ zeroCase = session->speedLimit[dir] < 1 && session->isSpeedLimited[dir];
tr_bandwidthSetLimited( session->bandwidth, dir, session->isSpeedLimited[dir] && !zeroCase );
tr_direction dir,
tr_bool isLimited )
{
- assert( session );
+ assert( tr_isSession( session ) );
assert( tr_isDirection( dir ) );
session->isSpeedLimited[dir] = isLimited;
tr_direction dir,
int desiredSpeed )
{
- assert( session );
+ assert( tr_isSession( session ) );
assert( tr_isDirection( dir ) );
session->speedLimit[dir] = desiredSpeed;
tr_sessionIsSpeedLimitEnabled( const tr_session * session,
tr_direction dir )
{
- assert( session );
+ assert( tr_isSession( session ) );
assert( tr_isDirection( dir ) );
return session->isSpeedLimited[dir];
tr_sessionGetSpeedLimit( const tr_session * session,
tr_direction dir )
{
- assert( session );
+ assert( tr_isSession( session ) );
assert( tr_isDirection( dir ) );
return session->speedLimit[dir];
***/
void
-tr_sessionSetPeerLimit( tr_session * session UNUSED,
+tr_sessionSetPeerLimit( tr_session * session,
uint16_t maxGlobalPeers )
{
+ assert( tr_isSession( session ) );
+
tr_fdSetPeerLimit( maxGlobalPeers );
}
uint16_t
-tr_sessionGetPeerLimit( const tr_session * session UNUSED )
+tr_sessionGetPeerLimit( const tr_session * session )
{
+ assert( tr_isSession( session ) );
+
return tr_fdGetPeerLimit( );
}
void
tr_sessionSetPeerLimitPerTorrent( tr_session * session, uint16_t n )
{
+ assert( tr_isSession( session ) );
+
session->peerLimitPerTorrent = n;
}
uint16_t
tr_sessionGetPeerLimitPerTorrent( const tr_session * session )
{
+ assert( tr_isSession( session ) );
+
return session->peerLimitPerTorrent;
}
double
tr_sessionGetPieceSpeed( const tr_session * session, tr_direction dir )
{
- return session ? tr_bandwidthGetPieceSpeed( session->bandwidth, 0, dir ) : 0.0;
+ return tr_isSession( session ) ? tr_bandwidthGetPieceSpeed( session->bandwidth, 0, dir ) : 0.0;
}
double
tr_sessionGetRawSpeed( const tr_session * session, tr_direction dir )
{
- return session ? tr_bandwidthGetPieceSpeed( session->bandwidth, 0, dir ) : 0.0;
+ return tr_isSession( session ) ? tr_bandwidthGetPieceSpeed( session->bandwidth, 0, dir ) : 0.0;
}
int
tr_sessionCountTorrents( const tr_session * session )
{
- return session->torrentCount;
+ return tr_isSession( session ) ? session->torrentCount : 0;
}
static int
int i, n;
tr_torrent ** torrents;
+ assert( tr_isSession( session ) );
+
tr_statsClose( session );
tr_sharedShuttingDown( session->shared );
tr_rpcClose( &session->rpcServer );
const int maxwait_msec = SHUTDOWN_MAX_SECONDS * 1000;
const uint64_t deadline = tr_date( ) + maxwait_msec;
+ assert( tr_isSession( session ) );
+
dbgmsg( "shutting down transmission session %p", session );
/* close the session */
tr_torrent ** torrents;
tr_list * l = NULL, *list = NULL;
+ assert( tr_isSession( session ) );
+
tr_ctorSetSave( ctor, FALSE ); /* since we already have them */
if( !stat( dirname, &sb )
tr_sessionSetPexEnabled( tr_session * session,
tr_bool enabled )
{
+ assert( tr_isSession( session ) );
+
session->isPexEnabled = enabled != 0;
}
tr_bool
tr_sessionIsPexEnabled( const tr_session * session )
{
+ assert( tr_isSession( session ) );
+
return session->isPexEnabled;
}
tr_sessionSetLazyBitfieldEnabled( tr_session * session,
tr_bool enabled )
{
+ assert( tr_isSession( session ) );
+
session->useLazyBitfield = enabled != 0;
}
tr_bool
tr_sessionIsLazyBitfieldEnabled( const tr_session * session )
{
+ assert( tr_isSession( session ) );
+
return session->useLazyBitfield;
}
tr_sessionSetPortForwardingEnabled( tr_session * session,
tr_bool enabled )
{
+ assert( tr_isSession( session ) );
+
tr_globalLock( session );
tr_sharedTraversalEnable( session->shared, enabled );
tr_globalUnlock( session );
tr_bool
tr_sessionIsPortForwardingEnabled( const tr_session * session )
{
+ assert( tr_isSession( session ) );
+
return tr_sharedTraversalIsEnabled( session->shared );
}
int n = 0;
tr_list * l;
+ assert( tr_isSession( session ) );
+
for( l = session->blocklists; l; l = l->next )
n += _tr_blocklistGetRuleCount( l->data );
return n;
tr_bool
tr_blocklistIsEnabled( const tr_session * session )
{
+ assert( tr_isSession( session ) );
+
return session->isBlocklistEnabled;
}
{
tr_list * l;
+ assert( tr_isSession( session ) );
+
session->isBlocklistEnabled = isEnabled != 0;
for( l=session->blocklists; l!=NULL; l=l->next )
tr_bool
tr_blocklistExists( const tr_session * session )
{
+ assert( tr_isSession( session ) );
+
return session->blocklists != NULL;
}
tr_blocklist * b;
const char * defaultName = "level1.bin";
+ assert( tr_isSession( session ) );
+
for( b = NULL, l = session->blocklists; !b && l; l = l->next )
if( tr_stringEndsWith( _tr_blocklistGetFilename( l->data ),
defaultName ) )
{
tr_list * l;
+ assert( tr_isSession( session ) );
+
for( l = session->blocklists; l; l = l->next )
if( _tr_blocklistHasAddress( l->data, addr ) )
return TRUE;
***/
static int
-compareLookupEntries( const void * va,
- const void * vb )
+compareLookupEntries( const void * va, const void * vb )
{
const struct tr_metainfo_lookup * a = va;
const struct tr_metainfo_lookup * b = vb;
static void
metainfoLookupResort( tr_session * session )
{
+ assert( tr_isSession( session ) );
+
qsort( session->metainfoLookup,
session->metainfoLookupCount,
sizeof( struct tr_metainfo_lookup ),
}
static int
-compareHashStringToLookupEntry( const void * va,
- const void * vb )
+compareHashStringToLookupEntry( const void * va, const void * vb )
{
const char * a = va;
const struct tr_metainfo_lookup * b = vb;
tr_ctor * ctor = NULL;
tr_list * list = NULL;
+ assert( tr_isSession( session ) );
+
/* walk through the directory and find the mappings */
ctor = tr_ctorNew( session );
tr_ctorSetSave( ctor, FALSE ); /* since we already have them */
tr_torrentNext( tr_session * session,
tr_torrent * tor )
{
+ assert( tr_isSession( session ) );
+
return tor ? tor->next : session->torrentList;
}
tr_sessionSetRPCEnabled( tr_session * session,
tr_bool isEnabled )
{
+ assert( tr_isSession( session ) );
+
tr_rpcSetEnabled( session->rpcServer, isEnabled );
}
tr_bool
tr_sessionIsRPCEnabled( const tr_session * session )
{
+ assert( tr_isSession( session ) );
+
return tr_rpcIsEnabled( session->rpcServer );
}
tr_sessionSetRPCPort( tr_session * session,
tr_port port )
{
+ assert( tr_isSession( session ) );
+
tr_rpcSetPort( session->rpcServer, port );
}
tr_port
tr_sessionGetRPCPort( const tr_session * session )
{
+ assert( tr_isSession( session ) );
+
return tr_rpcGetPort( session->rpcServer );
}
tr_rpc_func func,
void * user_data )
{
+ assert( tr_isSession( session ) );
+
session->rpc_func = func;
session->rpc_func_user_data = user_data;
}
tr_sessionSetRPCWhitelist( tr_session * session,
const char * whitelist )
{
+ assert( tr_isSession( session ) );
+
tr_rpcSetWhitelist( session->rpcServer, whitelist );
}
char*
tr_sessionGetRPCWhitelist( const tr_session * session )
{
+ assert( tr_isSession( session ) );
+
return tr_rpcGetWhitelist( session->rpcServer );
}
tr_sessionSetRPCWhitelistEnabled( tr_session * session,
tr_bool isEnabled )
{
+ assert( tr_isSession( session ) );
+
tr_rpcSetWhitelistEnabled( session->rpcServer, isEnabled );
}
tr_bool
tr_sessionGetRPCWhitelistEnabled( const tr_session * session )
{
+ assert( tr_isSession( session ) );
+
return tr_rpcGetWhitelistEnabled( session->rpcServer );
}
tr_sessionSetRPCPassword( tr_session * session,
const char * password )
{
+ assert( tr_isSession( session ) );
+
tr_rpcSetPassword( session->rpcServer, password );
}
char*
tr_sessionGetRPCPassword( const tr_session * session )
{
+ assert( tr_isSession( session ) );
+
return tr_rpcGetPassword( session->rpcServer );
}
tr_sessionSetRPCUsername( tr_session * session,
const char * username )
{
+ assert( tr_isSession( session ) );
+
tr_rpcSetUsername( session->rpcServer, username );
}
char*
tr_sessionGetRPCUsername( const tr_session * session )
{
+ assert( tr_isSession( session ) );
+
return tr_rpcGetUsername( session->rpcServer );
}
tr_sessionSetRPCPasswordEnabled( tr_session * session,
tr_bool isEnabled )
{
+ assert( tr_isSession( session ) );
+
tr_rpcSetPasswordEnabled( session->rpcServer, isEnabled );
}
tr_bool
tr_sessionIsRPCPasswordEnabled( const tr_session * session )
{
+ assert( tr_isSession( session ) );
+
return tr_rpcIsPasswordEnabled( session->rpcServer );
}
tr_bool
tr_sessionIsProxyEnabled( const tr_session * session )
{
+ assert( tr_isSession( session ) );
+
return session->isProxyEnabled;
}
tr_sessionSetProxyEnabled( tr_session * session,
tr_bool isEnabled )
{
+ assert( tr_isSession( session ) );
+
session->isProxyEnabled = isEnabled != 0;
}
tr_proxy_type
tr_sessionGetProxyType( const tr_session * session )
{
+ assert( tr_isSession( session ) );
+
return session->proxyType;
}
tr_sessionSetProxyType( tr_session * session,
tr_proxy_type type )
{
+ assert( tr_isSession( session ) );
+
session->proxyType = type;
}
const char*
tr_sessionGetProxy( const tr_session * session )
{
+ assert( tr_isSession( session ) );
+
return session->proxy;
}
tr_port
tr_sessionGetProxyPort( const tr_session * session )
{
+ assert( tr_isSession( session ) );
+
return session->proxyPort;
}
tr_sessionSetProxy( tr_session * session,
const char * proxy )
{
+ assert( tr_isSession( session ) );
+
if( proxy != session->proxy )
{
tr_free( session->proxy );
tr_sessionSetProxyPort( tr_session * session,
tr_port port )
{
+ assert( tr_isSession( session ) );
+
session->proxyPort = port;
}
tr_bool
tr_sessionIsProxyAuthEnabled( const tr_session * session )
{
+ assert( tr_isSession( session ) );
+
return session->isProxyAuthEnabled;
}
tr_sessionSetProxyAuthEnabled( tr_session * session,
tr_bool isEnabled )
{
+ assert( tr_isSession( session ) );
+
session->isProxyAuthEnabled = isEnabled != 0;
}
const char*
tr_sessionGetProxyUsername( const tr_session * session )
{
+ assert( tr_isSession( session ) );
+
return session->proxyUsername;
}
tr_sessionSetProxyUsername( tr_session * session,
const char * username )
{
+ assert( tr_isSession( session ) );
+
if( username != session->proxyUsername )
{
tr_free( session->proxyUsername );
const char*
tr_sessionGetProxyPassword( const tr_session * session )
{
+ assert( tr_isSession( session ) );
+
return session->proxyPassword;
}
tr_sessionSetProxyPassword( tr_session * session,
const char * password )
{
+ assert( tr_isSession( session ) );
+
if( password != session->proxyPassword )
{
tr_free( session->proxyPassword );
int ret = 0;
tr_torrent * tor = NULL;
+ assert( tr_isSession( session ) );
+
while(( tor = tr_torrentNext( session, tor )))
if( tr_torrentGetActivity( tor ) != TR_STATUS_STOPPED )
++ret;