Index: runtime/bin/socket_patch.dart |
diff --git a/runtime/bin/socket_patch.dart b/runtime/bin/socket_patch.dart |
index a85320cf53e25a91ef2d143ab4a9e75c914e9802..423761497e2c8e1dac11f66a15d784713a13af2a 100644 |
--- a/runtime/bin/socket_patch.dart |
+++ b/runtime/bin/socket_patch.dart |
@@ -62,8 +62,7 @@ class _InternetAddress implements InternetAddress { |
static const int _ADDRESS_LOOPBACK_IP_V6 = 1; |
static const int _ADDRESS_ANY_IP_V4 = 2; |
static const int _ADDRESS_ANY_IP_V6 = 3; |
- static const int _IPV4_ADDR_OFFSET = 4; |
- static const int _IPV6_ADDR_OFFSET = 8; |
+ static const int _IPV4_ADDR_LENGTH = 4; |
static const int _IPV6_ADDR_LENGTH = 16; |
static _InternetAddress LOOPBACK_IP_V4 = |
@@ -75,24 +74,26 @@ class _InternetAddress implements InternetAddress { |
static _InternetAddress ANY_IP_V6 = |
new _InternetAddress.fixed(_ADDRESS_ANY_IP_V6); |
- final InternetAddressType type; |
final String address; |
final String _host; |
- final Uint8List _sockaddr_storage; |
+ final Uint8List _in_addr; |
+ |
+ InternetAddressType get type => |
+ _in_addr.length == _IPV4_ADDR_LENGTH ? InternetAddressType.IP_V4 |
+ : InternetAddressType.IP_V6; |
String get host => _host != null ? _host : address; |
bool get isLoopback { |
switch (type) { |
case InternetAddressType.IP_V4: |
- return _sockaddr_storage[_IPV4_ADDR_OFFSET] == 127; |
+ return _in_addr[0] == 127; |
case InternetAddressType.IP_V6: |
for (int i = 0; i < _IPV6_ADDR_LENGTH - 1; i++) { |
- if (_sockaddr_storage[_IPV6_ADDR_OFFSET + i] != 0) return false; |
+ if (_in_addr[i] != 0) return false; |
} |
- int lastByteIndex = _IPV6_ADDR_OFFSET + _IPV6_ADDR_LENGTH - 1; |
- return _sockaddr_storage[lastByteIndex] == 1; |
+ return _in_addr[_IPV6_ADDR_LENGTH - 1] == 1; |
} |
} |
@@ -100,13 +101,11 @@ class _InternetAddress implements InternetAddress { |
switch (type) { |
case InternetAddressType.IP_V4: |
// Checking for 169.254.0.0/16. |
- return _sockaddr_storage[_IPV4_ADDR_OFFSET] == 169 && |
- _sockaddr_storage[_IPV4_ADDR_OFFSET + 1] == 254; |
+ return _in_addr[0] == 169 && _in_addr[1] == 254; |
case InternetAddressType.IP_V6: |
// Checking for fe80::/10. |
- return _sockaddr_storage[_IPV6_ADDR_OFFSET] == 0xFE && |
- (_sockaddr_storage[_IPV6_ADDR_OFFSET + 1] & 0xB0) == 0x80; |
+ return _in_addr[0] == 0xFE && (_in_addr[1] & 0xB0) == 0x80; |
} |
} |
@@ -114,48 +113,45 @@ class _InternetAddress implements InternetAddress { |
switch (type) { |
case InternetAddressType.IP_V4: |
// Checking for 224.0.0.0 through 239.255.255.255. |
- return _sockaddr_storage[_IPV4_ADDR_OFFSET] >= 224 && |
- _sockaddr_storage[_IPV4_ADDR_OFFSET] < 240; |
+ return _in_addr[0] >= 224 && _in_addr[0] < 240; |
case InternetAddressType.IP_V6: |
// Checking for ff00::/8. |
- return _sockaddr_storage[_IPV6_ADDR_OFFSET] == 0xFF; |
+ return _in_addr[0] == 0xFF; |
} |
} |
Future<InternetAddress> reverse() => _NativeSocket.reverseLookup(this); |
- _InternetAddress(InternetAddressType this.type, |
- String this.address, |
+ _InternetAddress(String this.address, |
String this._host, |
- List<int> this._sockaddr_storage); |
+ List<int> this._in_addr); |
factory _InternetAddress.parse(String address) { |
- var type = address.indexOf(':') == -1 |
- ? InternetAddressType.IP_V4 |
- : InternetAddressType.IP_V6; |
- var raw = _parse(type._value, address); |
- if (raw == null) { |
+ var in_addr = _parse(address); |
+ if (in_addr == null) { |
throw new ArgumentError("Invalid internet address $address"); |
} |
- return new _InternetAddress(type, address, null, raw); |
+ return new _InternetAddress(address, null, in_addr); |
} |
factory _InternetAddress.fixed(int id) { |
- var sockaddr = _fixed(id); |
switch (id) { |
case _ADDRESS_LOOPBACK_IP_V4: |
- return new _InternetAddress( |
- InternetAddressType.IP_V4, "127.0.0.1", null, sockaddr); |
+ var in_addr = new Uint8List(_IPV4_ADDR_LENGTH); |
+ in_addr[0] = 127; |
+ in_addr[_IPV4_ADDR_LENGTH - 1] = 1; |
+ return new _InternetAddress("127.0.0.1", null, in_addr); |
case _ADDRESS_LOOPBACK_IP_V6: |
- return new _InternetAddress( |
- InternetAddressType.IP_V6, "::1", null, sockaddr); |
+ var in_addr = new Uint8List(_IPV6_ADDR_LENGTH); |
+ in_addr[_IPV6_ADDR_LENGTH - 1] = 1; |
+ return new _InternetAddress("::1", null, in_addr); |
case _ADDRESS_ANY_IP_V4: |
- return new _InternetAddress( |
- InternetAddressType.IP_V4, "0.0.0.0", "0.0.0.0", sockaddr); |
+ var in_addr = new Uint8List(_IPV4_ADDR_LENGTH); |
+ return new _InternetAddress("0.0.0.0", "0.0.0.0", in_addr); |
case _ADDRESS_ANY_IP_V6: |
- return new _InternetAddress( |
- InternetAddressType.IP_V6, "::", "::", sockaddr); |
+ var in_addr = new Uint8List(_IPV6_ADDR_LENGTH); |
+ return new _InternetAddress("::", "::", in_addr); |
default: |
assert(false); |
throw new ArgumentError(); |
@@ -165,23 +161,23 @@ class _InternetAddress implements InternetAddress { |
// Create a clone of this _InternetAddress replacing the host. |
_InternetAddress _cloneWithNewHost(String host) { |
return new _InternetAddress( |
- type, address, host, new Uint8List.fromList(_sockaddr_storage)); |
+ address, host, new Uint8List.fromList(_in_addr)); |
} |
bool operator ==(other) { |
if (!(other is _InternetAddress)) return false; |
if (other.type != type) return false; |
bool equals = true; |
- for (int i = 0; i < _sockaddr_storage.length && equals; i++) { |
- equals = other._sockaddr_storage[i] == _sockaddr_storage[i]; |
+ for (int i = 0; i < _in_addr.length && equals; i++) { |
+ equals = other._in_addr[i] == _in_addr[i]; |
} |
return equals; |
} |
int get hashCode { |
int result = 1; |
- for (int i = 0; i < _sockaddr_storage.length; i++) { |
- result = (result * 31 + _sockaddr_storage[i]) & 0x3FFFFFFF; |
+ for (int i = 0; i < _in_addr.length; i++) { |
+ result = (result * 31 + _in_addr[i]) & 0x3FFFFFFF; |
} |
return result; |
} |
@@ -190,9 +186,7 @@ class _InternetAddress implements InternetAddress { |
return "InternetAddress('$address', ${type.name})"; |
} |
- static Uint8List _fixed(int id) native "InternetAddress_Fixed"; |
- static Uint8List _parse(int type, String address) |
- native "InternetAddress_Parse"; |
+ static Uint8List _parse(String address) native "InternetAddress_Parse"; |
} |
class _NetworkInterface implements NetworkInterface { |
@@ -284,14 +278,14 @@ class _NativeSocket extends NativeFieldWrapperClass1 { |
} else { |
return response.skip(1).map((result) { |
var type = new InternetAddressType._from(result[0]); |
- return new _InternetAddress(type, result[1], host, result[2]); |
+ return new _InternetAddress(result[1], host, result[2]); |
}).toList(); |
} |
}); |
} |
static Future<InternetAddress> reverseLookup(InternetAddress addr) { |
- return _IOService.dispatch(_SOCKET_REVERSE_LOOKUP, [addr._sockaddr_storage]) |
+ return _IOService.dispatch(_SOCKET_REVERSE_LOOKUP, [addr._in_addr]) |
.then((response) { |
if (isErrorResponse(response)) { |
throw createError(response, "Failed reverse host lookup", addr); |
@@ -315,8 +309,7 @@ class _NativeSocket extends NativeFieldWrapperClass1 { |
var type = new InternetAddressType._from(result[0]); |
var name = result[3]; |
var index = result[4]; |
- var address = new _InternetAddress( |
- type, result[1], "", result[2]); |
+ var address = new _InternetAddress(result[1], "", result[2]); |
if (!includeLinkLocal && address.isLinkLocal) return map; |
if (!includeLoopback && address.isLoopback) return map; |
map.putIfAbsent( |
@@ -345,7 +338,7 @@ class _NativeSocket extends NativeFieldWrapperClass1 { |
var socket = new _NativeSocket.normal(); |
socket.address = address; |
var result = socket.nativeCreateConnect( |
- address._sockaddr_storage, port); |
+ address._in_addr, port); |
if (result is OSError) { |
throw createError(result, "Connection failed", address, port); |
} else { |
@@ -387,7 +380,7 @@ class _NativeSocket extends NativeFieldWrapperClass1 { |
.then((address) { |
var socket = new _NativeSocket.listen(); |
socket.address = address; |
- var result = socket.nativeCreateBindListen(address._sockaddr_storage, |
+ var result = socket.nativeCreateBindListen(address._in_addr, |
port, |
backlog, |
v6Only); |
@@ -418,7 +411,7 @@ class _NativeSocket extends NativeFieldWrapperClass1 { |
.then((address) { |
var socket = new _NativeSocket.datagram(address); |
var result = socket.nativeCreateBindDatagram( |
- address._sockaddr_storage, port, reuseAddress); |
+ address._in_addr, port, reuseAddress); |
if (result is OSError) { |
throw new SocketException("Failed to create datagram socket", |
osError: result, |
@@ -525,7 +518,7 @@ class _NativeSocket extends NativeFieldWrapperClass1 { |
buffer, offset, bytes); |
var result = nativeSendTo( |
bufferAndStart.buffer, bufferAndStart.start, bytes, |
- address._sockaddr_storage, port); |
+ address._in_addr, port); |
if (result is OSError) { |
scheduleMicrotask(() => reportError(result, "Send failed")); |
result = 0; |
@@ -555,7 +548,7 @@ class _NativeSocket extends NativeFieldWrapperClass1 { |
InternetAddress get remoteAddress { |
var result = nativeGetRemotePeer()[0]; |
var type = new InternetAddressType._from(result[0]); |
- return new _InternetAddress(type, result[1], null, result[2]); |
+ return new _InternetAddress(result[1], null, result[2]); |
} |
// Multiplexes socket events to the socket handlers. |
@@ -801,8 +794,8 @@ class _NativeSocket extends NativeFieldWrapperClass1 { |
var interfaceAddr = multicastAddress(addr, interface); |
var interfaceIndex = interface == null ? 0 : interface.index; |
var result = nativeJoinMulticast( |
- addr._sockaddr_storage, |
- interfaceAddr == null ? null : interfaceAddr._sockaddr_storage, |
+ addr._in_addr, |
+ interfaceAddr == null ? null : interfaceAddr._in_addr, |
interfaceIndex); |
if (result is OSError) throw result; |
} |
@@ -811,8 +804,8 @@ class _NativeSocket extends NativeFieldWrapperClass1 { |
var interfaceAddr = multicastAddress(addr, interface); |
var interfaceIndex = interface == null ? 0 : interface.index; |
var result = nativeLeaveMulticast( |
- addr._sockaddr_storage, |
- interfaceAddr == null ? null : interfaceAddr._sockaddr_storage, |
+ addr._in_addr, |
+ interfaceAddr == null ? null : interfaceAddr._in_addr, |
interfaceIndex); |
if (result is OSError) throw result; |
} |
@@ -1551,14 +1544,11 @@ class _RawDatagramSocket extends Stream implements RawDatagramSocket { |
} |
Datagram _makeDatagram(List<int> data, |
- bool ipV6, |
String address, |
- List<int> sockaddr_storage, |
+ List<int> in_addr, |
int port) { |
- var addressType = |
- ipV6 ? InternetAddressType.IP_V6 : InternetAddressType.IP_V4; |
return new Datagram( |
data, |
- new _InternetAddress(addressType, address, null, sockaddr_storage), |
+ new _InternetAddress(address, null, in_addr), |
port); |
} |