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