]> granicus.if.org Git - transmission/commitdiff
(trunk libT) #3528 "TR_PREFS_KEY_BIND_ADDRESS_IPV4 breaks IPv6-only trackers" --...
authorCharles Kerr <charles@transmissionbt.com>
Thu, 30 Dec 2010 19:15:47 +0000 (19:15 +0000)
committerCharles Kerr <charles@transmissionbt.com>
Thu, 30 Dec 2010 19:15:47 +0000 (19:15 +0000)
libtransmission/net.c
libtransmission/session.c
libtransmission/session.h
libtransmission/web.c

index cb8471871fb981aefa36119def1b6001fcc5d4e2..c838ecae66e78f7c78d0bc36f5b9f025e0153ac9 100644 (file)
@@ -315,7 +315,7 @@ tr_netOpenPeerSocket( tr_session        * session,
     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 ) )
index c6b163032e66e0a63803174c14eb6460aedf1897..9ae408c84a38b5c14f4535c4faeed3826d877aac 100644 (file)
@@ -218,17 +218,32 @@ open_incoming_peer_port( tr_session * session )
 }
 
 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;
 }
 
index b644c3f4f0277aae6069b6a23d62b97c05e97325..4b12a53b2cd03821c62d57b3269c2b2c21e925e6 100644 (file)
@@ -224,7 +224,10 @@ void         tr_sessionUnlock( tr_session * );
 
 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 * );
 
index 8fcbd04999349cfb00494286555dcfbfae3ebc86..83899ecad018ebd52ff2c2e640aa5454acd2ee9e 100644 (file)
@@ -143,6 +143,7 @@ static CURL *
 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 );
@@ -167,7 +168,9 @@ createEasy( tr_session * s, struct tr_web_task * task )
     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 )