summaryrefslogtreecommitdiff
path: root/ACE/ace/OS_NS_netdb.cpp
diff options
context:
space:
mode:
authorSteve Huston <shuston@riverace.com>2013-01-03 22:58:50 +0000
committerSteve Huston <shuston@riverace.com>2013-01-03 22:58:50 +0000
commit516cdd9c5b59c8840d6851868859f65e77c9d790 (patch)
tree5c91650d07cc43dcb131d51a807c23e3339dff59 /ACE/ace/OS_NS_netdb.cpp
parent8898a213ef785910c11c112efb21143a400c94b0 (diff)
downloadATCD-516cdd9c5b59c8840d6851868859f65e77c9d790.tar.gz
ChangeLogTag:Thu Jan 3 22:53:44 UTC 2013 Steve Huston <shuston@riverace.com>
Diffstat (limited to 'ACE/ace/OS_NS_netdb.cpp')
-rw-r--r--ACE/ace/OS_NS_netdb.cpp33
1 files changed, 31 insertions, 2 deletions
diff --git a/ACE/ace/OS_NS_netdb.cpp b/ACE/ace/OS_NS_netdb.cpp
index cd3608a9b9b..345870838c0 100644
--- a/ACE/ace/OS_NS_netdb.cpp
+++ b/ACE/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);