Chromium Code Reviews| Index: runtime/bin/socket.cc |
| diff --git a/runtime/bin/socket.cc b/runtime/bin/socket.cc |
| index 3a35ea2d6c02434c2f36425d1c11cddbbe185088..f24190d35dfc4b5c66915618d5ca3f2189696fcc 100644 |
| --- a/runtime/bin/socket.cc |
| +++ b/runtime/bin/socket.cc |
| @@ -24,16 +24,28 @@ int Socket::service_ports_index_ = 0; |
| void FUNCTION_NAME(Socket_CreateConnect)(Dart_NativeArguments args) { |
| Dart_EnterScope(); |
| Dart_Handle socket_obj = Dart_GetNativeArgument(args, 0); |
| - const char* host = DartUtils::GetStringValue(Dart_GetNativeArgument(args, 1)); |
| + 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.
|
| + Dart_TypedData_Type data_type; |
| + uint8_t* data = NULL; |
| + intptr_t len; |
| + Dart_Handle result = Dart_TypedDataAcquireData( |
| + host_obj, &data_type, reinterpret_cast<void**>(&data), &len); |
| int64_t port = 0; |
| - if (DartUtils::GetInt64Value(Dart_GetNativeArgument(args, 2), &port)) { |
| - intptr_t socket = Socket::CreateConnect(host, port); |
| + if (!Dart_IsError(result) && |
| + DartUtils::GetInt64Value(Dart_GetNativeArgument(args, 2), &port)) { |
| + sockaddr_storage addr; |
| + memmove(reinterpret_cast<void *>(&addr), |
| + data, |
| + len); |
| + intptr_t socket = Socket::CreateConnect(addr, port); |
| + OSError error; |
| + Dart_TypedDataReleaseData(host_obj); |
| if (socket >= 0) { |
| Dart_Handle err = Socket::SetSocketIdNativeField(socket_obj, socket); |
| if (Dart_IsError(err)) Dart_PropagateError(err); |
| Dart_SetReturnValue(args, Dart_True()); |
| } else { |
| - Dart_SetReturnValue(args, DartUtils::NewDartOSError()); |
| + Dart_SetReturnValue(args, DartUtils::NewDartOSError(&error)); |
| } |
| } else { |
| OSError os_error(-1, "Invalid argument", OSError::kUnknown); |
| @@ -251,7 +263,7 @@ void FUNCTION_NAME(Socket_GetRemotePeer)(Dart_NativeArguments args) { |
| if (Dart_IsError(err)) Dart_PropagateError(err); |
| OSError os_error; |
| 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.
|
| - char host[INET_ADDRSTRLEN]; |
| + char host[INET6_ADDRSTRLEN]; |
| if (Socket::GetRemotePeer(socket, host, &port)) { |
| Dart_Handle list = Dart_NewList(2); |
| Dart_ListSetAt(list, 0, Dart_NewStringFromCString(host)); |
| @@ -310,17 +322,24 @@ void FUNCTION_NAME(Socket_GetStdioHandle)(Dart_NativeArguments args) { |
| void FUNCTION_NAME(ServerSocket_CreateBindListen)(Dart_NativeArguments args) { |
| Dart_EnterScope(); |
| Dart_Handle socket_obj = Dart_GetNativeArgument(args, 0); |
| - Dart_Handle bind_address_obj = Dart_GetNativeArgument(args, 1); |
| + Dart_Handle host_obj = Dart_GetNativeArgument(args, 1); |
| + Dart_TypedData_Type data_type; |
| + uint8_t* data = NULL; |
| + intptr_t len; |
| + Dart_Handle result = Dart_TypedDataAcquireData( |
| + host_obj, &data_type, reinterpret_cast<void**>(&data), &len); |
| Dart_Handle port_obj = Dart_GetNativeArgument(args, 2); |
| Dart_Handle backlog_obj = Dart_GetNativeArgument(args, 3); |
| int64_t port = 0; |
| int64_t backlog = 0; |
| - if (Dart_IsString(bind_address_obj) && |
| + if (!Dart_IsError(result) && |
| DartUtils::GetInt64Value(port_obj, &port) && |
| DartUtils::GetInt64Value(backlog_obj, &backlog)) { |
| - const char* bind_address = DartUtils::GetStringValue(bind_address_obj); |
| - intptr_t socket = |
| - ServerSocket::CreateBindListen(bind_address, port, backlog); |
| + sockaddr_storage addr; |
| + memmove(reinterpret_cast<void *>(&addr), data, len); |
| + intptr_t socket = ServerSocket::CreateBindListen(addr, port, backlog); |
| + OSError error; |
| + Dart_TypedDataReleaseData(host_obj); |
| if (socket >= 0) { |
| Dart_Handle err = Socket::SetSocketIdNativeField(socket_obj, socket); |
| if (Dart_IsError(err)) Dart_PropagateError(err); |
| @@ -330,7 +349,7 @@ void FUNCTION_NAME(ServerSocket_CreateBindListen)(Dart_NativeArguments args) { |
| OSError os_error(-1, "Invalid host", OSError::kUnknown); |
| Dart_SetReturnValue(args, DartUtils::NewDartOSError(&os_error)); |
| } else { |
| - Dart_SetReturnValue(args, DartUtils::NewDartOSError()); |
| + Dart_SetReturnValue(args, DartUtils::NewDartOSError(&error)); |
| } |
| } |
| } else { |
| @@ -366,15 +385,43 @@ void FUNCTION_NAME(ServerSocket_Accept)(Dart_NativeArguments args) { |
| static CObject* LookupRequest(const CObjectArray& request) { |
| - if (request.Length() == 2 && request[1]->IsString()) { |
| + if (request.Length() == 3 && |
| + request[1]->IsString() && |
| + request[2]->IsInt32()) { |
| CObjectString host(request[1]); |
| + CObjectInt32 type(request[2]); |
| CObject* result = NULL; |
| OSError* os_error = NULL; |
| - const char* ip_address = |
| - Socket::LookupIPv4Address(host.CString(), &os_error); |
| - if (ip_address != NULL) { |
| - result = new CObjectString(CObject::NewString(ip_address)); |
| - free(const_cast<char*>(ip_address)); |
| + SocketAddresses* addresses = |
| + Socket::LookupAddress(host.CString(), type.Value(), &os_error); |
| + if (addresses != NULL) { |
| + CObjectArray* array = new CObjectArray( |
| + CObject::NewArray(addresses->GetCount() + 1)); |
| + array->SetAt(0, new CObjectInt32(CObject::NewInt32(0))); |
| + for (intptr_t i = 0; i < addresses->GetCount(); i++) { |
| + SocketAddress* addr = addresses->GetAt(i); |
| + CObjectArray* entry = new CObjectArray(CObject::NewArray(3)); |
| + |
| + CObjectInt32* type = new CObjectInt32( |
| + CObject::NewInt32(addr->GetType())); |
| + entry->SetAt(0, type); |
| + |
| + CObjectString* as_string = new CObjectString(CObject::NewString( |
| + addr->AsString())); |
| + entry->SetAt(1, as_string); |
| + |
| + sockaddr_storage raw = addr->GetAddr(); |
| + CObjectUint8Array* data = new CObjectUint8Array(CObject::NewUint8Array( |
| + SocketAddress::GetAddrLength(raw))); |
| + memmove(data->Buffer(), |
| + reinterpret_cast<void *>(&raw), |
| + SocketAddress::GetAddrLength(raw)); |
| + |
| + entry->SetAt(2, data); |
| + array->SetAt(i + 1, entry); |
| + } |
| + result = array; |
| + delete addresses; |
| } else { |
| result = CObject::NewOSError(os_error); |
| delete os_error; |