Provide backfill s6_addr16 on BSD platforms
authorSara Golemon <sgolemon@fb.com>
Tue, 23 Jun 2015 22:44:37 +0000 (15:44 -0700)
committerSara Golemon <sgolemon@fb.com>
Wed, 24 Jun 2015 16:41:05 +0000 (09:41 -0700)
Summary: Extend the MacOS s6_addr16 hack to Net/Open/FreeBSD

Closes #106

Reviewed By: @JoelMarcey

Differential Revision: D2182912

folly/detail/IPAddress.h
folly/test/IPAddressTest.cpp

index 5d7df8cde651db4c4bb06739b3f8be25fe219beb..0ebd76f7459280b7a624e9c039e9b48026f34213 100644 (file)
@@ -46,8 +46,12 @@ extern "C" {
 #include <folly/Conv.h>
 #include <folly/Format.h>
 
-#if defined(__APPLE__) && !defined(s6_addr16)
-# define s6_addr16 __u6_addr.__u6_addr16
+// BSDish platforms don't provide standard access to s6_addr16
+#ifndef s6_addr16
+# if defined(__APPLE__) || defined(__FreeBSD__) || \
+     defined(__NetBSD__) || defined(__OpenBSD__)
+#  define s6_addr16 __u6_addr.__u6_addr16
+# endif
 #endif
 
 namespace folly { namespace detail {
index 2e62f5d173c9df416e75f96ff671fbf4bc240d53..cb1bc108c0a0f4ff5e890244573d42e845daa9c1 100644 (file)
@@ -815,6 +815,19 @@ TEST(IPAddress, InvalidBBitAccess) {
   EXPECT_THROW(asV6.getNthLSBit(-1), std::invalid_argument);
 }
 
+TEST(IPAddress, StringFormat) {
+  in6_addr a6;
+  for (int i = 0; i < 8; ++i) {
+    a6.s6_addr16[i] = htons(0x0123 + ((i%4) * 0x4444));
+  }
+  EXPECT_EQ("0123:4567:89ab:cdef:0123:4567:89ab:cdef",
+            detail::fastIpv6ToString(a6));
+
+  in_addr a4;
+  a4.s_addr = htonl(0x01020304);
+  EXPECT_EQ("1.2.3.4", detail::fastIpv4ToString(a4));
+}
+
 TEST(IPAddress, LongestCommonPrefix) {
   IPAddress ip10("10.0.0.0");
   IPAddress ip11("11.0.0.0");