|
Boost-Commit : |
From: chris_at_[hidden]
Date: 2007-10-24 09:23:59
Author: chris_kohlhoff
Date: 2007-10-24 09:23:59 EDT (Wed, 24 Oct 2007)
New Revision: 40413
URL: http://svn.boost.org/trac/boost/changeset/40413
Log:
Fixes for HP-UX test failures.
Text files modified:
trunk/boost/asio/ip/detail/socket_option.hpp | 87 ++++++++++++++++++++++++++++-----------
trunk/boost/asio/ip/multicast.hpp | 2
trunk/libs/asio/test/ip/multicast.cpp | 6 ++
3 files changed, 67 insertions(+), 28 deletions(-)
Modified: trunk/boost/asio/ip/detail/socket_option.hpp
==============================================================================
--- trunk/boost/asio/ip/detail/socket_option.hpp (original)
+++ trunk/boost/asio/ip/detail/socket_option.hpp 2007-10-24 09:23:59 EDT (Wed, 24 Oct 2007)
@@ -33,52 +33,60 @@
namespace detail {
namespace socket_option {
-// Helper template for implementing boolean-based options.
+// Helper template for implementing multicast enable loopback options.
template <int IPv4_Level, int IPv4_Name, int IPv6_Level, int IPv6_Name>
-class boolean
+class multicast_enable_loopback
{
public:
-#if defined(__sun) || defined(_AIX) || defined(__osf__) || defined(__hpux)
- typedef unsigned char value_type;
+#if defined(__sun) || defined(__osf__)
+ typedef unsigned char ipv4_value_type;
+ typedef unsigned char ipv6_value_type;
+#elif defined(_AIX) || defined(__hpux)
+ typedef unsigned char ipv4_value_type;
+ typedef unsigned int ipv6_value_type;
#else
- typedef int value_type;
+ typedef int ipv4_value_type;
+ typedef int ipv6_value_type;
#endif
// Default constructor.
- boolean()
- : value_(0)
+ multicast_enable_loopback()
+ : ipv4_value_(0),
+ ipv6_value_(0)
{
}
// Construct with a specific option value.
- explicit boolean(bool v)
- : value_(v ? 1 : 0)
+ explicit multicast_enable_loopback(bool v)
+ : ipv4_value_(v ? 1 : 0),
+ ipv6_value_(v ? 1 : 0)
{
}
// Set the value of the boolean.
- boolean& operator=(bool v)
+ multicast_enable_loopback& operator=(bool v)
{
- value_ = v ? 1 : 0;
+ ipv4_value_ = v ? 1 : 0;
+ ipv6_value_ = v ? 1 : 0;
return *this;
}
// Get the current value of the boolean.
bool value() const
{
- return !!value_;
+ return !!ipv4_value_;
}
// Convert to bool.
operator bool() const
{
- return !!value_;
+ return !!ipv4_value_;
}
// Test for false.
bool operator!() const
{
- return !value_;
+ return !ipv4_value_;
}
// Get the level of the socket option.
@@ -101,35 +109,58 @@
// Get the address of the boolean data.
template <typename Protocol>
- value_type* data(const Protocol&)
+ void* data(const Protocol& protocol)
{
- return &value_;
+ if (protocol.family() == PF_INET6)
+ return &ipv6_value_;
+ return &ipv4_value_;
}
// Get the address of the boolean data.
template <typename Protocol>
- const value_type* data(const Protocol&) const
+ const void* data(const Protocol& protocol) const
{
- return &value_;
+ if (protocol.family() == PF_INET6)
+ return &ipv6_value_;
+ return &ipv4_value_;
}
// Get the size of the boolean data.
template <typename Protocol>
- std::size_t size(const Protocol&) const
+ std::size_t size(const Protocol& protocol) const
{
- return sizeof(value_);
+ if (protocol.family() == PF_INET6)
+ return sizeof(ipv6_value_);
+ return sizeof(ipv4_value_);
}
// Set the size of the boolean data.
template <typename Protocol>
- void resize(const Protocol&, std::size_t s)
+ void resize(const Protocol& protocol, std::size_t s)
{
- if (s != sizeof(value_))
- throw std::length_error("boolean socket option resize");
+ if (protocol.family() == PF_INET6)
+ {
+ if (s != sizeof(ipv6_value_))
+ {
+ throw std::length_error(
+ "multicast_enable_loopback socket option resize");
+ }
+ ipv4_value_ = ipv6_value_ ? 1 : 0;
+ }
+ else
+ {
+ if (s != sizeof(ipv4_value_))
+ {
+ throw std::length_error(
+ "multicast_enable_loopback socket option resize");
+ }
+ ipv6_value_ = ipv4_value_ ? 1 : 0;
+ }
}
private:
- value_type value_;
+ ipv4_value_type ipv4_value_;
+ ipv6_value_type ipv6_value_;
};
// Helper template for implementing unicast hops options.
@@ -207,6 +238,10 @@
{
if (s != sizeof(value_))
throw std::length_error("unicast hops socket option resize");
+#if defined(__hpux)
+ if (value_ < 0)
+ value_ = value_ & 0xFF;
+#endif
}
private:
@@ -478,7 +513,7 @@
}
// Construct with IPv6 interface.
- explicit network_interface(unsigned long ipv6_interface)
+ explicit network_interface(unsigned int ipv6_interface)
{
ipv4_value_.s_addr =
boost::asio::detail::socket_ops::host_to_network_long(
@@ -524,7 +559,7 @@
private:
boost::asio::detail::in4_addr_type ipv4_value_;
- unsigned long ipv6_value_;
+ unsigned int ipv6_value_;
};
} // namespace socket_option
Modified: trunk/boost/asio/ip/multicast.hpp
==============================================================================
--- trunk/boost/asio/ip/multicast.hpp (original)
+++ trunk/boost/asio/ip/multicast.hpp 2007-10-24 09:23:59 EDT (Wed, 24 Oct 2007)
@@ -168,7 +168,7 @@
#if defined(GENERATING_DOCUMENTATION)
typedef implementation_defined enable_loopback;
#else
-typedef boost::asio::ip::detail::socket_option::boolean<
+typedef boost::asio::ip::detail::socket_option::multicast_enable_loopback<
IPPROTO_IP, IP_MULTICAST_LOOP, IPPROTO_IPV6, IPV6_MULTICAST_LOOP>
enable_loopback;
#endif
Modified: trunk/libs/asio/test/ip/multicast.cpp
==============================================================================
--- trunk/libs/asio/test/ip/multicast.cpp (original)
+++ trunk/libs/asio/test/ip/multicast.cpp 2007-10-24 09:23:59 EDT (Wed, 24 Oct 2007)
@@ -131,7 +131,7 @@
BOOST_CHECK(!have_v4 || !ec);
const ip::address multicast_address_v6 =
- ip::address::from_string("ff31::8000:1234", ec);
+ ip::address::from_string("ff01::1", ec);
BOOST_CHECK(!have_v6 || !ec);
// join_group class.
@@ -178,7 +178,11 @@
if (have_v6)
{
+#if defined(__hpux)
+ ip::multicast::outbound_interface outbound_interface(if_nametoindex("lo0"));
+#else
ip::multicast::outbound_interface outbound_interface(1);
+#endif
sock_v6.set_option(outbound_interface, ec);
BOOST_CHECK_MESSAGE(!ec, ec.value() << ", " << ec.message());
}
Boost-Commit list run by bdawes at acm.org, david.abrahams at rcn.com, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk