X-Git-Url: http://g0dil.de/git?a=blobdiff_plain;f=Socket%2FProtocols%2FINet%2FINetAddressing.cc;h=6bc79e581978f01b66c7b740666b7c7ef0fa1f9a;hb=d2459b6c8249291588fd3d0d125ed3d38e003b55;hp=2033048204b17cf87b32834fbb66116d1d2279ee;hpb=a1a6c76a214ad1935032826713cabaf9ac57bf07;p=senf.git diff --git a/Socket/Protocols/INet/INetAddressing.cc b/Socket/Protocols/INet/INetAddressing.cc index 2033048..6bc79e5 100644 --- a/Socket/Protocols/INet/INetAddressing.cc +++ b/Socket/Protocols/INet/INetAddressing.cc @@ -46,21 +46,16 @@ prefix_ senf::INet4SocketAddress::INet4SocketAddress(std::string const & addr) { clear(); - unsigned i = addr.find(':'); - if (i == std::string::npos) - throw SyntaxException(); + unsigned portIx = addr.find(':'); try { - port(boost::lexical_cast< ::u_int16_t >(std::string(addr,i+1))); + port( boost::lexical_cast< ::u_int16_t >(portIx == std::string::npos + ? addr : std::string(addr,portIx+1)) ); } catch (boost::bad_lexical_cast const &) { - throw SyntaxException(); - } - try { - address(INet4Address::from_string(std::string(addr,0,i))); - } - catch (INet4Address::SyntaxException const &) { - throw SyntaxException(); + throw AddressSyntaxException() << "invalid port number"; } + if (portIx != std::string::npos) + address( INet4Address::from_string(std::string(addr,0,portIx)) ); } prefix_ senf::INet4SocketAddress::INet4SocketAddress(INet4Address const & addr, unsigned p) @@ -86,8 +81,9 @@ prefix_ senf::INet6SocketAddress::INet6SocketAddress(std::string const & addr, // Format of addr: "[" address [ "%" interface ] "]" ":" port // or: host ":" port + // or: port - static boost::regex const addressRx ("(?:\\[([a-f0-9A-F:]+)(?:%(.+))?\\]|(.+)):([0-9]+)"); + static boost::regex const addressRx ("(?:(?:\\[([a-f0-9A-F:]+)(?:%(.+))?\\]|(.+)):)?([0-9]+)"); // Subexpression numbers: enum { NumericAddr = 1, ZoneId = 2, @@ -96,20 +92,18 @@ prefix_ senf::INet6SocketAddress::INet6SocketAddress(std::string const & addr, boost::smatch match; if (! regex_match(addr, match, addressRx)) - throw SyntaxException(); + throw AddressSyntaxException(); if (match[ZoneId].matched) assignIface(match[ZoneId]); sockaddr_.sin6_port = htons(boost::lexical_cast(match[Port])); - try { + if (match[NumericAddr].matched || match[Hostname].matched) { INet6Address a (INet6Address::from_string( match[NumericAddr].matched ? match[NumericAddr] : match[Hostname], resolve)); std::copy(a.begin(), a.end(), &sockaddr_.sin6_addr.s6_addr[0]); - } catch (INet6Address::SyntaxException const &) { - throw SyntaxException(); } } @@ -121,12 +115,6 @@ prefix_ bool senf::INet6SocketAddress::operator==(INet6SocketAddress const & oth sockaddr_.sin6_scope_id == other.sockaddr_.sin6_scope_id; } -prefix_ bool senf::INet6SocketAddress::operator!=(INet6SocketAddress const & other) - const -{ - return ! operator==(other); -} - prefix_ void senf::INet6SocketAddress::clear() { ::memset(&sockaddr_,0,sizeof(sockaddr_)); @@ -139,7 +127,7 @@ prefix_ std::string senf::INet6SocketAddress::iface() if (sockaddr_.sin6_scope_id == 0) return ""; char buffer[IFNAMSIZ]; -#ifndef SENF_NO_DEBUG +#ifdef SENF_DEBUG SENF_ASSERT( if_indextoname(sockaddr_.sin6_scope_id,buffer) ); #else if_indextoname(sockaddr_.sin6_scope_id,buffer); @@ -154,7 +142,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 SyntaxException(); + throw AddressSyntaxException(); } }