diff options
author | Adam Mitz <mitza@ociweb.com> | 2016-01-05 12:59:32 -0600 |
---|---|---|
committer | Adam Mitz <mitza@ociweb.com> | 2016-01-05 12:59:32 -0600 |
commit | e707d29c516aee52cfee2bfe2ea676c87d554381 (patch) | |
tree | 0b9703364fd3ebe41e4c24afee5012ee8991f19c | |
parent | 01649e2dbed53c38dd5fcfb5195ed71b823fc16f (diff) | |
download | ATCD-e707d29c516aee52cfee2bfe2ea676c87d554381.tar.gz |
VxWorks: implemented ACE_OS::getmacaddress in terms of a sysctl.
-rw-r--r-- | ACE/ace/OS_NS_netdb.cpp | 56 | ||||
-rw-r--r-- | ACE/tests/Bug_3744_Regression_Test.cpp | 6 |
2 files changed, 62 insertions, 0 deletions
diff --git a/ACE/ace/OS_NS_netdb.cpp b/ACE/ace/OS_NS_netdb.cpp index 5732fd3c05b..fd370b1bff1 100644 --- a/ACE/ace/OS_NS_netdb.cpp +++ b/ACE/ace/OS_NS_netdb.cpp @@ -25,6 +25,10 @@ #include "ace/OS_NS_devctl.h" #endif +#ifdef ACE_VXWORKS +# include "ace/os_include/sys/os_sysctl.h" +#endif + #ifdef ACE_HAS_ALLOC_HOOKS # include "ace/Malloc_Base.h" #endif @@ -362,6 +366,58 @@ ACE_OS::getmacaddress (struct macaddr_node_t *node) return 0; +#elif defined ACE_VXWORKS + + int name[] = {CTL_NET, AF_ROUTE, 0, 0, NET_RT_IFLIST, 0}; + static const size_t name_elts = sizeof name / sizeof name[0]; + + size_t result_sz = 0u; + if (sysctl (name, name_elts, 0, &result_sz, 0, 0u) != 0) + return -1; + +# ifdef ACE_HAS_ALLOC_HOOKS + char *const result = + static_cast<char *> (ACE_Allocator::instance ()->malloc (result_sz)); +# define ACE_NETDB_CLEANUP ACE_Allocator::instance ()->free (result) +# else + char *const result = static_cast<char *> (ACE_OS::malloc (result_sz)); +# define ACE_NETDB_CLEANUP ACE_OS::free (result) +# endif + + if (sysctl (name, name_elts, result, &result_sz, 0, 0u) != 0) + { + ACE_NETDB_CLEANUP; + return -1; + } + + for (size_t pos = 0, n; pos + sizeof (if_msghdr) < result_sz; pos += n) + { + if_msghdr *const hdr = reinterpret_cast<if_msghdr *> (result + pos); + n = hdr->ifm_msglen; + sockaddr_dl *const addr = + reinterpret_cast<sockaddr_dl *> (result + pos + sizeof (if_msghdr)); + + if (addr->sdl_alen >= sizeof node->node) + { + ACE_OS::memcpy (node->node, LLADDR (addr), sizeof node->node); + ACE_NETDB_CLEANUP; + return 0; + } + + while (pos + n < result_sz) + { + ifa_msghdr *const ifa = + reinterpret_cast<ifa_msghdr *> (result + pos + n); + if (ifa->ifam_type != RTM_NEWADDR) + break; + n += ifa->ifam_msglen; + } + } + + ACE_NETDB_CLEANUP; +# undef ACE_NETDB_CLEANUP + return -1; + #else ACE_UNUSED_ARG (node); ACE_NOTSUP_RETURN (-1); diff --git a/ACE/tests/Bug_3744_Regression_Test.cpp b/ACE/tests/Bug_3744_Regression_Test.cpp index 481fe7f526a..b557fdd9710 100644 --- a/ACE/tests/Bug_3744_Regression_Test.cpp +++ b/ACE/tests/Bug_3744_Regression_Test.cpp @@ -36,6 +36,12 @@ getmacaddress_test (void) ACE_TEXT ("ACE_OS::getmacaddress() returned %d, should be 0. %p\n"), retval, ACE_TEXT ("error:"))); } + + ACE_DEBUG ((LM_DEBUG, + ACE_TEXT ("MAC address: %02x:%02x:%02x:%02x:%02x:%02x\n"), + node.node[0], node.node[1], node.node[2], + node.node[3], node.node[4], node.node[5])); + return retval; #endif /* ACE_LACKS_NETWORKING */ } |