addrlen = setup_sockaddr( addr, port, &sock );
/* set source address */
- source_addr = tr_sessionGetPublicAddress( session, addr->type );
+ source_addr = tr_sessionGetPublicAddress( session, addr->type, NULL );
assert( source_addr );
sourcelen = setup_sockaddr( source_addr, 0, &source_sock );
if( bind( s, ( struct sockaddr * ) &source_sock, sourcelen ) )
}
const tr_address*
-tr_sessionGetPublicAddress( const tr_session * session, int tr_af_type )
+tr_sessionGetPublicAddress( const tr_session * session, int tr_af_type, tr_bool * is_default_value )
{
+ const char * default_value;
const struct tr_bindinfo * bindinfo;
switch( tr_af_type )
{
- case TR_AF_INET: bindinfo = session->public_ipv4; break;
- case TR_AF_INET6: bindinfo = session->public_ipv6; break;
- default: bindinfo = NULL; break;
+ case TR_AF_INET:
+ bindinfo = session->public_ipv4;
+ default_value = TR_DEFAULT_BIND_ADDRESS_IPV4;
+ break;
+
+ case TR_AF_INET6:
+ bindinfo = session->public_ipv6;
+ default_value = TR_DEFAULT_BIND_ADDRESS_IPV6;
+ break;
+
+ default:
+ bindinfo = NULL;
+ default_value = "";
+ break;
}
+ if( is_default_value != NULL )
+ *is_default_value = !strcmp( default_value, tr_ntop_non_ts( &bindinfo->addr ) );
+
return bindinfo ? &bindinfo->addr : NULL;
}
tr_bool tr_sessionIsLocked( const tr_session * );
-const struct tr_address* tr_sessionGetPublicAddress( const tr_session *, int tr_af_type );
+const struct tr_address* tr_sessionGetPublicAddress( const tr_session * session,
+ int tr_af_type,
+ tr_bool * is_default_value );
+
struct tr_bindsockets * tr_sessionGetBindSockets( tr_session * );
createEasy( tr_session * s, struct tr_web_task * task )
{
const tr_address * addr;
+ tr_bool is_default_value;
CURL * e = curl_easy_init( );
const long verbose = getenv( "TR_CURL_VERBOSE" ) != NULL;
char * cookie_filename = tr_buildPath( s->configDir, "cookies.txt", NULL );
curl_easy_setopt( e, CURLOPT_WRITEDATA, task );
curl_easy_setopt( e, CURLOPT_WRITEFUNCTION, writeFunc );
- if(( addr = tr_sessionGetPublicAddress( s, TR_AF_INET )))
+ if((( addr = tr_sessionGetPublicAddress( s, TR_AF_INET, &is_default_value ))) && !is_default_value )
+ curl_easy_setopt( e, CURLOPT_INTERFACE, tr_ntop_non_ts( addr ) );
+ else if ((( addr = tr_sessionGetPublicAddress( s, TR_AF_INET6, &is_default_value ))) && !is_default_value )
curl_easy_setopt( e, CURLOPT_INTERFACE, tr_ntop_non_ts( addr ) );
if( task->range )