From 599d33035b65c9e60d20405b16f3d82b01c4026f Mon Sep 17 00:00:00 2001
From: Jordan Lee <jordan@transmissionbt.com>
Date: Sat, 22 Jan 2011 20:43:36 +0000
Subject: [PATCH] (trunk libT) #3906 "DHT ignores bind-address-ipv6" -- make
 the process of getting the binding address consistent between IPv4 and IPv6
 sockets.

As suggested by Juiusz after the IPv6 binding commit in r11749.  See: https://trac.transmissionbt.com/ticket/3906#comment:6
---
 libtransmission/session.c | 4 ++--
 libtransmission/tr-udp.c  | 8 ++++++--
 libtransmission/tr-udp.h  | 2 +-
 3 files changed, 9 insertions(+), 5 deletions(-)

diff --git a/libtransmission/session.c b/libtransmission/session.c
index e6fa30dd6..612ef7724 100644
--- a/libtransmission/session.c
+++ b/libtransmission/session.c
@@ -706,7 +706,7 @@ tr_sessionInitImpl( void * vdata )
 
     tr_sessionSet( session, &settings );
 
-    tr_udpInit( session, &session->public_ipv4->addr );
+    tr_udpInit( session );
 
     if( session->isLPDEnabled )
         tr_lpdInit( session, &session->public_ipv4->addr );
@@ -1946,7 +1946,7 @@ toggleDHTImpl(  void * data )
 
     tr_udpUninit( session );
     session->isDHTEnabled = !session->isDHTEnabled;
-    tr_udpInit( session, &session->public_ipv4->addr );
+    tr_udpInit( session );
 }
 
 void
diff --git a/libtransmission/tr-udp.c b/libtransmission/tr-udp.c
index 5cfdb8217..652a18ca5 100644
--- a/libtransmission/tr-udp.c
+++ b/libtransmission/tr-udp.c
@@ -148,8 +148,10 @@ event_callback(int s, short type, void *sv)
 }    
 
 void
-tr_udpInit(tr_session *ss, const tr_address * addr)
+tr_udpInit(tr_session *ss)
 {
+    tr_bool is_default;
+    const struct tr_address * public_addr;
     struct sockaddr_in sin;
     int rc;
 
@@ -168,7 +170,9 @@ tr_udpInit(tr_session *ss, const tr_address * addr)
 
     memset(&sin, 0, sizeof(sin));
     sin.sin_family = AF_INET;
-    memcpy(&sin.sin_addr, &addr->addr.addr4, sizeof (struct in_addr));
+    public_addr = tr_sessionGetPublicAddress(ss, TR_AF_INET, &is_default);
+    if(public_addr && !is_default)
+        memcpy(&sin.sin_addr, &public_addr->addr.addr4, sizeof (struct in_addr));
     sin.sin_port = htons(ss->udp_port);
     rc = bind(ss->udp_socket, (struct sockaddr*)&sin, sizeof(sin));
     if(rc < 0) {
diff --git a/libtransmission/tr-udp.h b/libtransmission/tr-udp.h
index 0ad8cc490..b331e39e9 100644
--- a/libtransmission/tr-udp.h
+++ b/libtransmission/tr-udp.h
@@ -25,6 +25,6 @@ THE SOFTWARE.
  #error only libtransmission should #include this header.
 #endif
 
-void tr_udpInit( tr_session *, const tr_address *);
+void tr_udpInit( tr_session * );
 void tr_udpUninit( tr_session * );
 
-- 
2.40.0