Module: sems
Branch: master
Commit: 77c4a654b371d761d47be6cbf440b22934e71788
URL:    
http://git.sip-router.org/cgi-bin/gitweb.cgi/sems/?a=commit;h=77c4a654b371d761d47be6cbf440b22934e71788

Author: Raphael Coeffic <[email protected]>
Committer: Raphael Coeffic <[email protected]>
Date:   Wed Feb  1 14:13:22 2012 +0100

core: get_addr_str uses getnameinfo instead of inet_ntop.

input parameter has been changed as well from sockaddr_in* to sockaddr_storage* 
to offer support for IPv6 addresses.

---

 core/AmRtpStream.cpp      |    4 ++--
 core/AmUtils.cpp          |   18 +++++++++++++-----
 core/AmUtils.h            |    3 +--
 core/SipCtrlInterface.cpp |    8 ++++----
 core/sip/trans_layer.cpp  |    8 ++++----
 5 files changed, 24 insertions(+), 17 deletions(-)

diff --git a/core/AmRtpStream.cpp b/core/AmRtpStream.cpp
index 75dc2aa..4bf2eba 100644
--- a/core/AmRtpStream.cpp
+++ b/core/AmRtpStream.cpp
@@ -160,7 +160,7 @@ void AmRtpStream::setLocalPort()
   l_port = port;
   AmRtpReceiver::instance()->addStream(l_sd, this);
   DBG("added stream [%p] to RTP receiver (%s:%i)\n", this,
-      get_addr_str(l_saddr.sin_addr).c_str(),l_port);
+      get_addr_str((sockaddr_storage*)&l_saddr).c_str(),l_port);
 }
 
 int AmRtpStream::ping()
@@ -460,7 +460,7 @@ void AmRtpStream::handleSymmetricRtp(AmRtpPacket* rp) {
     // symmetric RTP
     if ((recv_addr.sin_port != r_saddr.sin_port)
        || (recv_addr.sin_addr.s_addr != r_saddr.sin_addr.s_addr)) {
-      string addr_str = get_addr_str(recv_addr.sin_addr);
+      string addr_str = get_addr_str((sockaddr_storage*)&recv_addr);
       int port = ntohs(recv_addr.sin_port);
       setRAddr(addr_str,port);
       DBG("Symmetric RTP: setting new remote address: %s:%i\n",
diff --git a/core/AmUtils.cpp b/core/AmUtils.cpp
index d886c39..f4ad187 100644
--- a/core/AmUtils.cpp
+++ b/core/AmUtils.cpp
@@ -436,14 +436,22 @@ string filename_from_fullpath(const string& path)
   return "";
 }
 
-string get_addr_str(struct in_addr in)
+string get_addr_str(const sockaddr_storage* addr)
 {
-  char res[INET_ADDRSTRLEN];
-  if (inet_ntop(AF_INET, &in, res, INET_ADDRSTRLEN))
-    return string(res);
-  else return "";
+  char host[NI_MAXHOST];
+
+  int s = getnameinfo((sockaddr*)addr, (addr->ss_family == AF_INET) ? 
+                     sizeof(struct sockaddr_in) : sizeof(struct sockaddr_in6),
+                     host, NI_MAXHOST, NULL, 0, NI_NUMERICHOST);
+  if (s != 0) {
+    ERROR("getnameinfo() failed: %s\n", gai_strerror(s));
+    return "";
+  }
+  
+  return host;
 }
 
+
 #ifdef SUPPORT_IPV6
 #include <netdb.h>
 
diff --git a/core/AmUtils.h b/core/AmUtils.h
index caf9a78..fe2f6f2 100644
--- a/core/AmUtils.h
+++ b/core/AmUtils.h
@@ -180,8 +180,7 @@ string file_extension(const string& path);
  */
 string add2path(const string& path, int n_suffix, ...);
 
-struct in_addr;
-string get_addr_str(struct in_addr in);
+string get_addr_str(const sockaddr_storage* addr);
 
 #ifdef SUPPORT_IPV6
 int inet_aton_v6(const char* name, struct sockaddr_storage* ss);
diff --git a/core/SipCtrlInterface.cpp b/core/SipCtrlInterface.cpp
index 8f0b0a3..f84f905 100644
--- a/core/SipCtrlInterface.cpp
+++ b/core/SipCtrlInterface.cpp
@@ -457,9 +457,9 @@ inline void SipCtrlInterface::sip_msg2am_request(const 
sip_msg *msg,
 
     req.via1 = c2stlstr(msg->via1->value);
 
-    req.remote_ip = 
get_addr_str(((sockaddr_in*)&msg->remote_ip)->sin_addr).c_str();
+    req.remote_ip = get_addr_str(&msg->remote_ip).c_str();
     req.remote_port = htons(((sockaddr_in*)&msg->remote_ip)->sin_port);
-    req.local_ip = 
get_addr_str(((sockaddr_in*)&msg->local_ip)->sin_addr).c_str();
+    req.local_ip = get_addr_str(&msg->local_ip).c_str();
     req.local_port = htons(((sockaddr_in*)&msg->local_ip)->sin_port);
 }
 
@@ -525,9 +525,9 @@ inline bool SipCtrlInterface::sip_msg2am_reply(sip_msg 
*msg, AmSipReply &reply)
         }
     }
 
-    reply.remote_ip = 
get_addr_str(((sockaddr_in*)&msg->remote_ip)->sin_addr).c_str();
+    reply.remote_ip = get_addr_str(&msg->remote_ip).c_str();
     reply.remote_port = htons(((sockaddr_in*)&msg->remote_ip)->sin_port);
-    reply.local_ip = 
get_addr_str(((sockaddr_in*)&msg->local_ip)->sin_addr).c_str();
+    reply.local_ip = get_addr_str(&msg->local_ip).c_str();
     reply.local_port = htons(((sockaddr_in*)&msg->local_ip)->sin_port);
 
     return true;
diff --git a/core/sip/trans_layer.cpp b/core/sip/trans_layer.cpp
index d730b80..83563da 100644
--- a/core/sip/trans_layer.cpp
+++ b/core/sip/trans_layer.cpp
@@ -144,7 +144,7 @@ int _trans_layer::send_reply(trans_ticket* tt,
     assert(req->via_p1);
 
     unsigned int new_via1_len = copy_hdr_len(req->via1);
-    string remote_ip_str = 
get_addr_str(((sockaddr_in*)&req->remote_ip)->sin_addr).c_str();
+    string remote_ip_str = get_addr_str(&req->remote_ip).c_str();
     new_via1_len += 10/*;received=*/ + remote_ip_str.length();
 
     // needed if rport parameter was present but empty
@@ -415,7 +415,7 @@ int _trans_layer::send_reply(trans_ticket* tt,
     }
 
     DBG("Sending to %s:%i <%.*s...>\n",
-       get_addr_str(((sockaddr_in*)&remote_ip)->sin_addr).c_str(),
+       get_addr_str(&remote_ip).c_str(),
        ntohs(((sockaddr_in*)&remote_ip)->sin_port),
        50 /* preview - instead of p_msg->len */,reply_buf);
 
@@ -944,7 +944,7 @@ int _trans_layer::send_request(sip_msg* msg, trans_ticket* 
tt,
     p_msg->local_socket = msg->local_socket;
 
     DBG("Sending to %s:%i <%.*s...>\n",
-       get_addr_str(((sockaddr_in*)&p_msg->remote_ip)->sin_addr).c_str(),
+       get_addr_str(&p_msg->remote_ip).c_str(),
        ntohs(((sockaddr_in*)&p_msg->remote_ip)->sin_port),
        50 /* preview - instead of p_msg->len */,p_msg->buf);
 
@@ -1078,7 +1078,7 @@ int _trans_layer::cancel(trans_ticket* tt)
     p_msg->local_socket = req->local_socket;
 
     DBG("Sending to %s:%i:\n<%.*s>\n",
-       get_addr_str(((sockaddr_in*)&p_msg->remote_ip)->sin_addr).c_str(),
+       get_addr_str(&p_msg->remote_ip).c_str(),
        ntohs(((sockaddr_in*)&p_msg->remote_ip)->sin_port),
        p_msg->len,p_msg->buf);
 

_______________________________________________
Semsdev mailing list
[email protected]
http://lists.iptel.org/mailman/listinfo/semsdev

Reply via email to