diff options
author | Steve Huston <shuston@riverace.com> | 2013-01-03 22:56:21 +0000 |
---|---|---|
committer | Steve Huston <shuston@riverace.com> | 2013-01-03 22:56:21 +0000 |
commit | f74cdd2acd0efe08fc0dd0f9bba9b27c368620b9 (patch) | |
tree | 423d52ba6550d00d0dcf10d7b3a76b53d2a66846 | |
parent | 06606e0984cc1e1753d459d4363e04f20e226287 (diff) | |
download | ATCD-f74cdd2acd0efe08fc0dd0f9bba9b27c368620b9.tar.gz |
ChangeLogTag:Thu Jan 3 22:53:44 UTC 2013 Steve Huston <shuston@riverace.com>
-rw-r--r-- | ChangeLog | 8 | ||||
-rw-r--r-- | ace/OS_NS_netdb.cpp | 33 | ||||
-rw-r--r-- | 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 <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 */ |