| 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;
 | 
| 
 |