Hi guys,

In some linuxes, when you bind on a loopback network interface, sendto will be fail and errono will be set to EHOSTUNREACH. In this situation, EHOSTUNREACH maybe need treat as INVAL: return false, not throw an exception.

Patch is attached.

Does anyone interested in this issue?


--
Yours Charles

diff --git src/solaris/native/java/net/Inet4AddressImpl.c 
src/solaris/native/java/net/Inet4AddressImpl.c
index 9a5b78e..52d18a8 100644
--- src/solaris/native/java/net/Inet4AddressImpl.c
+++ src/solaris/native/java/net/Inet4AddressImpl.c
@@ -391,10 +391,10 @@ ping4(JNIEnv *env, jint fd, struct sockaddr_in* him, jint 
timeout,
                  sizeof(struct sockaddr));
       if (n < 0 && errno != EINPROGRESS ) {
 #ifdef __linux__
-        if (errno != EINVAL)
+        if (errno != EINVAL || errno != EHOSTUNREACH)
           /*
            * On some Linuxes, when bound to the loopback interface, sendto
-           * will fail and errno will be set to EINVAL. When that happens,
+           * will fail and errno will be set to EINVAL or EHOSTUNREACH. When 
that happens,
            * don't throw an exception, just return false.
            */
 #endif /*__linux__ */
@@ -549,9 +549,10 @@ Java_java_net_Inet4AddressImpl_isReachable0(JNIEnv *env, 
jobject this,
         case EADDRNOTAVAIL: /* address is not available on  the  remote 
machine */
 #ifdef __linux__
         case EINVAL:
+        case EHOSTUNREACH:
           /*
            * On some Linuxes, when bound to the loopback interface, connect
-           * will fail and errno will be set to EINVAL. When that happens,
+           * will fail and errno will be set to EINVAL or EHOSTUNREACH. When 
that happens,
            * don't throw an exception, just return false.
            */
 #endif /* __linux__ */
diff --git src/solaris/native/java/net/Inet6AddressImpl.c 
src/solaris/native/java/net/Inet6AddressImpl.c
index bb5bae7..a71538d 100644
--- src/solaris/native/java/net/Inet6AddressImpl.c
+++ src/solaris/native/java/net/Inet6AddressImpl.c
@@ -509,10 +509,10 @@ ping6(JNIEnv *env, jint fd, struct sockaddr_in6* him, 
jint timeout,
       n = sendto(fd, sendbuf, plen, 0, (struct sockaddr*) him, sizeof(struct 
sockaddr_in6));
       if (n < 0 && errno != EINPROGRESS) {
 #ifdef __linux__
-        if (errno != EINVAL)
+        if (errno != EINVAL || errno != EHOSTUNREACH)
           /*
            * On some Linuxes, when bound to the loopback interface, sendto
-           * will fail and errno will be set to EINVAL. When that happens,
+           * will fail and errno will be set to EINVAL or EHOSTUNREACH. When 
that happens,
            * don't throw an exception, just return false.
            */
 #endif /*__linux__ */
@@ -677,9 +677,10 @@ Java_java_net_Inet6AddressImpl_isReachable0(JNIEnv *env, 
jobject this,
         case EADDRNOTAVAIL: /* address is not available on  the  remote 
machine */
 #ifdef __linux__
         case EINVAL:
+        case EHOSTUNREACH:
           /*
            * On some Linuxes, when bound to the loopback interface, connect
-           * will fail and errno will be set to EINVAL. When that happens,
+           * will fail and errno will be set to EINVAL or EHOSTUNREACH. When 
that happens,
            * don't throw an exception, just return false.
            */
 #endif /* __linux__ */

Reply via email to