summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLorenzo Colitti <lorenzo@google.com>2015-03-16 11:12:58 +0000
committerAndroid Git Automerger <android-git-automerger@android.com>2015-03-16 11:12:58 +0000
commit2b4ae2748dda20a34ccb8143f66c19d4162551bf (patch)
treea2f68e38632c89583eaa7c4e81cb3b7e84584483
parent2a28c71f445ae29d801f0519675512789f91fa51 (diff)
parent29e698e33247219311a98756833439a7a4f1e71a (diff)
downloadlibcore-2b4ae2748dda20a34ccb8143f66c19d4162551bf.zip
libcore-2b4ae2748dda20a34ccb8143f66c19d4162551bf.tar.gz
libcore-2b4ae2748dda20a34ccb8143f66c19d4162551bf.tar.bz2
am 29e698e3: am 71f07546: Merge "Also support IPv4 fallback in the SocketAddress version of sendto."
* commit '29e698e33247219311a98756833439a7a4f1e71a': Also support IPv4 fallback in the SocketAddress version of sendto.
-rw-r--r--luni/src/main/native/libcore_io_Posix.cpp27
-rw-r--r--luni/src/test/java/libcore/io/OsTest.java18
2 files changed, 34 insertions, 11 deletions
diff --git a/luni/src/main/native/libcore_io_Posix.cpp b/luni/src/main/native/libcore_io_Posix.cpp
index 12ac3f0..88990a5 100644
--- a/luni/src/main/native/libcore_io_Posix.cpp
+++ b/luni/src/main/native/libcore_io_Posix.cpp
@@ -464,15 +464,21 @@ static bool fillInetSocketAddress(JNIEnv* env, jint rc, jobject javaInetSocketAd
return true;
}
-static bool javaInetSocketAddressToSockaddr(
- JNIEnv* env, jobject javaSocketAddress, sockaddr_storage& ss, socklen_t& sa_len) {
+static void javaInetSocketAddressToInetAddressAndPort(
+ JNIEnv* env, jobject javaInetSocketAddress, jobject& javaInetAddress, jint& port) {
static jfieldID addressFid = env->GetFieldID(
JniConstants::inetSocketAddressClass, "addr", "Ljava/net/InetAddress;");
static jfieldID portFid = env->GetFieldID(JniConstants::inetSocketAddressClass, "port", "I");
- return inetAddressToSockaddr(env,
- env->GetObjectField(javaSocketAddress, addressFid),
- env->GetIntField(javaSocketAddress, portFid),
- ss, sa_len);
+ javaInetAddress = env->GetObjectField(javaInetSocketAddress, addressFid);
+ port = env->GetIntField(javaInetSocketAddress, portFid);
+}
+
+static bool javaInetSocketAddressToSockaddr(
+ JNIEnv* env, jobject javaSocketAddress, sockaddr_storage& ss, socklen_t& sa_len) {
+ jobject javaInetAddress;
+ jint port;
+ javaInetSocketAddressToInetAddressAndPort(env, javaSocketAddress, javaInetAddress, port);
+ return inetAddressToSockaddr(env, javaInetAddress, port, ss, sa_len);
}
static bool javaNetlinkSocketAddressToSockaddr(
@@ -1459,6 +1465,15 @@ static jint Posix_sendtoBytes(JNIEnv* env, jobject, jobject javaFd, jobject java
}
static jint Posix_sendtoBytesSocketAddress(JNIEnv* env, jobject, jobject javaFd, jobject javaBytes, jint byteOffset, jint byteCount, jint flags, jobject javaSocketAddress) {
+ if (env->IsInstanceOf(javaSocketAddress, JniConstants::inetSocketAddressClass)) {
+ // Use the InetAddress version so we get the benefit of NET_IPV4_FALLBACK.
+ jobject javaInetAddress;
+ jint port;
+ javaInetSocketAddressToInetAddressAndPort(env, javaSocketAddress, javaInetAddress, port);
+ return Posix_sendtoBytes(env, NULL, javaFd, javaBytes, byteOffset, byteCount, flags,
+ javaInetAddress, port);
+ }
+
ScopedBytesRO bytes(env, javaBytes);
if (bytes.get() == NULL) {
return -1;
diff --git a/luni/src/test/java/libcore/io/OsTest.java b/luni/src/test/java/libcore/io/OsTest.java
index 3ebbfcd..dce08f0 100644
--- a/luni/src/test/java/libcore/io/OsTest.java
+++ b/luni/src/test/java/libcore/io/OsTest.java
@@ -321,14 +321,14 @@ public class OsTest extends TestCase {
checkByteBufferPositions_sendto_recvfrom(AF_INET6, InetAddress.getByName("::1"));
}
- public void test_sendtoSocketAddress() throws Exception {
- FileDescriptor recvFd = Libcore.os.socket(AF_INET6, SOCK_DGRAM, 0);
- Libcore.os.bind(recvFd, InetAddress.getLoopbackAddress(), 0);
+ private void checkSendToSocketAddress(int family, InetAddress loopback) throws Exception {
+ FileDescriptor recvFd = Libcore.os.socket(family, SOCK_DGRAM, 0);
+ Libcore.os.bind(recvFd, loopback, 0);
StructTimeval tv = StructTimeval.fromMillis(20);
Libcore.os.setsockoptTimeval(recvFd, SOL_SOCKET, SO_RCVTIMEO, tv);
InetSocketAddress to = ((InetSocketAddress) Libcore.os.getsockname(recvFd));
- FileDescriptor sendFd = Libcore.os.socket(AF_INET6, SOCK_DGRAM, 0);
+ FileDescriptor sendFd = Libcore.os.socket(family, SOCK_DGRAM, 0);
byte[] msg = ("Hello, I'm going to a socket address: " + to.toString()).getBytes("UTF-8");
int len = msg.length;
@@ -336,7 +336,15 @@ public class OsTest extends TestCase {
byte[] received = new byte[msg.length + 42];
InetSocketAddress from = new InetSocketAddress();
assertEquals(len, Libcore.os.recvfrom(recvFd, received, 0, received.length, 0, from));
- assertEquals(InetAddress.getLoopbackAddress(), from.getAddress());
+ assertEquals(loopback, from.getAddress());
+ }
+
+ public void test_sendtoSocketAddress_af_inet() throws Exception {
+ checkSendToSocketAddress(AF_INET, InetAddress.getByName("127.0.0.1"));
+ }
+
+ public void test_sendtoSocketAddress_af_inet6() throws Exception {
+ checkSendToSocketAddress(AF_INET6, InetAddress.getByName("::1"));
}
public void test_socketFamilies() throws Exception {