diff -r fd16c54261b3 -r 90ce3da70b43 jdk/src/share/classes/java/net/Inet6AddressImpl.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/src/share/classes/java/net/Inet6AddressImpl.java Sat Dec 01 00:00:00 2007 +0000 @@ -0,0 +1,108 @@ +/* + * Copyright 2002-2005 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ +package java.net; +import java.io.IOException; + +/* + * Package private implementation of InetAddressImpl for dual + * IPv4/IPv6 stack. + *

+ * If InetAddress.preferIPv6Address is true then anyLocalAddress(), + * loopbackAddress(), and localHost() will return IPv6 addresses, + * otherwise IPv4 addresses. + * + * @since 1.4 + */ + +class Inet6AddressImpl implements InetAddressImpl { + public native String getLocalHostName() throws UnknownHostException; + public native InetAddress[] + lookupAllHostAddr(String hostname) throws UnknownHostException; + public native String getHostByAddr(byte[] addr) throws UnknownHostException; + private native boolean isReachable0(byte[] addr, int scope, int timeout, byte[] inf, int ttl, int if_scope) throws IOException; + + public boolean isReachable(InetAddress addr, int timeout, NetworkInterface netif, int ttl) throws IOException { + byte[] ifaddr = null; + int scope = -1; + int netif_scope = -1; + if (netif != null) { + /* + * Let's make sure we bind to an address of the proper family. + * Which means same family as addr because at this point it could + * be either an IPv6 address or an IPv4 address (case of a dual + * stack system). + */ + java.util.Enumeration it = netif.getInetAddresses(); + InetAddress inetaddr = null; + while (it.hasMoreElements()) { + inetaddr = (InetAddress) it.nextElement(); + if (inetaddr.getClass().isInstance(addr)) { + ifaddr = inetaddr.getAddress(); + if (inetaddr instanceof Inet6Address) { + netif_scope = ((Inet6Address) inetaddr).getScopeId(); + } + break; + } + } + if (ifaddr == null) { + // Interface doesn't support the address family of + // the destination + return false; + } + } + if (addr instanceof Inet6Address) + scope = ((Inet6Address) addr).getScopeId(); + return isReachable0(addr.getAddress(), scope, timeout, ifaddr, ttl, netif_scope); + } + + public synchronized InetAddress anyLocalAddress() { + if (anyLocalAddress == null) { + if (InetAddress.preferIPv6Address) { + anyLocalAddress = new Inet6Address(); + anyLocalAddress.hostName = "::"; + } else { + anyLocalAddress = (new Inet4AddressImpl()).anyLocalAddress(); + } + } + return anyLocalAddress; + } + + public synchronized InetAddress loopbackAddress() { + if (loopbackAddress == null) { + if (InetAddress.preferIPv6Address) { + byte[] loopback = + {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01}; + loopbackAddress = new Inet6Address("localhost", loopback); + } else { + loopbackAddress = (new Inet4AddressImpl()).loopbackAddress(); + } + } + return loopbackAddress; + } + + private InetAddress anyLocalAddress; + private InetAddress loopbackAddress; +}