Use return values from JNI functions binding sockets and processes to networks.

bug:15757549
Change-Id: If23b14febc923b9a0348f0cf9029fd4bf6e8d725
diff --git a/core/java/android/net/ConnectivityManager.java b/core/java/android/net/ConnectivityManager.java
index b68ce36..396efff 100644
--- a/core/java/android/net/ConnectivityManager.java
+++ b/core/java/android/net/ConnectivityManager.java
@@ -2372,12 +2372,10 @@
      */
     public static boolean setProcessDefaultNetwork(Network network) {
         if (network == null) {
-            NetworkUtils.unbindProcessToNetwork();
+            return NetworkUtils.unbindProcessToNetwork();
         } else {
-            NetworkUtils.bindProcessToNetwork(network.netId);
+            return NetworkUtils.bindProcessToNetwork(network.netId);
         }
-        // TODO fix return value
-        return true;
     }
 
     /**
@@ -2404,11 +2402,9 @@
      */
     public static boolean setProcessDefaultNetworkForHostResolution(Network network) {
         if (network == null) {
-            NetworkUtils.unbindProcessToNetworkForHostResolution();
+            return NetworkUtils.unbindProcessToNetworkForHostResolution();
         } else {
-            NetworkUtils.bindProcessToNetworkForHostResolution(network.netId);
+            return NetworkUtils.bindProcessToNetworkForHostResolution(network.netId);
         }
-        // TODO hook up the return value.
-        return true;
     }
 }
diff --git a/core/java/android/net/Network.java b/core/java/android/net/Network.java
index 0a422c6..9a22d78 100644
--- a/core/java/android/net/Network.java
+++ b/core/java/android/net/Network.java
@@ -24,6 +24,7 @@
 import java.net.InetAddress;
 import java.net.InetSocketAddress;
 import java.net.Socket;
+import java.net.SocketException;
 import java.net.UnknownHostException;
 import javax.net.SocketFactory;
 
@@ -148,7 +149,9 @@
             // Query a property of the underlying socket to ensure the underlying
             // socket exists so a file descriptor is available to bind to a network.
             socket.getReuseAddress();
-            NetworkUtils.bindSocketToNetwork(socket.getFileDescriptor$().getInt$(), mNetId);
+            if (!NetworkUtils.bindSocketToNetwork(socket.getFileDescriptor$().getInt$(), mNetId)) {
+                throw new SocketException("Failed to bind socket to network.");
+            }
             return socket;
         }
     }
diff --git a/core/java/android/net/NetworkUtils.java b/core/java/android/net/NetworkUtils.java
index 15c0a71..c4b17b6 100644
--- a/core/java/android/net/NetworkUtils.java
+++ b/core/java/android/net/NetworkUtils.java
@@ -118,13 +118,13 @@
      * is by design so an application doesn't accidentally use sockets it thinks are still bound to
      * a particular {@code Network}.
      */
-    public native static void bindProcessToNetwork(int netId);
+    public native static boolean bindProcessToNetwork(int netId);
 
     /**
      * Clear any process specific {@code Network} binding.  This reverts a call to
      * {@link #bindProcessToNetwork}.
      */
-    public native static void unbindProcessToNetwork();
+    public native static boolean unbindProcessToNetwork();
 
     /**
      * Return the netId last passed to {@link #bindProcessToNetwork}, or NETID_UNSET if
@@ -138,7 +138,7 @@
      *
      * @deprecated This is strictly for legacy usage to support startUsingNetworkFeature().
      */
-    public native static void bindProcessToNetworkForHostResolution(int netId);
+    public native static boolean bindProcessToNetworkForHostResolution(int netId);
 
     /**
      * Clears any process specific {@link Network} binding for host resolution.  This does
@@ -146,13 +146,13 @@
      *
      * @deprecated This is strictly for legacy usage to support startUsingNetworkFeature().
      */
-    public native static void unbindProcessToNetworkForHostResolution();
+    public native static boolean unbindProcessToNetworkForHostResolution();
 
     /**
      * Explicitly binds {@code socketfd} to the network designated by {@code netId}.  This
      * overrides any binding via {@link #bindProcessToNetwork}.
      */
-    public native static void bindSocketToNetwork(int socketfd, int netId);
+    public native static boolean bindSocketToNetwork(int socketfd, int netId);
 
     /**
      * Convert a IPv4 address from an integer to an InetAddress.
diff --git a/core/jni/android_net_NetUtils.cpp b/core/jni/android_net_NetUtils.cpp
index bc5e1b3..6f89800 100644
--- a/core/jni/android_net_NetUtils.cpp
+++ b/core/jni/android_net_NetUtils.cpp
@@ -214,7 +214,8 @@
     return android_net_utils_runDhcpCommon(env, clazz, ifname, info, false);
 }
 
-static jboolean android_net_utils_runDhcpRenew(JNIEnv* env, jobject clazz, jstring ifname, jobject info)
+static jboolean android_net_utils_runDhcpRenew(JNIEnv* env, jobject clazz, jstring ifname,
+        jobject info)
 {
     return android_net_utils_runDhcpCommon(env, clazz, ifname, info, true);
 }
@@ -252,14 +253,14 @@
     }
 }
 
-static void android_net_utils_bindProcessToNetwork(JNIEnv *env, jobject thiz, jint netId)
+static jboolean android_net_utils_bindProcessToNetwork(JNIEnv *env, jobject thiz, jint netId)
 {
-    setNetworkForProcess(netId);
+    return (jboolean) !setNetworkForProcess(netId);
 }
 
-static void android_net_utils_unbindProcessToNetwork(JNIEnv *env, jobject thiz)
+static jboolean android_net_utils_unbindProcessToNetwork(JNIEnv *env, jobject thiz)
 {
-    setNetworkForProcess(NETID_UNSET);
+    return (jboolean) !setNetworkForProcess(NETID_UNSET);
 }
 
 static jint android_net_utils_getNetworkBoundToProcess(JNIEnv *env, jobject thiz)
@@ -267,19 +268,21 @@
     return getNetworkForProcess();
 }
 
-static void android_net_utils_bindProcessToNetworkForHostResolution(JNIEnv *env, jobject thiz, jint netId)
+static jboolean android_net_utils_bindProcessToNetworkForHostResolution(JNIEnv *env, jobject thiz,
+        jint netId)
 {
-    setNetworkForResolv(netId);
+    return (jboolean) !setNetworkForResolv(netId);
 }
 
-static void android_net_utils_unbindProcessToNetworkForHostResolution(JNIEnv *env, jobject thiz)
+static jboolean android_net_utils_unbindProcessToNetworkForHostResolution(JNIEnv *env, jobject thiz)
 {
-    setNetworkForResolv(NETID_UNSET);
+    return (jboolean) !setNetworkForResolv(NETID_UNSET);
 }
 
-static void android_net_utils_bindSocketToNetwork(JNIEnv *env, jobject thiz, jint socket, jint netId)
+static jboolean android_net_utils_bindSocketToNetwork(JNIEnv *env, jobject thiz, jint socket,
+        jint netId)
 {
-    setNetworkForSocket(netId, socket);
+    return (jboolean) !setNetworkForSocket(netId, socket);
 }
 
 // ----------------------------------------------------------------------------
@@ -299,12 +302,12 @@
     { "releaseDhcpLease", "(Ljava/lang/String;)Z",  (void *)android_net_utils_releaseDhcpLease },
     { "getDhcpError", "()Ljava/lang/String;", (void*) android_net_utils_getDhcpError },
     { "markSocket", "(II)V", (void*) android_net_utils_markSocket },
-    { "bindProcessToNetwork", "(I)V", (void*) android_net_utils_bindProcessToNetwork },
+    { "bindProcessToNetwork", "(I)Z", (void*) android_net_utils_bindProcessToNetwork },
     { "getNetworkBoundToProcess", "()I", (void*) android_net_utils_getNetworkBoundToProcess },
-    { "unbindProcessToNetwork", "()V", (void*) android_net_utils_unbindProcessToNetwork },
-    { "bindProcessToNetworkForHostResolution", "(I)V", (void*) android_net_utils_bindProcessToNetworkForHostResolution },
-    { "unbindProcessToNetworkForHostResolution", "()V", (void*) android_net_utils_unbindProcessToNetworkForHostResolution },
-    { "bindSocketToNetwork", "(II)V", (void*) android_net_utils_bindSocketToNetwork },
+    { "unbindProcessToNetwork", "()Z", (void*) android_net_utils_unbindProcessToNetwork },
+    { "bindProcessToNetworkForHostResolution", "(I)Z", (void*) android_net_utils_bindProcessToNetworkForHostResolution },
+    { "unbindProcessToNetworkForHostResolution", "()Z", (void*) android_net_utils_unbindProcessToNetworkForHostResolution },
+    { "bindSocketToNetwork", "(II)Z", (void*) android_net_utils_bindSocketToNetwork },
 };
 
 int register_android_net_NetworkUtils(JNIEnv* env)