Index: runtime/bin/socket.h |
diff --git a/runtime/bin/socket.h b/runtime/bin/socket.h |
index 0c009b08e02f9fc79de33fd804f86be4d8764783..b27a9c5ad173b064f5a15a3a9c4b6b8e79a4e466 100644 |
--- a/runtime/bin/socket.h |
+++ b/runtime/bin/socket.h |
@@ -70,6 +70,36 @@ class SocketAddress { |
sizeof(struct sockaddr_in6) : sizeof(struct sockaddr_in); |
} |
+ static intptr_t GetInAddrLength(const RawAddr* addr) { |
+ ASSERT(addr->ss.ss_family == AF_INET || addr->ss.ss_family == AF_INET6); |
+ return addr->ss.ss_family == AF_INET6 ? |
+ sizeof(struct in6_addr) : sizeof(struct in_addr); |
+ } |
+ |
+ 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 || |
+ (len != sizeof(in_addr) && len != sizeof(in6_addr))) { |
+ Dart_PropagateError( |
+ Dart_NewApiError("Unexpected type for socket address")); |
+ } |
+ 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), data, len); |
+ } else { |
+ ASSERT(len == sizeof(in6_addr)); |
+ addr->in6.sin6_family = AF_INET6; |
+ memmove(reinterpret_cast<void*>(&addr->in6.sin6_addr), data, len); |
+ } |
+ Dart_TypedDataReleaseData(obj); |
+ } |
+ |
static int16_t FromType(int type) { |
if (type == TYPE_ANY) return AF_UNSPEC; |
if (type == TYPE_IPV4) return AF_INET; |
@@ -85,7 +115,7 @@ class SocketAddress { |
} |
} |
- static intptr_t GetAddrPort(RawAddr* addr) { |
+ static intptr_t GetAddrPort(const RawAddr* addr) { |
if (addr->ss.ss_family == AF_INET) { |
return ntohs(addr->in.sin_port); |
} else { |
@@ -93,14 +123,36 @@ class SocketAddress { |
} |
} |
- static Dart_Handle ToTypedData(RawAddr* addr) { |
- int len = GetAddrLength(addr); |
+ static Dart_Handle ToTypedData(RawAddr* raw) { |
+ int len = GetInAddrLength(raw); |
Dart_Handle result = Dart_NewTypedData(Dart_TypedData_kUint8, len); |
if (Dart_IsError(result)) Dart_PropagateError(result); |
- Dart_ListSetAsBytes(result, 0, reinterpret_cast<uint8_t *>(addr), len); |
+ Dart_Handle err; |
+ if (raw->addr.sa_family == AF_INET6) { |
+ err = Dart_ListSetAsBytes( |
+ result, 0, reinterpret_cast<uint8_t*>(&raw->in6.sin6_addr), len); |
+ } else { |
+ err = Dart_ListSetAsBytes( |
+ result, 0, reinterpret_cast<uint8_t*>(&raw->in.sin_addr), len); |
+ } |
+ if (Dart_IsError(err)) Dart_PropagateError(err); |
return result; |
} |
+ static CObjectUint8Array* ToCObject(RawAddr* raw) { |
+ int in_addr_len = SocketAddress::GetInAddrLength(raw); |
+ void* in_addr; |
+ CObjectUint8Array* data = |
+ new CObjectUint8Array(CObject::NewUint8Array(in_addr_len)); |
+ if (raw->addr.sa_family == AF_INET6) { |
+ in_addr = reinterpret_cast<void*>(&raw->in6.sin6_addr); |
+ } else { |
+ in_addr = reinterpret_cast<void*>(&raw->in.sin_addr); |
+ } |
+ memmove(data->Buffer(), in_addr, in_addr_len); |
+ return data; |
+ } |
+ |
private: |
char as_string_[INET6_ADDRSTRLEN]; |
RawAddr addr_; |