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

Side by Side Diff: runtime/bin/socket.cc

Issue 14083007: Add new InternetAddress class with a static lookup function (including IPv6 results). (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: Add Windows support and update ssl tests to use 'localhost'. Created 7 years, 8 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) 2013, the Dart project authors. Please see the AUTHORS file 1 // Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file
2 // for details. All rights reserved. Use of this source code is governed by a 2 // for details. All rights reserved. Use of this source code is governed by a
3 // BSD-style license that can be found in the LICENSE file. 3 // BSD-style license that can be found in the LICENSE file.
4 4
5 #include "bin/io_buffer.h" 5 #include "bin/io_buffer.h"
6 #include "bin/socket.h" 6 #include "bin/socket.h"
7 #include "bin/dartutils.h" 7 #include "bin/dartutils.h"
8 #include "bin/thread.h" 8 #include "bin/thread.h"
9 #include "bin/utils.h" 9 #include "bin/utils.h"
10 10
11 #include "platform/globals.h" 11 #include "platform/globals.h"
12 #include "platform/thread.h" 12 #include "platform/thread.h"
13 #include "platform/utils.h" 13 #include "platform/utils.h"
14 14
15 #include "include/dart_api.h" 15 #include "include/dart_api.h"
16 16
17 static const int kSocketIdNativeField = 0; 17 static const int kSocketIdNativeField = 0;
18 18
19 dart::Mutex Socket::mutex_; 19 dart::Mutex Socket::mutex_;
20 int Socket::service_ports_size_ = 0; 20 int Socket::service_ports_size_ = 0;
21 Dart_Port* Socket::service_ports_ = NULL; 21 Dart_Port* Socket::service_ports_ = NULL;
22 int Socket::service_ports_index_ = 0; 22 int Socket::service_ports_index_ = 0;
23 23
24 void FUNCTION_NAME(Socket_CreateConnect)(Dart_NativeArguments args) { 24 void FUNCTION_NAME(Socket_CreateConnect)(Dart_NativeArguments args) {
25 Dart_EnterScope(); 25 Dart_EnterScope();
26 Dart_Handle socket_obj = Dart_GetNativeArgument(args, 0); 26 Dart_Handle socket_obj = Dart_GetNativeArgument(args, 0);
27 const char* host = DartUtils::GetStringValue(Dart_GetNativeArgument(args, 1)); 27 Dart_Handle host_obj = Dart_GetNativeArgument(args, 1);
Søren Gjesse 2013/04/22 15:02:08 Maybe add a static helper function: GetSockAddr(
Anders Johnsen 2013/04/23 08:03:57 Done.
28 Dart_TypedData_Type data_type;
29 uint8_t* data = NULL;
30 intptr_t len;
31 Dart_Handle result = Dart_TypedDataAcquireData(
32 host_obj, &data_type, reinterpret_cast<void**>(&data), &len);
28 int64_t port = 0; 33 int64_t port = 0;
29 if (DartUtils::GetInt64Value(Dart_GetNativeArgument(args, 2), &port)) { 34 if (!Dart_IsError(result) &&
30 intptr_t socket = Socket::CreateConnect(host, port); 35 DartUtils::GetInt64Value(Dart_GetNativeArgument(args, 2), &port)) {
36 sockaddr_storage addr;
37 memmove(reinterpret_cast<void *>(&addr),
38 data,
39 len);
40 intptr_t socket = Socket::CreateConnect(addr, port);
41 OSError error;
42 Dart_TypedDataReleaseData(host_obj);
31 if (socket >= 0) { 43 if (socket >= 0) {
32 Dart_Handle err = Socket::SetSocketIdNativeField(socket_obj, socket); 44 Dart_Handle err = Socket::SetSocketIdNativeField(socket_obj, socket);
33 if (Dart_IsError(err)) Dart_PropagateError(err); 45 if (Dart_IsError(err)) Dart_PropagateError(err);
34 Dart_SetReturnValue(args, Dart_True()); 46 Dart_SetReturnValue(args, Dart_True());
35 } else { 47 } else {
36 Dart_SetReturnValue(args, DartUtils::NewDartOSError()); 48 Dart_SetReturnValue(args, DartUtils::NewDartOSError(&error));
37 } 49 }
38 } else { 50 } else {
39 OSError os_error(-1, "Invalid argument", OSError::kUnknown); 51 OSError os_error(-1, "Invalid argument", OSError::kUnknown);
40 Dart_Handle err = DartUtils::NewDartOSError(&os_error); 52 Dart_Handle err = DartUtils::NewDartOSError(&os_error);
41 if (Dart_IsError(err)) Dart_PropagateError(err); 53 if (Dart_IsError(err)) Dart_PropagateError(err);
42 Dart_SetReturnValue(args, err); 54 Dart_SetReturnValue(args, err);
43 } 55 }
44 Dart_ExitScope(); 56 Dart_ExitScope();
45 } 57 }
46 58
(...skipping 196 matching lines...) Expand 10 before | Expand all | Expand 10 after
243 } 255 }
244 256
245 257
246 void FUNCTION_NAME(Socket_GetRemotePeer)(Dart_NativeArguments args) { 258 void FUNCTION_NAME(Socket_GetRemotePeer)(Dart_NativeArguments args) {
247 Dart_EnterScope(); 259 Dart_EnterScope();
248 Dart_Handle socket_obj = Dart_GetNativeArgument(args, 0); 260 Dart_Handle socket_obj = Dart_GetNativeArgument(args, 0);
249 intptr_t socket = 0; 261 intptr_t socket = 0;
250 Dart_Handle err = Socket::GetSocketIdNativeField(socket_obj, &socket); 262 Dart_Handle err = Socket::GetSocketIdNativeField(socket_obj, &socket);
251 if (Dart_IsError(err)) Dart_PropagateError(err); 263 if (Dart_IsError(err)) Dart_PropagateError(err);
252 OSError os_error; 264 OSError os_error;
253 intptr_t port = 0; 265 intptr_t port = 0;
Søren Gjesse 2013/04/22 15:02:08 Add ASSERT(INET6_ADDRSTRLEN >= INET_ADDRSTRLEN)
Anders Johnsen 2013/04/23 08:03:57 Done.
254 char host[INET_ADDRSTRLEN]; 266 char host[INET6_ADDRSTRLEN];
255 if (Socket::GetRemotePeer(socket, host, &port)) { 267 if (Socket::GetRemotePeer(socket, host, &port)) {
256 Dart_Handle list = Dart_NewList(2); 268 Dart_Handle list = Dart_NewList(2);
257 Dart_ListSetAt(list, 0, Dart_NewStringFromCString(host)); 269 Dart_ListSetAt(list, 0, Dart_NewStringFromCString(host));
258 Dart_ListSetAt(list, 1, Dart_NewInteger(port)); 270 Dart_ListSetAt(list, 1, Dart_NewInteger(port));
259 Dart_SetReturnValue(args, list); 271 Dart_SetReturnValue(args, list);
260 } else { 272 } else {
261 Dart_SetReturnValue(args, DartUtils::NewDartOSError()); 273 Dart_SetReturnValue(args, DartUtils::NewDartOSError());
262 } 274 }
263 Dart_ExitScope(); 275 Dart_ExitScope();
264 } 276 }
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after
303 Dart_Handle err = Socket::SetSocketIdNativeField(socket_obj, socket); 315 Dart_Handle err = Socket::SetSocketIdNativeField(socket_obj, socket);
304 if (Dart_IsError(err)) Dart_PropagateError(err); 316 if (Dart_IsError(err)) Dart_PropagateError(err);
305 Dart_SetReturnValue(args, Dart_NewBoolean(socket >= 0)); 317 Dart_SetReturnValue(args, Dart_NewBoolean(socket >= 0));
306 Dart_ExitScope(); 318 Dart_ExitScope();
307 } 319 }
308 320
309 321
310 void FUNCTION_NAME(ServerSocket_CreateBindListen)(Dart_NativeArguments args) { 322 void FUNCTION_NAME(ServerSocket_CreateBindListen)(Dart_NativeArguments args) {
311 Dart_EnterScope(); 323 Dart_EnterScope();
312 Dart_Handle socket_obj = Dart_GetNativeArgument(args, 0); 324 Dart_Handle socket_obj = Dart_GetNativeArgument(args, 0);
313 Dart_Handle bind_address_obj = Dart_GetNativeArgument(args, 1); 325 Dart_Handle host_obj = Dart_GetNativeArgument(args, 1);
326 Dart_TypedData_Type data_type;
327 uint8_t* data = NULL;
328 intptr_t len;
329 Dart_Handle result = Dart_TypedDataAcquireData(
330 host_obj, &data_type, reinterpret_cast<void**>(&data), &len);
314 Dart_Handle port_obj = Dart_GetNativeArgument(args, 2); 331 Dart_Handle port_obj = Dart_GetNativeArgument(args, 2);
315 Dart_Handle backlog_obj = Dart_GetNativeArgument(args, 3); 332 Dart_Handle backlog_obj = Dart_GetNativeArgument(args, 3);
316 int64_t port = 0; 333 int64_t port = 0;
317 int64_t backlog = 0; 334 int64_t backlog = 0;
318 if (Dart_IsString(bind_address_obj) && 335 if (!Dart_IsError(result) &&
319 DartUtils::GetInt64Value(port_obj, &port) && 336 DartUtils::GetInt64Value(port_obj, &port) &&
320 DartUtils::GetInt64Value(backlog_obj, &backlog)) { 337 DartUtils::GetInt64Value(backlog_obj, &backlog)) {
321 const char* bind_address = DartUtils::GetStringValue(bind_address_obj); 338 sockaddr_storage addr;
322 intptr_t socket = 339 memmove(reinterpret_cast<void *>(&addr), data, len);
323 ServerSocket::CreateBindListen(bind_address, port, backlog); 340 intptr_t socket = ServerSocket::CreateBindListen(addr, port, backlog);
341 OSError error;
342 Dart_TypedDataReleaseData(host_obj);
324 if (socket >= 0) { 343 if (socket >= 0) {
325 Dart_Handle err = Socket::SetSocketIdNativeField(socket_obj, socket); 344 Dart_Handle err = Socket::SetSocketIdNativeField(socket_obj, socket);
326 if (Dart_IsError(err)) Dart_PropagateError(err); 345 if (Dart_IsError(err)) Dart_PropagateError(err);
327 Dart_SetReturnValue(args, Dart_True()); 346 Dart_SetReturnValue(args, Dart_True());
328 } else { 347 } else {
329 if (socket == -5) { 348 if (socket == -5) {
330 OSError os_error(-1, "Invalid host", OSError::kUnknown); 349 OSError os_error(-1, "Invalid host", OSError::kUnknown);
331 Dart_SetReturnValue(args, DartUtils::NewDartOSError(&os_error)); 350 Dart_SetReturnValue(args, DartUtils::NewDartOSError(&os_error));
332 } else { 351 } else {
333 Dart_SetReturnValue(args, DartUtils::NewDartOSError()); 352 Dart_SetReturnValue(args, DartUtils::NewDartOSError(&error));
334 } 353 }
335 } 354 }
336 } else { 355 } else {
337 OSError os_error(-1, "Invalid argument", OSError::kUnknown); 356 OSError os_error(-1, "Invalid argument", OSError::kUnknown);
338 Dart_Handle err = DartUtils::NewDartOSError(&os_error); 357 Dart_Handle err = DartUtils::NewDartOSError(&os_error);
339 if (Dart_IsError(err)) Dart_PropagateError(err); 358 if (Dart_IsError(err)) Dart_PropagateError(err);
340 Dart_SetReturnValue(args, err); 359 Dart_SetReturnValue(args, err);
341 } 360 }
342 Dart_ExitScope(); 361 Dart_ExitScope();
343 } 362 }
(...skipping 15 matching lines...) Expand all
359 } else if (new_socket == ServerSocket::kTemporaryFailure) { 378 } else if (new_socket == ServerSocket::kTemporaryFailure) {
360 Dart_SetReturnValue(args, Dart_False()); 379 Dart_SetReturnValue(args, Dart_False());
361 } else { 380 } else {
362 Dart_SetReturnValue(args, DartUtils::NewDartOSError()); 381 Dart_SetReturnValue(args, DartUtils::NewDartOSError());
363 } 382 }
364 Dart_ExitScope(); 383 Dart_ExitScope();
365 } 384 }
366 385
367 386
368 static CObject* LookupRequest(const CObjectArray& request) { 387 static CObject* LookupRequest(const CObjectArray& request) {
369 if (request.Length() == 2 && request[1]->IsString()) { 388 if (request.Length() == 3 &&
389 request[1]->IsString() &&
390 request[2]->IsInt32()) {
370 CObjectString host(request[1]); 391 CObjectString host(request[1]);
392 CObjectInt32 type(request[2]);
371 CObject* result = NULL; 393 CObject* result = NULL;
372 OSError* os_error = NULL; 394 OSError* os_error = NULL;
373 const char* ip_address = 395 SocketAddresses* addresses =
374 Socket::LookupIPv4Address(host.CString(), &os_error); 396 Socket::LookupAddress(host.CString(), type.Value(), &os_error);
375 if (ip_address != NULL) { 397 if (addresses != NULL) {
376 result = new CObjectString(CObject::NewString(ip_address)); 398 CObjectArray* array = new CObjectArray(
377 free(const_cast<char*>(ip_address)); 399 CObject::NewArray(addresses->GetCount() + 1));
400 array->SetAt(0, new CObjectInt32(CObject::NewInt32(0)));
401 for (intptr_t i = 0; i < addresses->GetCount(); i++) {
402 SocketAddress* addr = addresses->GetAt(i);
403 CObjectArray* entry = new CObjectArray(CObject::NewArray(3));
404
405 CObjectInt32* type = new CObjectInt32(
406 CObject::NewInt32(addr->GetType()));
407 entry->SetAt(0, type);
408
409 CObjectString* as_string = new CObjectString(CObject::NewString(
410 addr->AsString()));
411 entry->SetAt(1, as_string);
412
413 sockaddr_storage raw = addr->GetAddr();
414 CObjectUint8Array* data = new CObjectUint8Array(CObject::NewUint8Array(
415 SocketAddress::GetAddrLength(raw)));
416 memmove(data->Buffer(),
417 reinterpret_cast<void *>(&raw),
418 SocketAddress::GetAddrLength(raw));
419
420 entry->SetAt(2, data);
421 array->SetAt(i + 1, entry);
422 }
423 result = array;
424 delete addresses;
378 } else { 425 } else {
379 result = CObject::NewOSError(os_error); 426 result = CObject::NewOSError(os_error);
380 delete os_error; 427 delete os_error;
381 } 428 }
382 return result; 429 return result;
383 } 430 }
384 return CObject::IllegalArgumentError(); 431 return CObject::IllegalArgumentError();
385 } 432 }
386 433
387 434
(...skipping 85 matching lines...) Expand 10 before | Expand all | Expand 10 after
473 520
474 521
475 Dart_Handle Socket::SetSocketIdNativeField(Dart_Handle socket, intptr_t id) { 522 Dart_Handle Socket::SetSocketIdNativeField(Dart_Handle socket, intptr_t id) {
476 return Dart_SetNativeInstanceField(socket, kSocketIdNativeField, id); 523 return Dart_SetNativeInstanceField(socket, kSocketIdNativeField, id);
477 } 524 }
478 525
479 526
480 Dart_Handle Socket::GetSocketIdNativeField(Dart_Handle socket, intptr_t* id) { 527 Dart_Handle Socket::GetSocketIdNativeField(Dart_Handle socket, intptr_t* id) {
481 return Dart_GetNativeInstanceField(socket, kSocketIdNativeField, id); 528 return Dart_GetNativeInstanceField(socket, kSocketIdNativeField, id);
482 } 529 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698