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