Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(204)

Side by Side Diff: ppapi/shared_impl/private/net_address_private_impl.cc

Issue 9398003: Change PPB_NetAddress_Private.GetFamily to return a PP_AddressFamily_Private value instead of uint1… (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 8 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "ppapi/shared_impl/private/net_address_private_impl.h" 5 #include "ppapi/shared_impl/private/net_address_private_impl.h"
6 6
7 #include <string.h> 7 #include <string.h>
8 8
9 #include <string> 9 #include <string>
10 10
(...skipping 30 matching lines...) Expand all
41 namespace { 41 namespace {
42 42
43 // This assert fails on OpenBSD for an unknown reason at the moment. 43 // This assert fails on OpenBSD for an unknown reason at the moment.
44 #if !defined(OS_OPENBSD) 44 #if !defined(OS_OPENBSD)
45 // Make sure the storage in |PP_NetAddress_Private| is big enough. (Do it here 45 // Make sure the storage in |PP_NetAddress_Private| is big enough. (Do it here
46 // since the data is opaque elsewhere.) 46 // since the data is opaque elsewhere.)
47 COMPILE_ASSERT(sizeof(reinterpret_cast<PP_NetAddress_Private*>(0)->data) >= 47 COMPILE_ASSERT(sizeof(reinterpret_cast<PP_NetAddress_Private*>(0)->data) >=
48 sizeof(sockaddr_storage), PP_NetAddress_Private_data_too_small); 48 sizeof(sockaddr_storage), PP_NetAddress_Private_data_too_small);
49 #endif 49 #endif
50 50
51 uint16_t GetFamily(const PP_NetAddress_Private* addr) { 51 PP_AddressFamily_Private GetFamily(const PP_NetAddress_Private* addr) {
52 return reinterpret_cast<const sockaddr*>(addr->data)->sa_family; 52 switch (reinterpret_cast<const sockaddr*>(addr->data)->sa_family) {
53 case AF_INET:
54 return PP_ADDRESSFAMILY_IPV4;
55 case AF_INET6:
56 return PP_ADDRESSFAMILY_IPV6;
57 default:
58 return PP_ADDRESSFAMILY_UNSPECIFIED;
59 }
53 } 60 }
54 61
55 uint16_t GetPort(const PP_NetAddress_Private* addr) { 62 uint16_t GetPort(const PP_NetAddress_Private* addr) {
56 if (GetFamily(addr) == AF_INET) { 63 if (GetFamily(addr) == PP_ADDRESSFAMILY_IPV4) {
viettrungluu 2012/02/15 01:43:03 Now that GetFamily() has a nontrivial cost, you sh
yzshen1 2012/02/15 18:40:55 Done. (I did both.) On 2012/02/15 01:43:03, viett
57 const sockaddr_in* a = reinterpret_cast<const sockaddr_in*>(addr->data); 64 const sockaddr_in* a = reinterpret_cast<const sockaddr_in*>(addr->data);
58 return ntohs(a->sin_port); 65 return ntohs(a->sin_port);
59 } else if (GetFamily(addr) == AF_INET6) { 66 } else if (GetFamily(addr) == PP_ADDRESSFAMILY_IPV6) {
60 const sockaddr_in6* a = reinterpret_cast<const sockaddr_in6*>(addr->data); 67 const sockaddr_in6* a = reinterpret_cast<const sockaddr_in6*>(addr->data);
61 return ntohs(a->sin6_port); 68 return ntohs(a->sin6_port);
62 } 69 }
63 70
64 return 0; 71 return 0;
65 } 72 }
66 73
67 PP_Bool GetAddress(const PP_NetAddress_Private* addr, 74 PP_Bool GetAddress(const PP_NetAddress_Private* addr,
68 void* address, 75 void* address,
69 uint16_t address_size) { 76 uint16_t address_size) {
70 if (GetFamily(addr) == AF_INET) { 77 if (GetFamily(addr) == PP_ADDRESSFAMILY_IPV4) {
viettrungluu 2012/02/15 01:43:03 "
yzshen1 2012/02/15 18:40:55 Done.
71 const sockaddr_in* a = reinterpret_cast<const sockaddr_in*>(addr->data); 78 const sockaddr_in* a = reinterpret_cast<const sockaddr_in*>(addr->data);
72 if (address_size >= sizeof(a->sin_addr.s_addr)) { 79 if (address_size >= sizeof(a->sin_addr.s_addr)) {
73 memcpy(address, &(a->sin_addr.s_addr), sizeof(a->sin_addr.s_addr)); 80 memcpy(address, &(a->sin_addr.s_addr), sizeof(a->sin_addr.s_addr));
74 return PP_TRUE; 81 return PP_TRUE;
75 } 82 }
76 } else if (GetFamily(addr) == AF_INET6) { 83 } else if (GetFamily(addr) == PP_ADDRESSFAMILY_IPV6) {
77 const sockaddr_in6* a = reinterpret_cast<const sockaddr_in6*>(addr->data); 84 const sockaddr_in6* a = reinterpret_cast<const sockaddr_in6*>(addr->data);
78 if (address_size >= sizeof(a->sin6_addr.s6_addr)) { 85 if (address_size >= sizeof(a->sin6_addr.s6_addr)) {
79 memcpy(address, &(a->sin6_addr.s6_addr), sizeof(a->sin6_addr.s6_addr)); 86 memcpy(address, &(a->sin6_addr.s6_addr), sizeof(a->sin6_addr.s6_addr));
80 return PP_TRUE; 87 return PP_TRUE;
81 } 88 }
82 } 89 }
83 90
84 return PP_FALSE; 91 return PP_FALSE;
85 } 92 }
86 93
87 PP_Bool AreHostsEqual(const PP_NetAddress_Private* addr1, 94 PP_Bool AreHostsEqual(const PP_NetAddress_Private* addr1,
88 const PP_NetAddress_Private* addr2) { 95 const PP_NetAddress_Private* addr2) {
89 if (!NetAddressPrivateImpl::ValidateNetAddress(*addr1) || 96 if (!NetAddressPrivateImpl::ValidateNetAddress(*addr1) ||
90 !NetAddressPrivateImpl::ValidateNetAddress(*addr2)) 97 !NetAddressPrivateImpl::ValidateNetAddress(*addr2))
91 return PP_FALSE; 98 return PP_FALSE;
92 99
93 if (GetFamily(addr1) != GetFamily(addr2)) 100 if (GetFamily(addr1) != GetFamily(addr2))
viettrungluu 2012/02/15 01:43:03 Similarly, save the family of addr1 and compare it
yzshen1 2012/02/15 18:40:55 Done.
94 return PP_FALSE; 101 return PP_FALSE;
95 102
96 if (GetFamily(addr1) == AF_INET) { 103 if (GetFamily(addr1) == PP_ADDRESSFAMILY_IPV4) {
97 const sockaddr_in* a1 = reinterpret_cast<const sockaddr_in*>(addr1->data); 104 const sockaddr_in* a1 = reinterpret_cast<const sockaddr_in*>(addr1->data);
98 const sockaddr_in* a2 = reinterpret_cast<const sockaddr_in*>(addr2->data); 105 const sockaddr_in* a2 = reinterpret_cast<const sockaddr_in*>(addr2->data);
99 return PP_FromBool(a1->sin_addr.s_addr == a2->sin_addr.s_addr); 106 return PP_FromBool(a1->sin_addr.s_addr == a2->sin_addr.s_addr);
100 } 107 }
101 108
102 if (GetFamily(addr1) == AF_INET6) { 109 if (GetFamily(addr1) == PP_ADDRESSFAMILY_IPV6) {
103 const sockaddr_in6* a1 = reinterpret_cast<const sockaddr_in6*>(addr1->data); 110 const sockaddr_in6* a1 = reinterpret_cast<const sockaddr_in6*>(addr1->data);
104 const sockaddr_in6* a2 = reinterpret_cast<const sockaddr_in6*>(addr2->data); 111 const sockaddr_in6* a2 = reinterpret_cast<const sockaddr_in6*>(addr2->data);
105 return PP_FromBool(a1->sin6_flowinfo == a2->sin6_flowinfo && 112 return PP_FromBool(a1->sin6_flowinfo == a2->sin6_flowinfo &&
106 memcmp(&a1->sin6_addr, &a2->sin6_addr, 113 memcmp(&a1->sin6_addr, &a2->sin6_addr,
107 sizeof(a1->sin6_addr)) == 0 && 114 sizeof(a1->sin6_addr)) == 0 &&
108 a1->sin6_scope_id == a2->sin6_scope_id); 115 a1->sin6_scope_id == a2->sin6_scope_id);
109 } 116 }
110 117
111 return PP_FALSE; 118 return PP_FALSE;
112 } 119 }
113 120
114 PP_Bool AreEqual(const PP_NetAddress_Private* addr1, 121 PP_Bool AreEqual(const PP_NetAddress_Private* addr1,
115 const PP_NetAddress_Private* addr2) { 122 const PP_NetAddress_Private* addr2) {
116 // |AreHostsEqual()| will also validate the addresses and return false if 123 // |AreHostsEqual()| will also validate the addresses and return false if
117 // either is invalid. 124 // either is invalid.
118 if (!AreHostsEqual(addr1, addr2)) 125 if (!AreHostsEqual(addr1, addr2))
119 return PP_FALSE; 126 return PP_FALSE;
120 127
121 // Note: Here, we know that |addr1| and |addr2| have the same family. 128 // Note: Here, we know that |addr1| and |addr2| have the same family.
122 if (GetFamily(addr1) == AF_INET) { 129 if (GetFamily(addr1) == PP_ADDRESSFAMILY_IPV4) {
123 const sockaddr_in* a1 = reinterpret_cast<const sockaddr_in*>(addr1->data); 130 const sockaddr_in* a1 = reinterpret_cast<const sockaddr_in*>(addr1->data);
124 const sockaddr_in* a2 = reinterpret_cast<const sockaddr_in*>(addr2->data); 131 const sockaddr_in* a2 = reinterpret_cast<const sockaddr_in*>(addr2->data);
125 return PP_FromBool(a1->sin_port == a2->sin_port); 132 return PP_FromBool(a1->sin_port == a2->sin_port);
126 } 133 }
127 134
128 if (GetFamily(addr1) == AF_INET6) { 135 if (GetFamily(addr1) == PP_ADDRESSFAMILY_IPV6) {
129 const sockaddr_in6* a1 = reinterpret_cast<const sockaddr_in6*>(addr1->data); 136 const sockaddr_in6* a1 = reinterpret_cast<const sockaddr_in6*>(addr1->data);
130 const sockaddr_in6* a2 = reinterpret_cast<const sockaddr_in6*>(addr2->data); 137 const sockaddr_in6* a2 = reinterpret_cast<const sockaddr_in6*>(addr2->data);
131 return PP_FromBool(a1->sin6_port == a2->sin6_port); 138 return PP_FromBool(a1->sin6_port == a2->sin6_port);
132 } 139 }
133 140
134 return PP_FALSE; 141 return PP_FALSE;
135 } 142 }
136 143
137 #if defined(OS_WIN) || defined(OS_MACOSX) 144 #if defined(OS_WIN) || defined(OS_MACOSX)
138 std::string ConvertIPv4AddressToString(const sockaddr_in* a, 145 std::string ConvertIPv4AddressToString(const sockaddr_in* a,
(...skipping 91 matching lines...) Expand 10 before | Expand all | Expand 10 after
230 if (!NetAddressPrivateImpl::ValidateNetAddress(*addr)) 237 if (!NetAddressPrivateImpl::ValidateNetAddress(*addr))
231 return PP_MakeUndefined(); 238 return PP_MakeUndefined();
232 239
233 #if defined(OS_WIN) || defined(OS_MACOSX) 240 #if defined(OS_WIN) || defined(OS_MACOSX)
234 // On Windows, |NetAddressToString()| doesn't work in the sandbox. On Mac, 241 // On Windows, |NetAddressToString()| doesn't work in the sandbox. On Mac,
235 // the output isn't consistent with RFC 5952, at least on Mac OS 10.6: 242 // the output isn't consistent with RFC 5952, at least on Mac OS 10.6:
236 // |getnameinfo()| collapses length-one runs of zeros (and also doesn't 243 // |getnameinfo()| collapses length-one runs of zeros (and also doesn't
237 // display the scope). 244 // display the scope).
238 // TODO(viettrungluu): Consider switching to this on Linux. 245 // TODO(viettrungluu): Consider switching to this on Linux.
239 switch (GetFamily(addr)) { 246 switch (GetFamily(addr)) {
240 case AF_INET: { 247 case PP_ADDRESSFAMILY_IPV4: {
241 const sockaddr_in* a = reinterpret_cast<const sockaddr_in*>(addr->data); 248 const sockaddr_in* a = reinterpret_cast<const sockaddr_in*>(addr->data);
242 return StringVar::StringToPPVar( 249 return StringVar::StringToPPVar(
243 ConvertIPv4AddressToString(a, !!include_port)); 250 ConvertIPv4AddressToString(a, !!include_port));
244 } 251 }
245 case AF_INET6: { 252 case PP_ADDRESSFAMILY_IPV6: {
246 const sockaddr_in6* a = reinterpret_cast<const sockaddr_in6*>(addr->data); 253 const sockaddr_in6* a = reinterpret_cast<const sockaddr_in6*>(addr->data);
247 return StringVar::StringToPPVar( 254 return StringVar::StringToPPVar(
248 ConvertIPv6AddressToString(a, !!include_port)); 255 ConvertIPv6AddressToString(a, !!include_port));
249 } 256 }
250 default: 257 default:
251 NOTREACHED(); 258 NOTREACHED();
252 break; 259 break;
253 } 260 }
254 return PP_MakeUndefined(); 261 return PP_MakeUndefined();
255 #else 262 #else
256 const sockaddr* a = reinterpret_cast<const sockaddr*>(addr->data); 263 const sockaddr* a = reinterpret_cast<const sockaddr*>(addr->data);
257 socklen_t l = addr->size; 264 socklen_t l = addr->size;
258 std::string description = 265 std::string description =
259 include_port ? net::NetAddressToStringWithPort(a, l) : 266 include_port ? net::NetAddressToStringWithPort(a, l) :
260 net::NetAddressToString(a, l); 267 net::NetAddressToString(a, l);
261 return StringVar::StringToPPVar(description); 268 return StringVar::StringToPPVar(description);
262 #endif 269 #endif
263 } 270 }
264 271
265 PP_Bool ReplacePort(const struct PP_NetAddress_Private* src_addr, 272 PP_Bool ReplacePort(const struct PP_NetAddress_Private* src_addr,
266 uint16_t port, 273 uint16_t port,
267 struct PP_NetAddress_Private* dest_addr) { 274 struct PP_NetAddress_Private* dest_addr) {
268 if (!NetAddressPrivateImpl::ValidateNetAddress(*src_addr)) 275 if (!NetAddressPrivateImpl::ValidateNetAddress(*src_addr))
269 return PP_FALSE; 276 return PP_FALSE;
270 277
271 if (GetFamily(src_addr) == AF_INET) { 278 if (GetFamily(src_addr) == PP_ADDRESSFAMILY_IPV4) {
viettrungluu 2012/02/15 01:43:03 "
yzshen1 2012/02/15 18:40:55 Done.
272 memmove(dest_addr, src_addr, sizeof(*src_addr)); 279 memmove(dest_addr, src_addr, sizeof(*src_addr));
273 reinterpret_cast<sockaddr_in*>(dest_addr->data)->sin_port = htons(port); 280 reinterpret_cast<sockaddr_in*>(dest_addr->data)->sin_port = htons(port);
274 return PP_TRUE; 281 return PP_TRUE;
275 } 282 }
276 283
277 if (GetFamily(src_addr) == AF_INET6) { 284 if (GetFamily(src_addr) == PP_ADDRESSFAMILY_IPV6) {
278 memmove(dest_addr, src_addr, sizeof(*src_addr)); 285 memmove(dest_addr, src_addr, sizeof(*src_addr));
279 reinterpret_cast<sockaddr_in6*>(dest_addr->data)->sin6_port = htons(port); 286 reinterpret_cast<sockaddr_in6*>(dest_addr->data)->sin6_port = htons(port);
280 return PP_TRUE; 287 return PP_TRUE;
281 } 288 }
282 289
283 return PP_FALSE; 290 return PP_FALSE;
284 } 291 }
285 292
286 void GetAnyAddress(PP_Bool is_ipv6, PP_NetAddress_Private* addr) { 293 void GetAnyAddress(PP_Bool is_ipv6, PP_NetAddress_Private* addr) {
287 memset(addr->data, 0, arraysize(addr->data) * sizeof(addr->data[0])); 294 memset(addr->data, 0, arraysize(addr->data) * sizeof(addr->data[0]));
(...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after
336 // static 343 // static
337 const PP_NetAddress_Private NetAddressPrivateImpl::kInvalidNetAddress = { 0 }; 344 const PP_NetAddress_Private NetAddressPrivateImpl::kInvalidNetAddress = { 0 };
338 345
339 // static 346 // static
340 bool NetAddressPrivateImpl::ValidateNetAddress( 347 bool NetAddressPrivateImpl::ValidateNetAddress(
341 const PP_NetAddress_Private& addr) { 348 const PP_NetAddress_Private& addr) {
342 if (addr.size < sizeof(reinterpret_cast<sockaddr*>(0)->sa_family)) 349 if (addr.size < sizeof(reinterpret_cast<sockaddr*>(0)->sa_family))
343 return false; 350 return false;
344 351
345 // TODO(viettrungluu): more careful validation? 352 // TODO(viettrungluu): more careful validation?
346 // Just do a size check for AF_INET. 353 // Just do a size check for IPv4.
347 if (GetFamily(&addr) == AF_INET && addr.size >= sizeof(sockaddr_in)) 354 if (GetFamily(&addr) == PP_ADDRESSFAMILY_IPV4 &&
viettrungluu 2012/02/15 01:43:03 "
yzshen1 2012/02/15 18:40:55 Done.
355 addr.size >= sizeof(sockaddr_in)) {
348 return true; 356 return true;
357 }
349 358
350 // Ditto for AF_INET6. 359 // Ditto for IPv6.
351 if (GetFamily(&addr) == AF_INET6 && addr.size >= sizeof(sockaddr_in6)) 360 if (GetFamily(&addr) == PP_ADDRESSFAMILY_IPV6 &&
361 addr.size >= sizeof(sockaddr_in6)) {
352 return true; 362 return true;
363 }
353 364
354 // Reject everything else. 365 // Reject everything else.
355 return false; 366 return false;
356 } 367 }
357 368
358 // static 369 // static
359 bool NetAddressPrivateImpl::SockaddrToNetAddress( 370 bool NetAddressPrivateImpl::SockaddrToNetAddress(
360 const sockaddr* sa, 371 const sockaddr* sa,
361 uint32_t sa_length, 372 uint32_t sa_length,
362 PP_NetAddress_Private* net_addr) { 373 PP_NetAddress_Private* net_addr) {
(...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after
414 net::IPEndPoint ip_end_point; 425 net::IPEndPoint ip_end_point;
415 if (!NetAddressToIPEndPoint(net_addr, &ip_end_point)) 426 if (!NetAddressToIPEndPoint(net_addr, &ip_end_point))
416 return false; 427 return false;
417 428
418 *address_list = net::AddressList::CreateFromIPAddress(ip_end_point.address(), 429 *address_list = net::AddressList::CreateFromIPAddress(ip_end_point.address(),
419 ip_end_point.port()); 430 ip_end_point.port());
420 return true; 431 return true;
421 } 432 }
422 433
423 } // namespace ppapi 434 } // namespace ppapi
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698