Index: ppapi/shared_impl/private/net_address_private_impl.cc |
diff --git a/ppapi/shared_impl/private/net_address_private_impl.cc b/ppapi/shared_impl/private/net_address_private_impl.cc |
index 5edf5a4a38b0a849f8657cf9dd142c26a45e5970..d0d3ac5c68809c456f16219ea979d0bcace2eb2e 100644 |
--- a/ppapi/shared_impl/private/net_address_private_impl.cc |
+++ b/ppapi/shared_impl/private/net_address_private_impl.cc |
@@ -28,6 +28,9 @@ |
#endif |
#if defined(OS_WIN) |
+// The type of |sockaddr::sa_family|. |
+typedef ADDRESS_FAMILY sa_family_t; |
+ |
#define s6_addr16 u.Word |
#endif |
@@ -48,37 +51,58 @@ COMPILE_ASSERT(sizeof(reinterpret_cast<PP_NetAddress_Private*>(0)->data) >= |
sizeof(sockaddr_storage), PP_NetAddress_Private_data_too_small); |
#endif |
-uint16_t GetFamily(const PP_NetAddress_Private* addr) { |
+sa_family_t GetFamilyInternal(const PP_NetAddress_Private* addr) { |
return reinterpret_cast<const sockaddr*>(addr->data)->sa_family; |
} |
-uint16_t GetPort(const PP_NetAddress_Private* addr) { |
- if (GetFamily(addr) == AF_INET) { |
- const sockaddr_in* a = reinterpret_cast<const sockaddr_in*>(addr->data); |
- return ntohs(a->sin_port); |
- } else if (GetFamily(addr) == AF_INET6) { |
- const sockaddr_in6* a = reinterpret_cast<const sockaddr_in6*>(addr->data); |
- return ntohs(a->sin6_port); |
+PP_NetAddressFamily_Private GetFamily(const PP_NetAddress_Private* addr) { |
+ switch (GetFamilyInternal(addr)) { |
+ case AF_INET: |
+ return PP_NETADDRESSFAMILY_IPV4; |
+ case AF_INET6: |
+ return PP_NETADDRESSFAMILY_IPV6; |
+ default: |
+ return PP_NETADDRESSFAMILY_UNSPECIFIED; |
} |
+} |
- return 0; |
+uint16_t GetPort(const PP_NetAddress_Private* addr) { |
+ switch (GetFamilyInternal(addr)) { |
+ case AF_INET: { |
+ const sockaddr_in* a = reinterpret_cast<const sockaddr_in*>(addr->data); |
+ return ntohs(a->sin_port); |
+ } |
+ case AF_INET6: { |
+ const sockaddr_in6* a = reinterpret_cast<const sockaddr_in6*>(addr->data); |
+ return ntohs(a->sin6_port); |
+ } |
+ default: |
+ return 0; |
+ } |
} |
PP_Bool GetAddress(const PP_NetAddress_Private* addr, |
void* address, |
uint16_t address_size) { |
- if (GetFamily(addr) == AF_INET) { |
- const sockaddr_in* a = reinterpret_cast<const sockaddr_in*>(addr->data); |
- if (address_size >= sizeof(a->sin_addr.s_addr)) { |
- memcpy(address, &(a->sin_addr.s_addr), sizeof(a->sin_addr.s_addr)); |
- return PP_TRUE; |
+ switch (GetFamilyInternal(addr)) { |
+ case AF_INET: { |
+ const sockaddr_in* a = reinterpret_cast<const sockaddr_in*>(addr->data); |
+ if (address_size >= sizeof(a->sin_addr.s_addr)) { |
+ memcpy(address, &(a->sin_addr.s_addr), sizeof(a->sin_addr.s_addr)); |
+ return PP_TRUE; |
+ } |
+ break; |
} |
- } else if (GetFamily(addr) == AF_INET6) { |
- const sockaddr_in6* a = reinterpret_cast<const sockaddr_in6*>(addr->data); |
- if (address_size >= sizeof(a->sin6_addr.s6_addr)) { |
- memcpy(address, &(a->sin6_addr.s6_addr), sizeof(a->sin6_addr.s6_addr)); |
- return PP_TRUE; |
+ case AF_INET6: { |
+ const sockaddr_in6* a = reinterpret_cast<const sockaddr_in6*>(addr->data); |
+ if (address_size >= sizeof(a->sin6_addr.s6_addr)) { |
+ memcpy(address, &(a->sin6_addr.s6_addr), sizeof(a->sin6_addr.s6_addr)); |
+ return PP_TRUE; |
+ } |
+ break; |
} |
+ default: |
+ break; |
} |
return PP_FALSE; |
@@ -90,25 +114,29 @@ PP_Bool AreHostsEqual(const PP_NetAddress_Private* addr1, |
!NetAddressPrivateImpl::ValidateNetAddress(*addr2)) |
return PP_FALSE; |
- if (GetFamily(addr1) != GetFamily(addr2)) |
+ sa_family_t addr1_family = GetFamilyInternal(addr1); |
+ if (addr1_family != GetFamilyInternal(addr2)) |
return PP_FALSE; |
- if (GetFamily(addr1) == AF_INET) { |
- const sockaddr_in* a1 = reinterpret_cast<const sockaddr_in*>(addr1->data); |
- const sockaddr_in* a2 = reinterpret_cast<const sockaddr_in*>(addr2->data); |
- return PP_FromBool(a1->sin_addr.s_addr == a2->sin_addr.s_addr); |
- } |
- |
- if (GetFamily(addr1) == AF_INET6) { |
- const sockaddr_in6* a1 = reinterpret_cast<const sockaddr_in6*>(addr1->data); |
- const sockaddr_in6* a2 = reinterpret_cast<const sockaddr_in6*>(addr2->data); |
- return PP_FromBool(a1->sin6_flowinfo == a2->sin6_flowinfo && |
- memcmp(&a1->sin6_addr, &a2->sin6_addr, |
- sizeof(a1->sin6_addr)) == 0 && |
- a1->sin6_scope_id == a2->sin6_scope_id); |
+ switch (addr1_family) { |
+ case AF_INET: { |
+ const sockaddr_in* a1 = reinterpret_cast<const sockaddr_in*>(addr1->data); |
+ const sockaddr_in* a2 = reinterpret_cast<const sockaddr_in*>(addr2->data); |
+ return PP_FromBool(a1->sin_addr.s_addr == a2->sin_addr.s_addr); |
+ } |
+ case AF_INET6: { |
+ const sockaddr_in6* a1 = |
+ reinterpret_cast<const sockaddr_in6*>(addr1->data); |
+ const sockaddr_in6* a2 = |
+ reinterpret_cast<const sockaddr_in6*>(addr2->data); |
+ return PP_FromBool(a1->sin6_flowinfo == a2->sin6_flowinfo && |
+ memcmp(&a1->sin6_addr, &a2->sin6_addr, |
+ sizeof(a1->sin6_addr)) == 0 && |
+ a1->sin6_scope_id == a2->sin6_scope_id); |
+ } |
+ default: |
+ return PP_FALSE; |
} |
- |
- return PP_FALSE; |
} |
PP_Bool AreEqual(const PP_NetAddress_Private* addr1, |
@@ -119,19 +147,22 @@ PP_Bool AreEqual(const PP_NetAddress_Private* addr1, |
return PP_FALSE; |
// Note: Here, we know that |addr1| and |addr2| have the same family. |
- if (GetFamily(addr1) == AF_INET) { |
- const sockaddr_in* a1 = reinterpret_cast<const sockaddr_in*>(addr1->data); |
- const sockaddr_in* a2 = reinterpret_cast<const sockaddr_in*>(addr2->data); |
- return PP_FromBool(a1->sin_port == a2->sin_port); |
- } |
- |
- if (GetFamily(addr1) == AF_INET6) { |
- const sockaddr_in6* a1 = reinterpret_cast<const sockaddr_in6*>(addr1->data); |
- const sockaddr_in6* a2 = reinterpret_cast<const sockaddr_in6*>(addr2->data); |
- return PP_FromBool(a1->sin6_port == a2->sin6_port); |
+ switch (GetFamilyInternal(addr1)) { |
+ case AF_INET: { |
+ const sockaddr_in* a1 = reinterpret_cast<const sockaddr_in*>(addr1->data); |
+ const sockaddr_in* a2 = reinterpret_cast<const sockaddr_in*>(addr2->data); |
+ return PP_FromBool(a1->sin_port == a2->sin_port); |
+ } |
+ case AF_INET6: { |
+ const sockaddr_in6* a1 = |
+ reinterpret_cast<const sockaddr_in6*>(addr1->data); |
+ const sockaddr_in6* a2 = |
+ reinterpret_cast<const sockaddr_in6*>(addr2->data); |
+ return PP_FromBool(a1->sin6_port == a2->sin6_port); |
+ } |
+ default: |
+ return PP_FALSE; |
} |
- |
- return PP_FALSE; |
} |
#if defined(OS_WIN) || defined(OS_MACOSX) |
@@ -236,7 +267,7 @@ PP_Var Describe(PP_Module /*module*/, |
// |getnameinfo()| collapses length-one runs of zeros (and also doesn't |
// display the scope). |
// TODO(viettrungluu): Consider switching to this on Linux. |
- switch (GetFamily(addr)) { |
+ switch (GetFamilyInternal(addr)) { |
case AF_INET: { |
const sockaddr_in* a = reinterpret_cast<const sockaddr_in*>(addr->data); |
return StringVar::StringToPPVar( |
@@ -268,19 +299,20 @@ PP_Bool ReplacePort(const struct PP_NetAddress_Private* src_addr, |
if (!NetAddressPrivateImpl::ValidateNetAddress(*src_addr)) |
return PP_FALSE; |
- if (GetFamily(src_addr) == AF_INET) { |
- memmove(dest_addr, src_addr, sizeof(*src_addr)); |
- reinterpret_cast<sockaddr_in*>(dest_addr->data)->sin_port = htons(port); |
- return PP_TRUE; |
- } |
- |
- if (GetFamily(src_addr) == AF_INET6) { |
- memmove(dest_addr, src_addr, sizeof(*src_addr)); |
- reinterpret_cast<sockaddr_in6*>(dest_addr->data)->sin6_port = htons(port); |
- return PP_TRUE; |
+ switch (GetFamilyInternal(src_addr)) { |
+ case AF_INET: { |
+ memmove(dest_addr, src_addr, sizeof(*src_addr)); |
+ reinterpret_cast<sockaddr_in*>(dest_addr->data)->sin_port = htons(port); |
+ return PP_TRUE; |
+ } |
+ case AF_INET6: { |
+ memmove(dest_addr, src_addr, sizeof(*src_addr)); |
+ reinterpret_cast<sockaddr_in6*>(dest_addr->data)->sin6_port = htons(port); |
+ return PP_TRUE; |
+ } |
+ default: |
+ return PP_FALSE; |
} |
- |
- return PP_FALSE; |
} |
void GetAnyAddress(PP_Bool is_ipv6, PP_NetAddress_Private* addr) { |
@@ -343,13 +375,20 @@ bool NetAddressPrivateImpl::ValidateNetAddress( |
return false; |
// TODO(viettrungluu): more careful validation? |
- // Just do a size check for AF_INET. |
- if (GetFamily(&addr) == AF_INET && addr.size >= sizeof(sockaddr_in)) |
- return true; |
- |
- // Ditto for AF_INET6. |
- if (GetFamily(&addr) == AF_INET6 && addr.size >= sizeof(sockaddr_in6)) |
- return true; |
+ switch (GetFamilyInternal(&addr)) { |
+ case AF_INET: |
+ // Just do a size check for AF_INET. |
+ if (addr.size >= sizeof(sockaddr_in)) |
+ return true; |
+ break; |
+ case AF_INET6: |
+ // Ditto for AF_INET6. |
+ if (addr.size >= sizeof(sockaddr_in6)) |
+ return true; |
+ break; |
+ default: |
+ break; |
+ } |
// Reject everything else. |
return false; |