6800805: java.net.NetworkInterface.getNetworkInterfaces() does not list IPv6 network interfaces correctly
Reviewed-by: jccollet
--- 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);