Index: runtime/bin/socket.cc |
diff --git a/runtime/bin/socket.cc b/runtime/bin/socket.cc |
index c23fa0de25937cb6051e0a560a23ea0fef254726..3a35ea2d6c02434c2f36425d1c11cddbbe185088 100644 |
--- a/runtime/bin/socket.cc |
+++ b/runtime/bin/socket.cc |
@@ -21,37 +21,19 @@ int Socket::service_ports_size_ = 0; |
Dart_Port* Socket::service_ports_ = NULL; |
int Socket::service_ports_index_ = 0; |
- |
-static Dart_Handle GetSockAddr(Dart_Handle obj, struct sockaddr_storage* addr) { |
- Dart_TypedData_Type data_type; |
- uint8_t* data = NULL; |
- intptr_t len; |
- Dart_Handle result = Dart_TypedDataAcquireData( |
- obj, &data_type, reinterpret_cast<void**>(&data), &len); |
- if (Dart_IsError(result)) return result; |
- memmove(reinterpret_cast<void *>(addr), data, len); |
- return Dart_Null(); |
-} |
- |
- |
void FUNCTION_NAME(Socket_CreateConnect)(Dart_NativeArguments args) { |
Dart_EnterScope(); |
Dart_Handle socket_obj = Dart_GetNativeArgument(args, 0); |
- Dart_Handle host_obj = Dart_GetNativeArgument(args, 1); |
- struct sockaddr_storage addr; |
- Dart_Handle result = GetSockAddr(host_obj, &addr); |
+ const char* host = DartUtils::GetStringValue(Dart_GetNativeArgument(args, 1)); |
int64_t port = 0; |
- if (!Dart_IsError(result) && |
- DartUtils::GetInt64Value(Dart_GetNativeArgument(args, 2), &port)) { |
- intptr_t socket = Socket::CreateConnect(addr, port); |
- OSError error; |
- Dart_TypedDataReleaseData(host_obj); |
+ if (DartUtils::GetInt64Value(Dart_GetNativeArgument(args, 2), &port)) { |
+ intptr_t socket = Socket::CreateConnect(host, port); |
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(&error)); |
+ Dart_SetReturnValue(args, DartUtils::NewDartOSError()); |
} |
} else { |
OSError os_error(-1, "Invalid argument", OSError::kUnknown); |
@@ -269,8 +251,7 @@ void FUNCTION_NAME(Socket_GetRemotePeer)(Dart_NativeArguments args) { |
if (Dart_IsError(err)) Dart_PropagateError(err); |
OSError os_error; |
intptr_t port = 0; |
- ASSERT(INET6_ADDRSTRLEN >= INET_ADDRSTRLEN); |
- char host[INET6_ADDRSTRLEN]; |
+ char host[INET_ADDRSTRLEN]; |
if (Socket::GetRemotePeer(socket, host, &port)) { |
Dart_Handle list = Dart_NewList(2); |
Dart_ListSetAt(list, 0, Dart_NewStringFromCString(host)); |
@@ -329,19 +310,17 @@ 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 host_obj = Dart_GetNativeArgument(args, 1); |
- struct sockaddr_storage addr; |
- Dart_Handle result = GetSockAddr(host_obj, &addr); |
+ Dart_Handle bind_address_obj = Dart_GetNativeArgument(args, 1); |
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_IsError(result) && |
+ if (Dart_IsString(bind_address_obj) && |
DartUtils::GetInt64Value(port_obj, &port) && |
DartUtils::GetInt64Value(backlog_obj, &backlog)) { |
- intptr_t socket = ServerSocket::CreateBindListen(addr, port, backlog); |
- OSError error; |
- Dart_TypedDataReleaseData(host_obj); |
+ const char* bind_address = DartUtils::GetStringValue(bind_address_obj); |
+ intptr_t socket = |
+ ServerSocket::CreateBindListen(bind_address, port, backlog); |
if (socket >= 0) { |
Dart_Handle err = Socket::SetSocketIdNativeField(socket_obj, socket); |
if (Dart_IsError(err)) Dart_PropagateError(err); |
@@ -351,7 +330,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(&error)); |
+ Dart_SetReturnValue(args, DartUtils::NewDartOSError()); |
} |
} |
} else { |
@@ -387,43 +366,15 @@ void FUNCTION_NAME(ServerSocket_Accept)(Dart_NativeArguments args) { |
static CObject* LookupRequest(const CObjectArray& request) { |
- if (request.Length() == 3 && |
- request[1]->IsString() && |
- request[2]->IsInt32()) { |
+ if (request.Length() == 2 && request[1]->IsString()) { |
CObjectString host(request[1]); |
- CObjectInt32 type(request[2]); |
CObject* result = NULL; |
OSError* os_error = NULL; |
- SocketAddresses* addresses = |
- Socket::LookupAddress(host.CString(), type.Value(), &os_error); |
- if (addresses != NULL) { |
- CObjectArray* array = new CObjectArray( |
- CObject::NewArray(addresses->count() + 1)); |
- array->SetAt(0, new CObjectInt32(CObject::NewInt32(0))); |
- for (intptr_t i = 0; i < addresses->count(); 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->as_string())); |
- entry->SetAt(1, as_string); |
- |
- sockaddr_storage raw = addr->addr(); |
- 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; |
+ 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)); |
} else { |
result = CObject::NewOSError(os_error); |
delete os_error; |