Socket/INet/Protocols: Change unit-test to work in non-IpV6 configured environment
[senf.git] / Socket / Protocols / INet / INetAddressing.cc
index 519a202..9ef8c39 100644 (file)
 ///////////////////////////////cc.p////////////////////////////////////////
 
 ///////////////////////////////////////////////////////////////////////////
-// senf::INet4Address
+// senf::INet4SocketAddress
 
-prefix_ senf::INet4SocketAddress::INet4SocketAddress(std::string host, unsigned port)
+prefix_ senf::INet4SocketAddress::INet4SocketAddress(std::string const & addr)
 {
     clear();
-    /** \todo  gethostbyname support */
-    if (::inet_aton(host.c_str(), &addr_.sin_addr) == 0)
-        throw InvalidINetAddressException();
-    addr_.sin_port = htons(port);
-}
-
-prefix_ std::string senf::INet4SocketAddress::str()
-    const
-{
-    std::stringstream s;
-    s << host() << ':' << port();
-    return s.str();
-}
-
-prefix_ void senf::INet4SocketAddress::clear()
-{
-    ::memset(&addr_,0,sizeof(addr_));
-    addr_.sin_family = AF_INET;
-}
-
-prefix_ void senf::INet4SocketAddress::assignString(std::string address)
-{
-    clear();
-    unsigned i = address.find(':');
+    unsigned i = addr.find(':');
     if (i == std::string::npos)
-        throw InvalidINetAddressException();
-    // The temporary string in the next expr is guaranteed to live
-    // until end-of-statement
-    if (::inet_aton(std::string(address,0,i).c_str(), &addr_.sin_addr) == 0)
-        throw InvalidINetAddressException();
+        throw SyntaxException();
+    address(INet4Address::from_string(std::string(addr,0,i)));
     try {
-        // Replace lexical_cast with strtoul ?
-        addr_.sin_port = htons(boost::lexical_cast< ::u_int16_t >(std::string(address,i+1)));
+        port(boost::lexical_cast< ::u_int16_t >(std::string(addr,i+1)));
     }
     catch (boost::bad_lexical_cast const &) {
-        throw InvalidINetAddressException();
+        throw SyntaxException();
     }
 }
 
-///////////////////////////////////////////////////////////////////////////
-// senf::INet6Address
-
-prefix_ senf::INet6Address::INet6Address(std::string const & addr)
+prefix_ senf::INet4SocketAddress::INet4SocketAddress(INet4Address const & addr, unsigned p)
 {
-    if (inet_pton(AF_INET6,addr.c_str(),&addr_) <= 0)
-        throw InvalidINetAddressException();
-}
-
-prefix_ senf::INet6Address::INet6Address(char const * addr)
-{
-    if (inet_pton(AF_INET6,addr,&addr_) <= 0)
-        throw InvalidINetAddressException();
+    clear();
+    address(addr);
+    port(p);
 }
 
-prefix_ void senf::INet6Address::clear()
+prefix_ void senf::INet4SocketAddress::clear()
 {
     ::memset(&addr_,0,sizeof(addr_));
-}
-
-prefix_ std::string senf::INet6Address::address()
-    const
-{
-    char buffer[8*5];
-    BOOST_ASSERT( inet_ntop(AF_INET6, &addr_, buffer, sizeof(buffer)) );
-    return std::string(buffer);
-}
-
-prefix_ bool senf::INet6Address::operator==(INet6Address const & other)
-    const
-{
-    return ::memcmp(&addr_,&other.addr_,sizeof(addr_))==0;
-}
-
-prefix_ bool senf::INet6Address::operator!=(INet6Address const & other)
-    const
-{
-    return !operator==(other);
+    addr_.sin_family = AF_INET;
 }
 
 ///////////////////////////////////////////////////////////////////////////
@@ -185,28 +131,28 @@ prefix_ void senf::INet6SocketAddress::assignAddr(std::string const & addr)
         || inet_pton(AF_INET6, std::string(boost::begin(*token),boost::end(*token)).c_str(),
                      &sockaddr_.sin6_addr) <= 0
         || ++token == tokens.end())
-        throw InvalidINetAddressException();
+        throw SyntaxException();
     if (*token == "@") {
         if (++token == tokens.end())
-            throw InvalidINetAddressException();
+            throw SyntaxException();
         assignIface(std::string(boost::begin(*token),boost::end(*token)));
         if (++token == tokens.end()
             || *token != "]")
-            throw InvalidINetAddressException();
+            throw SyntaxException();
     } else if (*token != "]")
-        throw InvalidINetAddressException();
+        throw SyntaxException();
     if (++token == tokens.end()
         || *boost::begin(*token) != ':')
-        throw InvalidINetAddressException();
+        throw SyntaxException();
     try {
         sockaddr_.sin6_port = htons(
             boost::lexical_cast<unsigned>(std::string(boost::next(boost::begin(*token)),
                                                       boost::end(*token))));
     } catch(boost::bad_lexical_cast const &) {
-        throw InvalidINetAddressException();
+        throw SyntaxException();
     }
     if (++token != tokens.end())
-        throw InvalidINetAddressException();
+        throw SyntaxException();
 }
 
 prefix_ void senf::INet6SocketAddress::assignIface(std::string const & iface)
@@ -216,7 +162,7 @@ prefix_ void senf::INet6SocketAddress::assignIface(std::string const & iface)
     else {
         sockaddr_.sin6_scope_id = if_nametoindex(iface.c_str());
         if (sockaddr_.sin6_scope_id == 0)
-            throw InvalidINetAddressException();
+            throw SyntaxException();
     }
 }