Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1056)

Unified Diff: runtime/bin/socket.h

Issue 113923004: Only store the address bytes for an internet address in Dart (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: Created 7 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « runtime/bin/secure_socket.cc ('k') | runtime/bin/socket.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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_;
« no previous file with comments | « runtime/bin/secure_socket.cc ('k') | runtime/bin/socket.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698