Date: Thursday, December 21, 2006 @ 19:56:26
  Author: marc
    Path: /cvsroot/carob/carob

Modified: include/SocketAddress.hpp (1.1 -> 1.2) src/SocketAddress.cpp
          (1.1 -> 1.2)

Implemented sockaddr and addrinfo pretty-printers


---------------------------+
 include/SocketAddress.hpp |    6 +
 src/SocketAddress.cpp     |  142 +++++++++++++++++++++++++++++++++++++++++++-
 2 files changed, 146 insertions(+), 2 deletions(-)


Index: carob/include/SocketAddress.hpp
diff -u carob/include/SocketAddress.hpp:1.1 carob/include/SocketAddress.hpp:1.2
--- carob/include/SocketAddress.hpp:1.1 Thu Dec 21 18:50:20 2006
+++ carob/include/SocketAddress.hpp     Thu Dec 21 19:56:26 2006
@@ -16,7 +16,7 @@
  * limitations under the License. 
  *
  * Initial developer(s): Gilles Rayrat.
- * Contributor(s): ______________________.
+ * Contributor(s): Marc Herbert
  */
 #ifndef SOCKETADDRESS_HPP_
 #define SOCKETADDRESS_HPP_
@@ -29,10 +29,14 @@
   #include "Common.hpp" //for in_port_t
 #else
   #include <sys/socket.h> // sockaddr & socklen_t
+  #include <netdb.h> // addrinfo
 #endif
 
 namespace CarobNS {
 
+std::wostream& operator<< (std::wostream& ostr, const sockaddr& toprint);
+std::wostream& operator<< (std::wostream& ostr, const addrinfo& toprint);
+
 /**
  * Wraps a sockaddr, its size and provides a less than operator so it can be
  * the keys of stl maps
Index: carob/src/SocketAddress.cpp
diff -u carob/src/SocketAddress.cpp:1.1 carob/src/SocketAddress.cpp:1.2
--- carob/src/SocketAddress.cpp:1.1     Thu Dec 21 18:50:20 2006
+++ carob/src/SocketAddress.cpp Thu Dec 21 19:56:26 2006
@@ -16,7 +16,7 @@
  * limitations under the License. 
  *
  * Initial developer(s): Gilles Rayrat.
- * Contributor(s): ______________________.
+ * Contributor(s): Marc Herbert
  */
 
 #ifdef __MINGW32__
@@ -28,6 +28,15 @@
 
 #include "SocketAddress.hpp"
 #include "Common.hpp" // for logging
+#include "StringCodecs.hpp"
+
+#include <ostream>
+#include <sstream>
+
+#include <arpa/inet.h> // inet_ntop
+
+#include <string.h> // strerror_r
+#include <errno.h>
 
 using namespace CarobNS;
 
@@ -99,3 +108,134 @@
     return AF_UNSPEC;
   return address->sa_family;
 }
+
+
+namespace
+{
+
+std::wostream&
+winet_ntop_or_error(std::wostream& oss, int af, const void * sin_addr)
+{
+
+    char printableAddress[INET6_ADDRSTRLEN+1];
+
+    if (inet_ntop(af, sin_addr, printableAddress, INET6_ADDRSTRLEN)
+        == NULL)
+        strerror_r(errno, printableAddress, INET6_ADDRSTRLEN);
+
+    oss << StaticCodecs::fromASCII(printableAddress);
+
+    return oss;
+}
+
+}
+
+namespace CarobNS
+{
+
+std::wostream&
+operator<< (std::wostream& oss, const sockaddr& sock)
+{
+
+    switch(sock.sa_family) {
+    case AF_INET:
+    {
+        const sockaddr_in& inet4addr(reinterpret_cast<const 
sockaddr_in&>(sock));
+        winet_ntop_or_error(oss, inet4addr.sin_family, & inet4addr.sin_addr);
+        oss << L":" << inet4addr.sin_port;
+    }
+    break;
+
+    case AF_INET6:
+    {
+        const sockaddr_in6& inet6addr(reinterpret_cast<const 
sockaddr_in6&>(sock));
+        oss << L"[";
+        winet_ntop_or_error(oss, inet6addr.sin6_family, & inet6addr.sin6_addr);
+        oss << L"]:" << inet6addr.sin6_port;
+    }
+    break;
+
+    default:
+    {
+        oss << L"Unknown sa_family number=" << sock.sa_family;
+        break;
+    }
+    };
+
+    return oss;
+}
+
+
+/*
+ Typically used like this:
+
+  for (addrinfo *addri = addressList; addri != NULL; addri = addri->ai_next)
+  {
+    std::wcerr << *addri;
+    if (addri->ai_next)
+      std::wcerr << L"; ";
+  }
+*/
+
+std::wostream&
+operator<< (std::wostream& oss, const addrinfo& addri)
+{
+
+    switch(addri.ai_family) {
+    case AF_INET:
+        oss << L"AF_INET"; break;
+    case AF_INET6:
+        oss << L"AF_INET6"; break;
+    case AF_UNIX:
+        oss << L"AF_UNIX"; break;
+    case AF_UNSPEC:
+        oss << L"AF_UNSPEC"; break;
+    default:
+        oss << L"unknown ai_family number=" << addri.ai_family ; break;
+    }
+    oss << L":";
+
+    if (addri.ai_canonname)
+        oss << StaticCodecs::fromASCII(addri.ai_canonname) << L"/";
+    else
+        oss << L"<unresolved>" << L"/";
+
+    oss << *(addri.ai_addr);
+
+    oss << L",";
+    switch(addri.ai_socktype) {
+    case SOCK_STREAM:
+        oss << L"SOCK_STREAM"; break;
+    case SOCK_DGRAM:
+        oss << L"SOCK_DGRAM"; break;
+    default:
+        oss << L"unknown socket type=" << addri.ai_socktype ; break;
+    }
+
+    oss << L"/";
+    switch(addri.ai_protocol) {
+    case IPPROTO_TCP:
+        oss << L"IPPROTO_TCP"; break;
+    case IPPROTO_UDP:
+        oss << L"IPPROTO_UDP"; break;
+    default:
+        oss << L"unknown protocol=" << addri.ai_protocol ; break;
+    }
+
+
+    oss << L",flags=";
+
+    oss << addri.ai_flags;
+
+    // hex
+    std::wostringstream wss;
+    wss.setf(std::ios_base::hex, std::ios_base::basefield);
+    wss.setf(std::ios_base::showbase);
+    wss << L"(" << addri.ai_flags << L")";
+
+    oss << wss.str();
+
+    return oss;
+}
+
+} // namespace CarobNS

_______________________________________________
Carob-commits mailing list
[email protected]
https://forge.continuent.org/mailman/listinfo/carob-commits

Reply via email to