From f74cdd2acd0efe08fc0dd0f9bba9b27c368620b9 Mon Sep 17 00:00:00 2001 From: Steve Huston Date: Thu, 3 Jan 2013 22:56:21 +0000 Subject: ChangeLogTag:Thu Jan 3 22:53:44 UTC 2013 Steve Huston --- ChangeLog | 8 ++++++++ ace/OS_NS_netdb.cpp | 33 +++++++++++++++++++++++++++++++-- tests/Bug_3744_Regression_Test.cpp | 4 ++-- 3 files changed, 41 insertions(+), 4 deletions(-) diff --git a/ChangeLog b/ChangeLog index 3481742e934..968990263b3 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,11 @@ +Thu Jan 3 22:53:44 UTC 2013 Steve Huston + + * ace/OS_NS_netdb.cpp (ACE_OS::getmacaddress): On Linux, search for + an interface to get the MAC address for; don't assume eth0 is + present and usable. + + * tests/Bug_3744_Regression_Test.cpp: Fix ACE_LOG_MSG output. + Thu Nov 29 16:30:34 EST 2012 Steve Huston * ACE version 6.1d released. diff --git a/ace/OS_NS_netdb.cpp b/ace/OS_NS_netdb.cpp index cd3608a9b9b..345870838c0 100644 --- a/ace/OS_NS_netdb.cpp +++ b/ace/OS_NS_netdb.cpp @@ -15,6 +15,10 @@ #include "ace/OS_NS_stropts.h" #include "ace/OS_NS_sys_socket.h" +#if defined (ACE_LINUX) && !defined (ACE_LACKS_NETWORKING) +# include "ace/os_include/os_ifaddrs.h" +#endif /* ACE_LINUX && !ACE_LACKS_NETWORKING */ + // Include if_arp so that getmacaddr can use the // arp structure. #if defined (sun) @@ -166,7 +170,34 @@ ACE_OS::getmacaddress (struct macaddr_node_t *node) #elif defined (ACE_LINUX) && !defined (ACE_LACKS_NETWORKING) + // It's easiest to know the first MAC-using interface. Use the BSD + // getifaddrs function that simplifies access to connected interfaces. + struct ifaddrs *ifap = 0; + struct ifaddrs *p_if = 0; + + if (::getifaddrs (&ifap) != 0) + return -1; + + for (p_if = ifap; p_if != 0; p_if = p_if->ifa_next) + { + if (p_if->ifa_addr == 0) + continue; + + // Check to see if it's up and is not either PPP or loopback + if ((p_if->ifa_flags & IFF_UP) == IFF_UP && + (p_if->ifa_flags & (IFF_LOOPBACK | IFF_POINTOPOINT)) == 0) + break; + } + if (p_if == 0) + { + errno = ENODEV; + ::freeifaddrs (ifap); + return -1; + } + struct ifreq ifr; + ACE_OS::strcpy (ifr.ifr_name, p_if->ifa_name); + ::freeifaddrs (ifap); ACE_HANDLE handle = ACE_OS::socket (PF_INET, SOCK_DGRAM, 0); @@ -174,8 +205,6 @@ ACE_OS::getmacaddress (struct macaddr_node_t *node) if (handle == ACE_INVALID_HANDLE) return -1; - ACE_OS::strcpy (ifr.ifr_name, "eth0"); - if (ACE_OS::ioctl (handle/*s*/, SIOCGIFHWADDR, &ifr) < 0) { ACE_OS::close (handle); diff --git a/tests/Bug_3744_Regression_Test.cpp b/tests/Bug_3744_Regression_Test.cpp index c7adc481517..5743e193d4b 100644 --- a/tests/Bug_3744_Regression_Test.cpp +++ b/tests/Bug_3744_Regression_Test.cpp @@ -35,8 +35,8 @@ getmacaddress_test (void) else { ACE_ERROR ((LM_ERROR, - ACE_TEXT ("ACE_OS::getmacaddress() returned %d, should be 0\n"), - retval)); + ACE_TEXT ("ACE_OS::getmacaddress() returned %d, should be 0. %p\n"), + retval, ACE_TEXT ("error:"))); } return retval; #endif /* ACE_LACKS_NETWORKING */ -- cgit v1.2.1