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
