| Index: runtime/bin/socket.cc
|
| diff --git a/runtime/bin/socket.cc b/runtime/bin/socket.cc
|
| index 500b45c5590b4d3deec077851cf85598dd653672..42fe373bc416c0e82af799af276cc64a270c88b4 100644
|
| --- a/runtime/bin/socket.cc
|
| +++ b/runtime/bin/socket.cc
|
| @@ -26,75 +26,20 @@ Dart_Port* Socket::service_ports_ = NULL;
|
| int Socket::service_ports_index_ = 0;
|
|
|
|
|
| -static void GetSockAddr(Dart_Handle obj, RawAddr* 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)) Dart_PropagateError(result);
|
| - if (data_type != Dart_TypedData_kUint8) {
|
| - Dart_PropagateError(Dart_NewApiError("Unexpected type for socket address"));
|
| - }
|
| - memmove(reinterpret_cast<void *>(addr), data, len);
|
| - Dart_TypedDataReleaseData(obj);
|
| -}
|
| -
|
| -
|
| -void FUNCTION_NAME(InternetAddress_Fixed)(Dart_NativeArguments args) {
|
| - int64_t id = 0;
|
| - bool ok = DartUtils::GetInt64Value(Dart_GetNativeArgument(args, 0), &id);
|
| - ASSERT(ok);
|
| - USE(ok);
|
| - RawAddr raw;
|
| - memset(&raw, 0, sizeof(raw));
|
| - switch (id) {
|
| - case SocketAddress::ADDRESS_LOOPBACK_IP_V4: {
|
| - raw.in.sin_family = AF_INET;
|
| - raw.in.sin_addr.s_addr = htonl(INADDR_LOOPBACK);
|
| - break;
|
| - }
|
| - case SocketAddress::ADDRESS_LOOPBACK_IP_V6: {
|
| - raw.in6.sin6_family = AF_INET6;
|
| - raw.in6.sin6_addr = in6addr_loopback;
|
| - break;
|
| - }
|
| - case SocketAddress::ADDRESS_ANY_IP_V4: {
|
| - raw.in.sin_family = AF_INET;
|
| - raw.in.sin_addr.s_addr = INADDR_ANY;
|
| - break;
|
| - }
|
| - case SocketAddress::ADDRESS_ANY_IP_V6: {
|
| - raw.in6.sin6_family = AF_INET6;
|
| - raw.in6.sin6_addr = in6addr_any;
|
| - break;
|
| - }
|
| - default:
|
| - Dart_Handle error = DartUtils::NewDartArgumentError("");
|
| - if (Dart_IsError(error)) Dart_PropagateError(error);
|
| - Dart_ThrowException(error);
|
| - }
|
| - Dart_SetReturnValue(args, SocketAddress::ToTypedData(&raw));
|
| -}
|
| -
|
| -
|
| void FUNCTION_NAME(InternetAddress_Parse)(Dart_NativeArguments args) {
|
| - int64_t type = 0;
|
| - bool ok = DartUtils::GetInt64Value(Dart_GetNativeArgument(args, 0), &type);
|
| - ASSERT(ok);
|
| - USE(ok);
|
| const char* address =
|
| - DartUtils::GetStringValue(Dart_GetNativeArgument(args, 1));
|
| + DartUtils::GetStringValue(Dart_GetNativeArgument(args, 0));
|
| ASSERT(address != NULL);
|
| RawAddr raw;
|
| memset(&raw, 0, sizeof(raw));
|
| + int type = strchr(address, ':') == NULL ? SocketAddress::TYPE_IPV4
|
| + : SocketAddress::TYPE_IPV6;
|
| if (type == SocketAddress::TYPE_IPV4) {
|
| raw.addr.sa_family = AF_INET;
|
| } else {
|
| - ASSERT(type == SocketAddress::TYPE_IPV6);
|
| raw.addr.sa_family = AF_INET6;
|
| }
|
| - ok = Socket::ParseAddress(type, address, &raw);
|
| + bool ok = Socket::ParseAddress(type, address, &raw);
|
| if (!ok) {
|
| Dart_SetReturnValue(args, Dart_Null());
|
| } else {
|
| @@ -105,7 +50,7 @@ void FUNCTION_NAME(InternetAddress_Parse)(Dart_NativeArguments args) {
|
|
|
| void FUNCTION_NAME(Socket_CreateConnect)(Dart_NativeArguments args) {
|
| RawAddr addr;
|
| - GetSockAddr(Dart_GetNativeArgument(args, 1), &addr);
|
| + SocketAddress::GetSockAddr(Dart_GetNativeArgument(args, 1), &addr);
|
| Dart_Handle port_arg = Dart_GetNativeArgument(args, 2);
|
| int64_t port = DartUtils::GetInt64ValueCheckRange(port_arg, 0, 65535);
|
| intptr_t socket = Socket::CreateConnect(addr, port);
|
| @@ -121,7 +66,7 @@ void FUNCTION_NAME(Socket_CreateConnect)(Dart_NativeArguments args) {
|
|
|
| void FUNCTION_NAME(Socket_CreateBindDatagram)(Dart_NativeArguments args) {
|
| RawAddr addr;
|
| - GetSockAddr(Dart_GetNativeArgument(args, 1), &addr);
|
| + SocketAddress::GetSockAddr(Dart_GetNativeArgument(args, 1), &addr);
|
| Dart_Handle port_arg = Dart_GetNativeArgument(args, 2);
|
| int64_t port = DartUtils::GetInt64ValueCheckRange(port_arg, 0, 65535);
|
| bool reuse_addr = DartUtils::GetBooleanValue(Dart_GetNativeArgument(args, 3));
|
| @@ -245,20 +190,14 @@ void FUNCTION_NAME(Socket_RecvFrom)(Dart_NativeArguments args) {
|
| Socket::FormatNumericAddress(&addr, numeric_address, INET6_ADDRSTRLEN);
|
|
|
| // Create a Datagram object with the data and sender address and port.
|
| - const int kNumArgs = 5;
|
| + const int kNumArgs = 4;
|
| Dart_Handle dart_args[kNumArgs];
|
| dart_args[0] = data;
|
| - dart_args[1] = Dart_NewBoolean(addr.addr.sa_family == AF_INET6);
|
| - dart_args[2] = Dart_NewStringFromCString(numeric_address);
|
| - if (Dart_IsError(dart_args[2])) Dart_PropagateError(dart_args[2]);
|
| - int len = SocketAddress::GetAddrLength(&addr);
|
| - dart_args[3] = Dart_NewTypedData(Dart_TypedData_kUint8, len);
|
| + dart_args[1] = Dart_NewStringFromCString(numeric_address);
|
| + if (Dart_IsError(dart_args[1])) Dart_PropagateError(dart_args[1]);
|
| + dart_args[2] = SocketAddress::ToTypedData(&addr);
|
| + dart_args[3] = Dart_NewInteger(port);
|
| if (Dart_IsError(dart_args[3])) Dart_PropagateError(dart_args[3]);
|
| - Dart_Handle err = Dart_ListSetAsBytes(
|
| - dart_args[3], 0, reinterpret_cast<uint8_t *>(&addr), len);
|
| - if (Dart_IsError(err)) Dart_PropagateError(err);
|
| - dart_args[4] = Dart_NewInteger(port);
|
| - if (Dart_IsError(dart_args[4])) Dart_PropagateError(dart_args[4]);
|
| // TODO(sgjesse): Cache the _makeDatagram function somewhere.
|
| Dart_Handle io_lib =
|
| Dart_LookupLibrary(DartUtils::NewString("dart:io"));
|
| @@ -318,7 +257,7 @@ void FUNCTION_NAME(Socket_SendTo)(Dart_NativeArguments args) {
|
| Dart_Handle address_obj = Dart_GetNativeArgument(args, 4);
|
| ASSERT(Dart_IsList(address_obj));
|
| RawAddr addr;
|
| - GetSockAddr(address_obj, &addr);
|
| + SocketAddress::GetSockAddr(address_obj, &addr);
|
| int64_t port = DartUtils::GetInt64ValueCheckRange(
|
| Dart_GetNativeArgument(args, 5),
|
| 0,
|
| @@ -427,7 +366,7 @@ void FUNCTION_NAME(Socket_SetSocketId)(Dart_NativeArguments args) {
|
|
|
| void FUNCTION_NAME(ServerSocket_CreateBindListen)(Dart_NativeArguments args) {
|
| RawAddr addr;
|
| - GetSockAddr(Dart_GetNativeArgument(args, 1), &addr);
|
| + SocketAddress::GetSockAddr(Dart_GetNativeArgument(args, 1), &addr);
|
| int64_t port = DartUtils::GetInt64ValueCheckRange(
|
| Dart_GetNativeArgument(args, 2),
|
| 0,
|
| @@ -496,13 +435,9 @@ CObject* Socket::LookupRequest(const CObjectArray& request) {
|
| entry->SetAt(1, as_string);
|
|
|
| RawAddr raw = addr->addr();
|
| - CObjectUint8Array* data = new CObjectUint8Array(CObject::NewUint8Array(
|
| - SocketAddress::GetAddrLength(&raw)));
|
| - memmove(data->Buffer(),
|
| - reinterpret_cast<void *>(&raw),
|
| - SocketAddress::GetAddrLength(&raw));
|
| -
|
| + CObjectUint8Array* data = SocketAddress::ToCObject(&raw);
|
| entry->SetAt(2, data);
|
| +
|
| array->SetAt(i + 1, entry);
|
| }
|
| result = array;
|
| @@ -522,9 +457,21 @@ CObject* Socket::ReverseLookupRequest(const CObjectArray& request) {
|
| request[0]->IsTypedData()) {
|
| CObjectUint8Array addr_object(request[0]);
|
| RawAddr addr;
|
| - memmove(reinterpret_cast<void *>(&addr),
|
| - addr_object.Buffer(),
|
| - addr_object.Length());
|
| + int len = addr_object.Length();
|
| + memset(reinterpret_cast<void*>(&addr), 0, sizeof(RawAddr));
|
| + if (len == sizeof(in_addr)) {
|
| + addr.in.sin_family = AF_INET;
|
| + memmove(reinterpret_cast<void*>(&addr.in.sin_addr),
|
| + addr_object.Buffer(),
|
| + len);
|
| + } else {
|
| + ASSERT(len == sizeof(in6_addr));
|
| + addr.in6.sin6_family = AF_INET6;
|
| + memmove(reinterpret_cast<void*>(&addr.in6.sin6_addr),
|
| + addr_object.Buffer(),
|
| + len);
|
| + }
|
| +
|
| OSError* os_error = NULL;
|
| const intptr_t kMaxHostLength = 1025;
|
| char host[kMaxHostLength];
|
| @@ -566,11 +513,7 @@ CObject* Socket::ListInterfacesRequest(const CObjectArray& request) {
|
| entry->SetAt(1, as_string);
|
|
|
| RawAddr raw = addr->addr();
|
| - CObjectUint8Array* data = new CObjectUint8Array(CObject::NewUint8Array(
|
| - SocketAddress::GetAddrLength(&raw)));
|
| - memmove(data->Buffer(),
|
| - reinterpret_cast<void *>(&raw),
|
| - SocketAddress::GetAddrLength(&raw));
|
| + CObjectUint8Array* data = SocketAddress::ToCObject(&raw);
|
| entry->SetAt(2, data);
|
|
|
| CObjectString* interface_name = new CObjectString(CObject::NewString(
|
| @@ -701,10 +644,10 @@ void FUNCTION_NAME(Socket_JoinMulticast)(Dart_NativeArguments args) {
|
| intptr_t socket =
|
| Socket::GetSocketIdNativeField(Dart_GetNativeArgument(args, 0));
|
| RawAddr addr;
|
| - GetSockAddr(Dart_GetNativeArgument(args, 1), &addr);
|
| + SocketAddress::GetSockAddr(Dart_GetNativeArgument(args, 1), &addr);
|
| RawAddr interface;
|
| if (Dart_GetNativeArgument(args, 2) != Dart_Null()) {
|
| - GetSockAddr(Dart_GetNativeArgument(args, 2), &interface);
|
| + SocketAddress::GetSockAddr(Dart_GetNativeArgument(args, 2), &interface);
|
| }
|
| int interfaceIndex =
|
| DartUtils::GetIntegerValue(Dart_GetNativeArgument(args, 3));
|
| @@ -720,10 +663,10 @@ void FUNCTION_NAME(Socket_LeaveMulticast)(Dart_NativeArguments args) {
|
| intptr_t socket =
|
| Socket::GetSocketIdNativeField(Dart_GetNativeArgument(args, 0));
|
| RawAddr addr;
|
| - GetSockAddr(Dart_GetNativeArgument(args, 1), &addr);
|
| + SocketAddress::GetSockAddr(Dart_GetNativeArgument(args, 1), &addr);
|
| RawAddr interface;
|
| if (Dart_GetNativeArgument(args, 2) != Dart_Null()) {
|
| - GetSockAddr(Dart_GetNativeArgument(args, 2), &interface);
|
| + SocketAddress::GetSockAddr(Dart_GetNativeArgument(args, 2), &interface);
|
| }
|
| int interfaceIndex =
|
| DartUtils::GetIntegerValue(Dart_GetNativeArgument(args, 3));
|
|
|