Chromium Code Reviews| OLD | NEW |
|---|---|
| 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 Loading... | |
| 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 Loading... | |
| 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 Loading... | |
| 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 Loading... | |
| 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 } |
| OLD | NEW |