summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAdam Mitz <mitza@ociweb.com>2016-01-05 12:59:32 -0600
committerAdam Mitz <mitza@ociweb.com>2016-01-05 12:59:32 -0600
commite707d29c516aee52cfee2bfe2ea676c87d554381 (patch)
tree0b9703364fd3ebe41e4c24afee5012ee8991f19c
parent01649e2dbed53c38dd5fcfb5195ed71b823fc16f (diff)
downloadATCD-e707d29c516aee52cfee2bfe2ea676c87d554381.tar.gz
VxWorks: implemented ACE_OS::getmacaddress in terms of a sysctl.
-rw-r--r--ACE/ace/OS_NS_netdb.cpp56
-rw-r--r--ACE/tests/Bug_3744_Regression_Test.cpp6
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 */
}