From f7d39e4a6be209d4b5369e5f41d48e8d999113b9 Mon Sep 17 00:00:00 2001 From: csoler Date: Sat, 7 Nov 2009 22:14:41 +0000 Subject: [PATCH] display the best available ip for peers in the gui, instead of 0.0.0.0. This does only affect the gui, not the way ips are trusted and propagated (backport of commit 1799 from trunk) git-svn-id: http://svn.code.sf.net/p/retroshare/code/branches/v0.4.x@1800 b45a01b8-16f6-495d-af2f-9b41ad6348cc --- libretroshare/src/rsserver/p3peers.cc | 26 ++++++++++++++++++++++---- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/libretroshare/src/rsserver/p3peers.cc b/libretroshare/src/rsserver/p3peers.cc index a31ee220a..0c86fd72c 100644 --- a/libretroshare/src/rsserver/p3peers.cc +++ b/libretroshare/src/rsserver/p3peers.cc @@ -248,6 +248,20 @@ bool p3Peers::isFriend(std::string id) return false; } +static struct sockaddr_in getPreferredAddress( const struct sockaddr_in& addr1,time_t ts1, + const struct sockaddr_in& addr2,time_t ts2, + const struct sockaddr_in& addr3,time_t ts3) +{ + time_t ts = ts1 ; + struct sockaddr_in addr = addr1 ; + + if(ts2 > ts && strcmp(inet_ntoa(addr2.sin_addr),"0.0.0.0")) { ts = ts2 ; addr = addr2 ; } + if(ts3 > ts && strcmp(inet_ntoa(addr3.sin_addr),"0.0.0.0")) { ts = ts3 ; addr = addr3 ; } + + return addr ; +} + + bool p3Peers::getPeerDetails(std::string id, RsPeerDetails &d) { #ifdef P3PEERS_DEBUG @@ -300,12 +314,16 @@ bool p3Peers::getPeerDetails(std::string id, RsPeerDetails &d) } } + // From all addresses, show the most recent one if no address is currently in use. + struct sockaddr_in best_local_addr = (!strcmp(inet_ntoa(pcs.localaddr.sin_addr),"0.0.0.0"))?getPreferredAddress(pcs.dht.laddr,pcs.dht.ts,pcs.disc.laddr,pcs.disc.ts,pcs.peer.laddr,pcs.peer.ts):pcs.localaddr ; + struct sockaddr_in best_servr_addr = (!strcmp(inet_ntoa(pcs.serveraddr.sin_addr),"0.0.0.0"))?getPreferredAddress(pcs.dht.raddr,pcs.dht.ts,pcs.disc.raddr,pcs.disc.ts,pcs.peer.raddr,pcs.peer.ts):pcs.serveraddr ; + /* fill from pcs */ - d.localAddr = inet_ntoa(pcs.localaddr.sin_addr); - d.localPort = ntohs(pcs.localaddr.sin_port); - d.extAddr = inet_ntoa(pcs.serveraddr.sin_addr); - d.extPort = ntohs(pcs.serveraddr.sin_port); + d.localAddr = inet_ntoa(best_local_addr.sin_addr); + d.localPort = ntohs(best_local_addr.sin_port); + d.extAddr = inet_ntoa(best_servr_addr.sin_addr); + d.extPort = ntohs(best_servr_addr.sin_port); d.lastConnect = pcs.lastcontact; d.connectPeriod = 0;