summaryrefslogtreecommitdiff
path: root/ACE/ace/SOCK_Dgram.cpp
diff options
context:
space:
mode:
authorsma <sma@ae88bc3d-4319-0410-8dbf-d08b4c9d3795>2012-12-17 13:59:23 +0000
committersma <sma@ae88bc3d-4319-0410-8dbf-d08b4c9d3795>2012-12-17 13:59:23 +0000
commit6ef5daa154dff2276c1b1b356391bb92eb237d31 (patch)
treee205d537f7cd8fcdb791fb0394f90a13d854ccc1 /ACE/ace/SOCK_Dgram.cpp
parentdae928b1a5fba955e09955c1a65446381ef9733c (diff)
downloadATCD-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.cpp30
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,