summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSteve Huston <shuston@riverace.com>2013-01-03 22:56:21 +0000
committerSteve Huston <shuston@riverace.com>2013-01-03 22:56:21 +0000
commitf74cdd2acd0efe08fc0dd0f9bba9b27c368620b9 (patch)
tree423d52ba6550d00d0dcf10d7b3a76b53d2a66846
parent06606e0984cc1e1753d459d4363e04f20e226287 (diff)
downloadATCD-f74cdd2acd0efe08fc0dd0f9bba9b27c368620b9.tar.gz
ChangeLogTag:Thu Jan 3 22:53:44 UTC 2013 Steve Huston <shuston@riverace.com>
-rw-r--r--ChangeLog8
-rw-r--r--ace/OS_NS_netdb.cpp33
-rw-r--r--tests/Bug_3744_Regression_Test.cpp4
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 <shuston@riverace.com>
+
+ * 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 <shuston@riverace.com>
* 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 */