From 4c1f0fe5c89a721936c92342e26c59112c70cd8a Mon Sep 17 00:00:00 2001
From: jkaeber <jkaeber@wiback.org>
Date: Tue, 4 Mar 2008 08:30:57 +0000
Subject: [PATCH] added address info to socket related SystemExceptions

---
 Socket/Protocols/GenericAddressingPolicy.cti  | 28 ++++++++++++++++---
 Socket/Protocols/Raw/LLAddressing.cci         |  7 +++++
 Socket/Protocols/Raw/LLAddressing.hh          |  5 ++++
 Socket/Protocols/UN/UNAddressing.cc           |  2 +-
 Socket/Protocols/UN/UNDatagramSocketHandle.cc |  7 +----
 5 files changed, 38 insertions(+), 11 deletions(-)

diff --git a/Socket/Protocols/GenericAddressingPolicy.cti b/Socket/Protocols/GenericAddressingPolicy.cti
index 2eaf5c888..7942fe34c 100644
--- a/Socket/Protocols/GenericAddressingPolicy.cti
+++ b/Socket/Protocols/GenericAddressingPolicy.cti
@@ -42,7 +42,12 @@ peer(SocketHandle<SPolicy> handle, Address & addr,
      typename IfCommunicationPolicyIs<SPolicy,ConnectedCommunicationPolicy>::type *)
 {
     addr.clear();
-    do_peer(handle,addr.sockaddr_p(),addr.sockaddr_len());
+    try {
+        do_peer(handle,addr.sockaddr_p(),addr.sockaddr_len());
+    } catch (SystemException & e) {
+        e << "; could not get peer for address \"" << addr << "\"";
+        throw;
+    }
 }
 #else
 template <class Address>
@@ -59,7 +64,12 @@ prefix_ void senf::GenericAddressingPolicy<Address>::
 connect(SocketHandle<SPolicy> handle, Address const & addr,
         typename IfCommunicationPolicyIs<SPolicy,ConnectedCommunicationPolicy>::type *)
 {
-    do_connect(handle,addr.sockaddr_p(),addr.sockaddr_len());
+    try {
+        do_connect(handle,addr.sockaddr_p(),addr.sockaddr_len());
+    } catch (SystemException & e) {
+        e << "; could not connect to address \"" << addr << "\"";
+        throw;
+    }
 }
 #else
 template <class Address>
@@ -74,14 +84,24 @@ prefix_ void senf::GenericAddressingPolicy<Address>::local(FileHandle handle,
                                                            Address & addr)
 {
     addr.clear();
-    do_local(handle,addr.sockaddr_p(),addr.sockaddr_len());
+    try {
+        do_local(handle,addr.sockaddr_p(),addr.sockaddr_len());
+    } catch (SystemException & e) {
+        e << "; could not get name for address \"" << addr << "\"";
+        throw;
+    }
 }
 
 template <class Address>
 prefix_ void senf::GenericAddressingPolicy<Address>::bind(FileHandle handle,
                                                                  Address const & addr)
 {
-    do_bind(handle,addr.sockaddr_p(),addr.sockaddr_len());
+    try {
+        do_bind(handle,addr.sockaddr_p(),addr.sockaddr_len());
+    } catch (SystemException & e) {
+        e << "; could not bind to address \"" << addr << "\"";
+        throw;
+    }
 }
 
 ///////////////////////////////cti.e///////////////////////////////////////
diff --git a/Socket/Protocols/Raw/LLAddressing.cci b/Socket/Protocols/Raw/LLAddressing.cci
index 1245a10ec..1054845e6 100644
--- a/Socket/Protocols/Raw/LLAddressing.cci
+++ b/Socket/Protocols/Raw/LLAddressing.cci
@@ -114,6 +114,13 @@ prefix_ unsigned senf::LLSocketAddress::sockaddr_len()
     return sizeof(addr_);
 }
 
+prefix_ std::ostream & senf::operator<<(std::ostream & os, LLSocketAddress const & llAddr)
+{
+    // TODO: expose more bytes from sockaddr_ll addr_
+    os << "[some LLSocketAddress]";
+    return os;
+}
+
 ///////////////////////////////cci.e///////////////////////////////////////
 #undef prefix_
 
diff --git a/Socket/Protocols/Raw/LLAddressing.hh b/Socket/Protocols/Raw/LLAddressing.hh
index 2a796b52f..bd82689c7 100644
--- a/Socket/Protocols/Raw/LLAddressing.hh
+++ b/Socket/Protocols/Raw/LLAddressing.hh
@@ -155,6 +155,11 @@ namespace senf {
     };
 
     /// @}
+
+    /** \brief Write link layer address
+        \related LLSocketAddress
+     */
+    std::ostream & operator<<(std::ostream & os, LLSocketAddress const & llAddr);
 }
 
 ///////////////////////////////hh.e////////////////////////////////////////
diff --git a/Socket/Protocols/UN/UNAddressing.cc b/Socket/Protocols/UN/UNAddressing.cc
index 1e01e513d..8eab74b72 100644
--- a/Socket/Protocols/UN/UNAddressing.cc
+++ b/Socket/Protocols/UN/UNAddressing.cc
@@ -83,7 +83,7 @@ prefix_ unsigned senf::UNSocketAddress::sockaddr_len()
     return sizeof(addr_);
 }
 
-prefix_ std::ostream & operator<<(std::ostream & os,
+prefix_ std::ostream & senf::operator<<(std::ostream & os,
                                   senf::UNSocketAddress::UNSocketAddress const & addr)
 {
     os << addr.path();
diff --git a/Socket/Protocols/UN/UNDatagramSocketHandle.cc b/Socket/Protocols/UN/UNDatagramSocketHandle.cc
index 75866830e..d1b66bd4f 100644
--- a/Socket/Protocols/UN/UNDatagramSocketHandle.cc
+++ b/Socket/Protocols/UN/UNDatagramSocketHandle.cc
@@ -48,12 +48,7 @@ prefix_ void senf::UNDatagramSocketProtocol::init_client() const
 prefix_ void senf::UNDatagramSocketProtocol::init_client(UNSocketAddress const & address) const 
 {
     init_client();
-    try {
-        clientHandle().bind(address);
-    } catch (SystemException & e) {
-        e << "; could not bind to address \"" << address.path() << "\"";
-        throw;
-    }
+    clientHandle().bind(address);
 }
 
 ///////////////////////////////cc.e////////////////////////////////////////
-- 
GitLab