]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
msgr: use getnameinfo to format socket addresses
authorSage Weil <sage@newdream.net>
Fri, 2 Oct 2009 20:43:59 +0000 (13:43 -0700)
committerSage Weil <sage@newdream.net>
Fri, 2 Oct 2009 20:43:59 +0000 (13:43 -0700)
src/msg/msg_types.h
src/msg/tcp.h

index ef1cb37d75f8f30b81c61ec8a8db305fc6b56ff4..74971751ff78e1572236c87ce6f24dde34e05b39 100644 (file)
@@ -226,54 +226,6 @@ struct entity_addr_t {
 };
 WRITE_CLASS_ENCODER(entity_addr_t)
 
-inline ostream& operator<<(ostream& out, const sockaddr_storage &ss)
-{
-  switch (ss.ss_family) {
-  case AF_INET:
-    {
-      sockaddr_in *a = (sockaddr_in *)&ss;
-      unsigned char *addr = (unsigned char*)&a->sin_addr.s_addr;
-      return out << (unsigned)addr[0] << "."
-                << (unsigned)addr[1] << "."
-                << (unsigned)addr[2] << "."
-                << (unsigned)addr[3] << ":"
-                << ntohs(a->sin_port);
-    }
-    break;
-
-  case AF_INET6:
-    {
-      sockaddr_in6& in6 = *(sockaddr_in6 *)&ss;
-      if (in6.sin6_addr.s6_addr32[0] == 0 &&
-         in6.sin6_addr.s6_addr32[1] == 0 &&
-         in6.sin6_addr.s6_addr16[4] == 0 &&
-         in6.sin6_addr.s6_addr16[5] == 0xffff)
-       return out << "::ffff:"
-                  << in6.sin6_addr.s6_addr[12] << '.' 
-                  << in6.sin6_addr.s6_addr[13] << '.' 
-                  << in6.sin6_addr.s6_addr[14] << '.' 
-                  << in6.sin6_addr.s6_addr[15]
-                  << ':' << ntohs(in6.sin6_port);
-      char b[40];
-      sprintf(b, "%04x:%04x:%04x:%04x:%04x:%04x:%04x:%04x",
-             in6.sin6_addr.s6_addr16[0],
-             in6.sin6_addr.s6_addr16[1],
-             in6.sin6_addr.s6_addr16[2],
-             in6.sin6_addr.s6_addr16[3],
-             in6.sin6_addr.s6_addr16[4],
-             in6.sin6_addr.s6_addr16[5],
-             in6.sin6_addr.s6_addr16[6],
-             in6.sin6_addr.s6_addr16[7]);
-      return out << b << ':' << ntohs(in6.sin6_port);
-    }
-    break;
-
-  case 0:
-    return out << "(null sockaddr_storage)";
-  }
-  return out << "(unrecognized sockaddr_storage family " << ss.ss_family << ")";  
-}
-
 inline ostream& operator<<(ostream& out, const entity_addr_t &addr)
 {
   return out << addr.v.in_addr << '/' << addr.v.nonce << '/' << addr.v.erank;
index dc27ef6bb0a7b53ed3674bf6f8ed8de583308a8d..0a701a27f874e4ab9c79e53dd28a3f24c4f7269c 100644 (file)
@@ -7,21 +7,26 @@
 #include <netinet/in.h>
 #include <arpa/inet.h>
 #include <string.h>
+#include <sys/socket.h>
+#include <netdb.h>
 
 using std::ostream;
 
-inline ostream& operator<<(ostream& out, const sockaddr_in &a)
+inline ostream& operator<<(ostream& out, const sockaddr_storage &ss)
 {
-  unsigned char *addr = (unsigned char*)&a.sin_addr.s_addr;
-  //out << "(" << a.sin_family << ")";
-  out << (unsigned)addr[0] << "."
-      << (unsigned)addr[1] << "."
-      << (unsigned)addr[2] << "."
-      << (unsigned)addr[3] << ":"
-      << ntohs(a.sin_port);
-  return out;
+  char buf[NI_MAXHOST];
+  getnameinfo((struct sockaddr *)&ss, sizeof(ss), buf, sizeof(buf), 0, 0, NI_NUMERICHOST);
+  return out << buf;
 }
 
+inline ostream& operator<<(ostream& out, const sockaddr_in &ss)
+{
+  char buf[NI_MAXHOST];
+  getnameinfo((struct sockaddr *)&ss, sizeof(ss), buf, sizeof(buf), 0, 0, NI_NUMERICHOST);
+  return out << buf;
+}
+
+
 inline int tcp_read(int sd, char *buf, int len) {
   while (len > 0) {
     int got = ::recv( sd, buf, len, 0 );