diff options
author | Steve Huston <shuston@riverace.com> | 2013-01-03 22:58:50 +0000 |
---|---|---|
committer | Steve Huston <shuston@riverace.com> | 2013-01-03 22:58:50 +0000 |
commit | 516cdd9c5b59c8840d6851868859f65e77c9d790 (patch) | |
tree | 5c91650d07cc43dcb131d51a807c23e3339dff59 /ACE/ace/OS_NS_netdb.cpp | |
parent | 8898a213ef785910c11c112efb21143a400c94b0 (diff) | |
download | ATCD-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.cpp | 33 |
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); |