diff options
author | sma <sma@ae88bc3d-4319-0410-8dbf-d08b4c9d3795> | 2012-12-17 13:59:23 +0000 |
---|---|---|
committer | sma <sma@ae88bc3d-4319-0410-8dbf-d08b4c9d3795> | 2012-12-17 13:59:23 +0000 |
commit | 6ef5daa154dff2276c1b1b356391bb92eb237d31 (patch) | |
tree | e205d537f7cd8fcdb791fb0394f90a13d854ccc1 /ACE/ace/SOCK_Dgram.cpp | |
parent | dae928b1a5fba955e09955c1a65446381ef9733c (diff) | |
download | ATCD-6ef5daa154dff2276c1b1b356391bb92eb237d31.tar.gz |
Mon Dec 17 13:40:00 UTC 2012 Simon Massey <simon dot massey at prismtech dot com>
ace/SOCK_Dgram.cpp, TAO/orbsvcs/tests/Miop/McastHello/svc.conf: -ORBListenOnAll bug in older linuxes.
CE_SOCK_Dgram_Mcast::
Diffstat (limited to 'ACE/ace/SOCK_Dgram.cpp')
-rw-r--r-- | ACE/ace/SOCK_Dgram.cpp | 30 |
1 files changed, 21 insertions, 9 deletions
diff --git a/ACE/ace/SOCK_Dgram.cpp b/ACE/ace/SOCK_Dgram.cpp index d451b94bee8..4195e439371 100644 --- a/ACE/ace/SOCK_Dgram.cpp +++ b/ACE/ace/SOCK_Dgram.cpp @@ -543,7 +543,7 @@ ACE_SOCK_Dgram::make_multicast_ifaddr (ip_mreq *ret_mreq, const ACE_INET_Addr &mcast_addr, const ACE_TCHAR *net_if) { - ACE_TRACE ("ACE_SOCK_Dgram_Mcast::make_multicast_ifaddr"); + ACE_TRACE ("ACE_SOCK_Dgram::make_multicast_ifaddr"); ip_mreq lmreq; // Scratch copy. if (net_if != 0) { @@ -556,17 +556,29 @@ ACE_SOCK_Dgram::make_multicast_ifaddr (ip_mreq *ret_mreq, ACE_HTONL (interface_addr.get_ip_address ()); #else ifreq if_address; - ACE_OS::strcpy (if_address.ifr_name, ACE_TEXT_ALWAYS_CHAR (net_if)); - if (ACE_OS::ioctl (this->get_handle (), SIOCGIFADDR, &if_address) == -1) - return -1; - - sockaddr_in *socket_address = - reinterpret_cast<sockaddr_in*> (&if_address.ifr_addr); - lmreq.imr_interface.s_addr = socket_address->sin_addr.s_addr; + { + // The net_if name failed to be found. It seems that older linux + // kernals only support the actual interface name (eg. "eth0"), + // not the IP address string of the interface (eg. "192.168.0.1"), + // which newer kernals seem to automatically translate. + // So assume that we have been given an IP Address and translate + // that instead, similar to the above for windows. + ACE_INET_Addr interface_addr; + if (interface_addr.set (mcast_addr.get_port_number (), net_if) == -1) + return -1; // Still doesn't work, unknown device specified. + lmreq.imr_interface.s_addr = + ACE_HTONL (interface_addr.get_ip_address ()); + } + else + { + sockaddr_in *socket_address = + reinterpret_cast<sockaddr_in*> (&if_address.ifr_addr); + lmreq.imr_interface.s_addr = socket_address->sin_addr.s_addr; + } #endif /* ACE_WIN32 || __INTERIX */ } else @@ -589,7 +601,7 @@ ACE_SOCK_Dgram::make_multicast_ifaddr6 (ipv6_mreq *ret_mreq, const ACE_INET_Addr &mcast_addr, const ACE_TCHAR *net_if) { - ACE_TRACE ("ACE_SOCK_Dgram_Mcast::make_multicast_ifaddr6"); + ACE_TRACE ("ACE_SOCK_Dgram::make_multicast_ifaddr6"); ipv6_mreq lmreq; // Scratch copy. ACE_OS::memset (&lmreq, |