| Index: runtime/bin/socket.cc
|
| diff --git a/runtime/bin/socket.cc b/runtime/bin/socket.cc
|
| index 3a35ea2d6c02434c2f36425d1c11cddbbe185088..091f819f7cd2e88833e905c5f6a9e134db615d6a 100644
|
| --- a/runtime/bin/socket.cc
|
| +++ b/runtime/bin/socket.cc
|
| @@ -24,10 +24,22 @@ 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));
|
| + int type = DartUtils::GetIntegerValue(Dart_GetNativeArgument(args, 1));
|
| + Dart_Handle host_obj = Dart_GetNativeArgument(args, 2);
|
| + 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, 3), &port)) {
|
| + intptr_t socket = Socket::CreateConnect(
|
| + type == 1 ? SocketAddress::IPv6 : SocketAddress::IPv4,
|
| + data,
|
| + len,
|
| + 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 +322,27 @@ 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 port_obj = Dart_GetNativeArgument(args, 2);
|
| - Dart_Handle backlog_obj = Dart_GetNativeArgument(args, 3);
|
| + int type = DartUtils::GetIntegerValue(Dart_GetNativeArgument(args, 1));
|
| + Dart_Handle host_obj = Dart_GetNativeArgument(args, 2);
|
| + 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, 3);
|
| + Dart_Handle backlog_obj = Dart_GetNativeArgument(args, 4);
|
| 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);
|
| + intptr_t socket = ServerSocket::CreateBindListen(
|
| + type == 1 ? SocketAddress::IPv6 : SocketAddress::IPv4,
|
| + data,
|
| + len,
|
| + 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 +392,33 @@ 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->count));
|
| + for (intptr_t i = 0; i < addresses->count; i++) {
|
| + CObjectArray* entry = new CObjectArray(CObject::NewArray(3));
|
| +
|
| + CObjectInt32* type = new CObjectInt32(CObject::NewInt32(
|
| + static_cast<int>(addresses->addresses[i]->type)));
|
| + entry->SetAt(0, type);
|
| +
|
| + CObjectString* as_string = new CObjectString(CObject::NewString(
|
| + addresses->addresses[i]->as_string));
|
| + entry->SetAt(1, as_string);
|
| +
|
| + CObjectUint8Array* data = new CObjectUint8Array(CObject::NewUint8Array(
|
| + addresses->addresses[i]->length));
|
| + memmove(data->Buffer(),
|
| + addresses->addresses[i]->data,
|
| + addresses->addresses[i]->length);
|
| +
|
| + entry->SetAt(2, data);
|
| + array->SetAt(i, entry);
|
| + }
|
| + result = array;
|
| + delete addresses;
|
| } else {
|
| result = CObject::NewOSError(os_error);
|
| delete os_error;
|
|
|