6800805: java.net.NetworkInterface.getNetworkInterfaces() does not list IPv6 network interfaces correctly
authorchegar
Mon, 16 Feb 2009 17:19:05 +0000
changeset 2058 577525f89bd4
parent 2057 3acf8e5e2ca0
child 2059 a615a416ea59
child 2060 75e464ce81af
6800805: java.net.NetworkInterface.getNetworkInterfaces() does not list IPv6 network interfaces correctly Reviewed-by: jccollet
jdk/src/solaris/native/java/net/NetworkInterface.c
--- a/jdk/src/solaris/native/java/net/NetworkInterface.c	Sun Feb 15 12:25:54 2009 +0000
+++ b/jdk/src/solaris/native/java/net/NetworkInterface.c	Mon Feb 16 17:19:05 2009 +0000
@@ -969,13 +969,39 @@
            // Got access to parent, so create it if necessary.
            strcpy(vname, name);
            *unit = '\0';
-        }
-        else {
+        } else {
+#if defined(__solaris__) && defined(AF_INET6)
+          struct   lifreq lifr;
+          memset((char *) &lifr, 0, sizeof(lifr));
+          strcpy(lifr.lifr_name, vname);
+
+          /* Try with an IPv6 socket in case the interface has only IPv6
+           * addresses assigned to it */
+          close(sock);
+          sock = JVM_Socket(AF_INET6, SOCK_DGRAM, 0);
+
+          if (sock < 0) {
+            NET_ThrowByNameWithLastError(env, JNU_JAVANETPKG "SocketException",
+                                         "Socket creation failed");
+            return ifs; /* return untouched list */
+          }
+
+          if (ioctl(sock, SIOCGLIFFLAGS, (char *)&lifr) >= 0) {
+            // Got access to parent, so create it if necessary.
+            strcpy(vname, name);
+            *unit = '\0';
+          } else {
+            // failed to access parent interface do not create parent.
+            // We are a virtual interface with no parent.
+            isVirtual = 1;
+            vname[0] = 0;
+          }
+#else
           // failed to access parent interface do not create parent.
           // We are a virtual interface with no parent.
           isVirtual = 1;
-
           vname[0] = 0;
+#endif
         }
       }
       close(sock);