From 3a5ad8d36197cde4fa8471fdec57f41173c8ff44 Mon Sep 17 00:00:00 2001 From: Sage Weil Date: Fri, 15 Mar 2019 10:19:16 -0500 Subject: [PATCH] msg/msg_types: use inet_ntop(3) to render IP addresses This is a lower-level helper than getnameinfo(3) and should be a bit faster. Signed-off-by: Sage Weil --- src/msg/msg_types.cc | 56 ++++++++++++++++++-------------------------- 1 file changed, 23 insertions(+), 33 deletions(-) diff --git a/src/msg/msg_types.cc b/src/msg/msg_types.cc index 62ca036e225..7d29713538b 100644 --- a/src/msg/msg_types.cc +++ b/src/msg/msg_types.cc @@ -187,46 +187,36 @@ ostream& operator<<(ostream& out, const entity_addr_t &addr) return out; } -ostream& operator<<(ostream& out, const sockaddr_storage &ss) +ostream& operator<<(ostream& out, const sockaddr *psa) { char buf[NI_MAXHOST] = { 0 }; - char serv[NI_MAXSERV] = { 0 }; - size_t hostlen; - - if (ss.ss_family == AF_INET) - hostlen = sizeof(struct sockaddr_in); - else if (ss.ss_family == AF_INET6) - hostlen = sizeof(struct sockaddr_in6); - else - hostlen = sizeof(struct sockaddr_storage); - getnameinfo((struct sockaddr *)&ss, hostlen, buf, sizeof(buf), - serv, sizeof(serv), - NI_NUMERICHOST | NI_NUMERICSERV); - if (ss.ss_family == AF_INET6) - return out << '[' << buf << "]:" << serv; - return out << buf << ':' << serv; + + switch (psa->sa_family) { + case AF_INET: + { + const sockaddr_in *sa = (const sockaddr_in*)psa; + inet_ntop(AF_INET, &sa->sin_addr, buf, NI_MAXHOST); + return out << buf << ':' + << ntohs(sa->sin_port); + } + case AF_INET6: + { + const sockaddr_in6 *sa = (const sockaddr_in6*)psa; + inet_ntop(AF_INET6, &sa->sin6_addr, buf, NI_MAXHOST); + return out << '[' << buf << "]:" + << ntohs(sa->sin6_port); + } + default: + return out << "(unrecognized address family " << psa->sa_family << ")"; + } } -ostream& operator<<(ostream& out, const sockaddr *sa) +ostream& operator<<(ostream& out, const sockaddr_storage &ss) { - char buf[NI_MAXHOST] = { 0 }; - char serv[NI_MAXSERV] = { 0 }; - size_t hostlen; - - if (sa->sa_family == AF_INET) - hostlen = sizeof(struct sockaddr_in); - else if (sa->sa_family == AF_INET6) - hostlen = sizeof(struct sockaddr_in6); - else - hostlen = sizeof(struct sockaddr_storage); - getnameinfo(sa, hostlen, buf, sizeof(buf), - serv, sizeof(serv), - NI_NUMERICHOST | NI_NUMERICSERV); - if (sa->sa_family == AF_INET6) - return out << '[' << buf << "]:" << serv; - return out << buf << ':' << serv; + return out << (const sockaddr*)&ss; } + // entity_addrvec_t bool entity_addrvec_t::parse(const char *s, const char **end) -- 2.39.5