Index: runtime/bin/socket.cc |
diff --git a/runtime/bin/socket.cc b/runtime/bin/socket.cc |
index 3a35ea2d6c02434c2f36425d1c11cddbbe185088..e6da2b8b9688a6353fa9f46aa4aa0e113a275a95 100644 |
--- a/runtime/bin/socket.cc |
+++ b/runtime/bin/socket.cc |
@@ -24,10 +24,21 @@ 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); |
+ 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); |
+ Dart_TypedDataReleaseData(host_obj); |
if (socket >= 0) { |
Dart_Handle err = Socket::SetSocketIdNativeField(socket_obj, socket); |
if (Dart_IsError(err)) Dart_PropagateError(err); |
@@ -310,17 +321,23 @@ 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); |
+ Dart_TypedDataReleaseData(host_obj); |
if (socket >= 0) { |
Dart_Handle err = Socket::SetSocketIdNativeField(socket_obj, socket); |
if (Dart_IsError(err)) Dart_PropagateError(err); |
@@ -370,11 +387,35 @@ static CObject* LookupRequest(const CObjectArray& request) { |
CObjectString host(request[1]); |
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(), &os_error); |
+ if (addresses != NULL) { |
+ CObjectArray* array = new CObjectArray( |
+ CObject::NewArray(addresses->GetCount())); |
+ 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( |
+ SOCKADDR_STORAGE_LENGTH(raw))); |
+ memmove(data->Buffer(), |
+ reinterpret_cast<void *>(&raw), |
+ SOCKADDR_STORAGE_LENGTH(raw)); |
+ |
+ entry->SetAt(2, data); |
+ array->SetAt(i, entry); |
+ } |
+ result = array; |
+ delete addresses; |
} else { |
result = CObject::NewOSError(os_error); |
delete os_error; |