InetAddress.java revision 51b1b6997fd3f980076b8081f7f1165ccc2a4008
151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski/* 251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Copyright (c) 1995, 2011, Oracle and/or its affiliates. All rights reserved. 351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * This code is free software; you can redistribute it and/or modify it 651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * under the terms of the GNU General Public License version 2 only, as 751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * published by the Free Software Foundation. Oracle designates this 851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * particular file as subject to the "Classpath" exception as provided 951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * by Oracle in the LICENSE file that accompanied this code. 1051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 1151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * This code is distributed in the hope that it will be useful, but WITHOUT 1251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 1351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License 1451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * version 2 for more details (a copy is included in the LICENSE file that 1551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * accompanied this code). 1651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 1751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * You should have received a copy of the GNU General Public License version 1851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 2 along with this work; if not, write to the Free Software Foundation, 1951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. 2051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 2151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA 2251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * or visit www.oracle.com if you need additional information or have any 2351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * questions. 2451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 2551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 2651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebskipackage java.net; 2751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 2851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebskiimport java.util.HashMap; 2951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebskiimport java.util.LinkedHashMap; 3051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebskiimport java.util.Random; 3151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebskiimport java.util.Iterator; 3251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebskiimport java.util.LinkedList; 3351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebskiimport java.util.List; 3451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebskiimport java.util.ArrayList; 3551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebskiimport java.security.AccessController; 3651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebskiimport java.io.ObjectStreamException; 3751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebskiimport java.io.ObjectStreamField; 3851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebskiimport java.io.IOException; 3951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebskiimport java.io.ObjectInputStream; 4051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebskiimport java.io.ObjectInputStream.GetField; 4151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebskiimport java.io.ObjectOutputStream; 4251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebskiimport java.io.ObjectOutputStream.PutField; 4351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebskiimport sun.security.action.*; 4451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebskiimport sun.net.InetAddressCachePolicy; 4551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebskiimport sun.net.util.IPAddressUtil; 4651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebskiimport sun.misc.Service; 4751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebskiimport sun.net.spi.nameservice.*; 4851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 4951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski/** 5051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * This class represents an Internet Protocol (IP) address. 5151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 5251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <p> An IP address is either a 32-bit or 128-bit unsigned number 5351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * used by IP, a lower-level protocol on which protocols like UDP and 5451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * TCP are built. The IP address architecture is defined by <a 5551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * href="http://www.ietf.org/rfc/rfc790.txt"><i>RFC 790: 5651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Assigned Numbers</i></a>, <a 5751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * href="http://www.ietf.org/rfc/rfc1918.txt"> <i>RFC 1918: 5851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Address Allocation for Private Internets</i></a>, <a 5951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * href="http://www.ietf.org/rfc/rfc2365.txt"><i>RFC 2365: 6051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Administratively Scoped IP Multicast</i></a>, and <a 6151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * href="http://www.ietf.org/rfc/rfc2373.txt"><i>RFC 2373: IP 6251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Version 6 Addressing Architecture</i></a>. An instance of an 6351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * InetAddress consists of an IP address and possibly its 6451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * corresponding host name (depending on whether it is constructed 6551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * with a host name or whether it has already done reverse host name 6651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * resolution). 6751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 6851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <h4> Address types </h4> 6951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 7051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <blockquote><table cellspacing=2 summary="Description of unicast and multicast address types"> 7151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <tr><th valign=top><i>unicast</i></th> 7251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <td>An identifier for a single interface. A packet sent to 7351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * a unicast address is delivered to the interface identified by 7451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * that address. 7551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 7651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <p> The Unspecified Address -- Also called anylocal or wildcard 7751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * address. It must never be assigned to any node. It indicates the 7851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * absence of an address. One example of its use is as the target of 7951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * bind, which allows a server to accept a client connection on any 8051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * interface, in case the server host has multiple interfaces. 8151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 8251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <p> The <i>unspecified</i> address must not be used as 8351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * the destination address of an IP packet. 8451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 8551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <p> The <i>Loopback</i> Addresses -- This is the address 8651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * assigned to the loopback interface. Anything sent to this 8751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * IP address loops around and becomes IP input on the local 8851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * host. This address is often used when testing a 8951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * client.</td></tr> 9051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <tr><th valign=top><i>multicast</i></th> 9151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <td>An identifier for a set of interfaces (typically belonging 9251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * to different nodes). A packet sent to a multicast address is 9351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * delivered to all interfaces identified by that address.</td></tr> 9451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * </table></blockquote> 9551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 9651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <h4> IP address scope </h4> 9751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 9851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <p> <i>Link-local</i> addresses are designed to be used for addressing 9951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * on a single link for purposes such as auto-address configuration, 10051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * neighbor discovery, or when no routers are present. 10151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 10251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <p> <i>Site-local</i> addresses are designed to be used for addressing 10351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * inside of a site without the need for a global prefix. 10451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 10551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <p> <i>Global</i> addresses are unique across the internet. 10651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 10751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <h4> Textual representation of IP addresses </h4> 10851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 10951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * The textual representation of an IP address is address family specific. 11051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 11151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <p> 11251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 11351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * For IPv4 address format, please refer to <A 11451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * HREF="Inet4Address.html#format">Inet4Address#format</A>; For IPv6 11551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * address format, please refer to <A 11651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * HREF="Inet6Address.html#format">Inet6Address#format</A>. 11751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 11851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <P>There is a <a href="doc-files/net-properties.html#Ipv4IPv6">couple of 11951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * System Properties</a> affecting how IPv4 and IPv6 addresses are used.</P> 12051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 12151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <h4> Host Name Resolution </h4> 12251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 12351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Host name-to-IP address <i>resolution</i> is accomplished through 12451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * the use of a combination of local machine configuration information 12551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * and network naming services such as the Domain Name System (DNS) 12651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * and Network Information Service(NIS). The particular naming 12751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * services(s) being used is by default the local machine configured 12851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * one. For any host name, its corresponding IP address is returned. 12951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 13051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <p> <i>Reverse name resolution</i> means that for any IP address, 13151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * the host associated with the IP address is returned. 13251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 13351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <p> The InetAddress class provides methods to resolve host names to 13451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * their IP addresses and vice versa. 13551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 13651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <h4> InetAddress Caching </h4> 13751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 13851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * The InetAddress class has a cache to store successful as well as 13951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * unsuccessful host name resolutions. 14051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 14151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <p> By default, when a security manager is installed, in order to 14251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * protect against DNS spoofing attacks, 14351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * the result of positive host name resolutions are 14451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * cached forever. When a security manager is not installed, the default 14551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * behavior is to cache entries for a finite (implementation dependent) 14651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * period of time. The result of unsuccessful host 14751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * name resolution is cached for a very short period of time (10 14851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * seconds) to improve performance. 14951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 15051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <p> If the default behavior is not desired, then a Java security property 15151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * can be set to a different Time-to-live (TTL) value for positive 15251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * caching. Likewise, a system admin can configure a different 15351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * negative caching TTL value when needed. 15451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 15551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <p> Two Java security properties control the TTL values used for 15651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * positive and negative host name resolution caching: 15751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 15851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <blockquote> 15951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <dl> 16051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <dt><b>networkaddress.cache.ttl</b></dt> 16151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <dd>Indicates the caching policy for successful name lookups from 16251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * the name service. The value is specified as as integer to indicate 16351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * the number of seconds to cache the successful lookup. The default 16451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * setting is to cache for an implementation specific period of time. 16551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <p> 16651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * A value of -1 indicates "cache forever". 16751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * </dd> 16851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <p> 16951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <dt><b>networkaddress.cache.negative.ttl</b> (default: 10)</dt> 17051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <dd>Indicates the caching policy for un-successful name lookups 17151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * from the name service. The value is specified as as integer to 17251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * indicate the number of seconds to cache the failure for 17351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * un-successful lookups. 17451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <p> 17551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * A value of 0 indicates "never cache". 17651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * A value of -1 indicates "cache forever". 17751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * </dd> 17851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * </dl> 17951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * </blockquote> 18051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 18151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @author Chris Warth 18251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @see java.net.InetAddress#getByAddress(byte[]) 18351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @see java.net.InetAddress#getByAddress(java.lang.String, byte[]) 18451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @see java.net.InetAddress#getAllByName(java.lang.String) 18551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @see java.net.InetAddress#getByName(java.lang.String) 18651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @see java.net.InetAddress#getLocalHost() 18751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @since JDK1.0 18851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 18951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebskipublic 19051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebskiclass InetAddress implements java.io.Serializable { 19151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski /** 19251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Specify the address family: Internet Protocol, Version 4 19351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @since 1.4 19451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 19551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski static final int IPv4 = 1; 19651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 19751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski /** 19851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Specify the address family: Internet Protocol, Version 6 19951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @since 1.4 20051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 20151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski static final int IPv6 = 2; 20251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 20351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski /* Specify address family preference */ 20451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski static transient boolean preferIPv6Address = false; 20551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 20651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski static class InetAddressHolder { 20751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 20851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski InetAddressHolder() {} 20951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 21051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski InetAddressHolder(String hostName, int address, int family) { 21151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski this.hostName = hostName; 21251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski this.address = address; 21351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski this.family = family; 21451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 21551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 21651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski String hostName; 21751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 21851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski String getHostName() { 21951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski return hostName; 22051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 22151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 22251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski /** 22351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Holds a 32-bit IPv4 address. 22451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 22551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski int address; 22651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 22751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski int getAddress() { 22851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski return address; 22951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 23051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 23151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski /** 23251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Specifies the address family type, for instance, '1' for IPv4 23351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * addresses, and '2' for IPv6 addresses. 23451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 23551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski int family; 23651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 23751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski int getFamily() { 23851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski return family; 23951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 24051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 24151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 24251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski final transient InetAddressHolder holder; 24351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 24451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski InetAddressHolder holder() { 24551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski return holder; 24651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 24751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 24851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski /* Used to store the name service provider */ 24951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski private static List<NameService> nameServices = null; 25051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 25151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski /* Used to store the best available hostname */ 25251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski private transient String canonicalHostName = null; 25351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 25451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski /** use serialVersionUID from JDK 1.0.2 for interoperability */ 25551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski private static final long serialVersionUID = 3286316764910316507L; 25651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 25751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski /* 25851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Load net library into runtime, and perform initializations. 25951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 26051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski static { 26151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski preferIPv6Address = java.security.AccessController.doPrivileged( 26251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski new GetBooleanAction("java.net.preferIPv6Addresses")).booleanValue(); 26351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski AccessController.doPrivileged(new LoadLibraryAction("net")); 26451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski init(); 26551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 26651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 26751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski /** 26851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Constructor for the Socket.accept() method. 26951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * This creates an empty InetAddress, which is filled in by 27051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * the accept() method. This InetAddress, however, is not 27151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * put in the address cache, since it is not created by name. 27251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 27351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski InetAddress() { 27451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski holder = new InetAddressHolder(); 27551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 27651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 27751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski /** 27851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Replaces the de-serialized object with an Inet4Address object. 27951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 28051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @return the alternate object to the de-serialized object. 28151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 28251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @throws ObjectStreamException if a new object replacing this 28351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * object could not be created 28451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 28551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski private Object readResolve() throws ObjectStreamException { 28651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski // will replace the deserialized 'this' object 28751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski return new Inet4Address(holder().getHostName(), holder().getAddress()); 28851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 28951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 29051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski /** 29151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Utility routine to check if the InetAddress is an 29251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * IP multicast address. 29351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @return a <code>boolean</code> indicating if the InetAddress is 29451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * an IP multicast address 29551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @since JDK1.1 29651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 29751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski public boolean isMulticastAddress() { 29851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski return false; 29951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 30051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 30151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski /** 30251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Utility routine to check if the InetAddress in a wildcard address. 30351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @return a <code>boolean</code> indicating if the Inetaddress is 30451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * a wildcard address. 30551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @since 1.4 30651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 30751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski public boolean isAnyLocalAddress() { 30851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski return false; 30951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 31051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 31151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski /** 31251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Utility routine to check if the InetAddress is a loopback address. 31351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 31451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @return a <code>boolean</code> indicating if the InetAddress is 31551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * a loopback address; or false otherwise. 31651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @since 1.4 31751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 31851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski public boolean isLoopbackAddress() { 31951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski return false; 32051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 32151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 32251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski /** 32351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Utility routine to check if the InetAddress is an link local address. 32451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 32551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @return a <code>boolean</code> indicating if the InetAddress is 32651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * a link local address; or false if address is not a link local unicast address. 32751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @since 1.4 32851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 32951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski public boolean isLinkLocalAddress() { 33051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski return false; 33151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 33251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 33351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski /** 33451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Utility routine to check if the InetAddress is a site local address. 33551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 33651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @return a <code>boolean</code> indicating if the InetAddress is 33751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * a site local address; or false if address is not a site local unicast address. 33851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @since 1.4 33951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 34051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski public boolean isSiteLocalAddress() { 34151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski return false; 34251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 34351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 34451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski /** 34551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Utility routine to check if the multicast address has global scope. 34651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 34751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @return a <code>boolean</code> indicating if the address has 34851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * is a multicast address of global scope, false if it is not 34951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * of global scope or it is not a multicast address 35051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @since 1.4 35151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 35251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski public boolean isMCGlobal() { 35351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski return false; 35451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 35551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 35651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski /** 35751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Utility routine to check if the multicast address has node scope. 35851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 35951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @return a <code>boolean</code> indicating if the address has 36051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * is a multicast address of node-local scope, false if it is not 36151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * of node-local scope or it is not a multicast address 36251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @since 1.4 36351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 36451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski public boolean isMCNodeLocal() { 36551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski return false; 36651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 36751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 36851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski /** 36951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Utility routine to check if the multicast address has link scope. 37051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 37151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @return a <code>boolean</code> indicating if the address has 37251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * is a multicast address of link-local scope, false if it is not 37351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * of link-local scope or it is not a multicast address 37451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @since 1.4 37551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 37651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski public boolean isMCLinkLocal() { 37751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski return false; 37851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 37951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 38051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski /** 38151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Utility routine to check if the multicast address has site scope. 38251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 38351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @return a <code>boolean</code> indicating if the address has 38451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * is a multicast address of site-local scope, false if it is not 38551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * of site-local scope or it is not a multicast address 38651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @since 1.4 38751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 38851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski public boolean isMCSiteLocal() { 38951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski return false; 39051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 39151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 39251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski /** 39351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Utility routine to check if the multicast address has organization scope. 39451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 39551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @return a <code>boolean</code> indicating if the address has 39651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * is a multicast address of organization-local scope, 39751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * false if it is not of organization-local scope 39851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * or it is not a multicast address 39951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @since 1.4 40051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 40151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski public boolean isMCOrgLocal() { 40251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski return false; 40351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 40451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 40551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 40651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski /** 40751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Test whether that address is reachable. Best effort is made by the 40851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * implementation to try to reach the host, but firewalls and server 40951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * configuration may block requests resulting in a unreachable status 41051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * while some specific ports may be accessible. 41151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * A typical implementation will use ICMP ECHO REQUESTs if the 41251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * privilege can be obtained, otherwise it will try to establish 41351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * a TCP connection on port 7 (Echo) of the destination host. 41451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <p> 41551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * The timeout value, in milliseconds, indicates the maximum amount of time 41651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * the try should take. If the operation times out before getting an 41751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * answer, the host is deemed unreachable. A negative value will result 41851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * in an IllegalArgumentException being thrown. 41951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 42051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @param timeout the time, in milliseconds, before the call aborts 42151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @return a <code>boolean</code> indicating if the address is reachable. 42251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @throws IOException if a network error occurs 42351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @throws IllegalArgumentException if <code>timeout</code> is negative. 42451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @since 1.5 42551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 42651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski public boolean isReachable(int timeout) throws IOException { 42751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski return isReachable(null, 0 , timeout); 42851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 42951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 43051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski /** 43151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Test whether that address is reachable. Best effort is made by the 43251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * implementation to try to reach the host, but firewalls and server 43351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * configuration may block requests resulting in a unreachable status 43451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * while some specific ports may be accessible. 43551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * A typical implementation will use ICMP ECHO REQUESTs if the 43651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * privilege can be obtained, otherwise it will try to establish 43751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * a TCP connection on port 7 (Echo) of the destination host. 43851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <p> 43951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * The <code>network interface</code> and <code>ttl</code> parameters 44051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * let the caller specify which network interface the test will go through 44151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * and the maximum number of hops the packets should go through. 44251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * A negative value for the <code>ttl</code> will result in an 44351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * IllegalArgumentException being thrown. 44451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <p> 44551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * The timeout value, in milliseconds, indicates the maximum amount of time 44651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * the try should take. If the operation times out before getting an 44751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * answer, the host is deemed unreachable. A negative value will result 44851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * in an IllegalArgumentException being thrown. 44951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 45051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @param netif the NetworkInterface through which the 45151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * test will be done, or null for any interface 45251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @param ttl the maximum numbers of hops to try or 0 for the 45351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * default 45451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @param timeout the time, in milliseconds, before the call aborts 45551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @throws IllegalArgumentException if either <code>timeout</code> 45651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * or <code>ttl</code> are negative. 45751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @return a <code>boolean</code>indicating if the address is reachable. 45851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @throws IOException if a network error occurs 45951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @since 1.5 46051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 46151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski public boolean isReachable(NetworkInterface netif, int ttl, 46251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski int timeout) throws IOException { 46351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski if (ttl < 0) 46451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski throw new IllegalArgumentException("ttl can't be negative"); 46551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski if (timeout < 0) 46651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski throw new IllegalArgumentException("timeout can't be negative"); 46751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 46851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski return impl.isReachable(this, timeout, netif, ttl); 46951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 47051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 47151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski /** 47251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Gets the host name for this IP address. 47351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 47451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <p>If this InetAddress was created with a host name, 47551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * this host name will be remembered and returned; 47651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * otherwise, a reverse name lookup will be performed 47751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * and the result will be returned based on the system 47851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * configured name lookup service. If a lookup of the name service 47951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * is required, call 48051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * {@link #getCanonicalHostName() getCanonicalHostName}. 48151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 48251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <p>If there is a security manager, its 48351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <code>checkConnect</code> method is first called 48451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * with the hostname and <code>-1</code> 48551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * as its arguments to see if the operation is allowed. 48651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * If the operation is not allowed, it will return 48751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * the textual representation of the IP address. 48851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 48951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @return the host name for this IP address, or if the operation 49051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * is not allowed by the security check, the textual 49151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * representation of the IP address. 49251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 49351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @see InetAddress#getCanonicalHostName 49451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @see SecurityManager#checkConnect 49551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 49651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski public String getHostName() { 49751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski return getHostName(true); 49851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 49951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 50051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski /** 50151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Returns the hostname for this address. 50251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * If the host is equal to null, then this address refers to any 50351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * of the local machine's available network addresses. 50451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * this is package private so SocketPermission can make calls into 50551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * here without a security check. 50651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 50751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <p>If there is a security manager, this method first 50851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * calls its <code>checkConnect</code> method 50951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * with the hostname and <code>-1</code> 51051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * as its arguments to see if the calling code is allowed to know 51151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * the hostname for this IP address, i.e., to connect to the host. 51251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * If the operation is not allowed, it will return 51351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * the textual representation of the IP address. 51451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 51551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @return the host name for this IP address, or if the operation 51651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * is not allowed by the security check, the textual 51751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * representation of the IP address. 51851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 51951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @param check make security check if true 52051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 52151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @see SecurityManager#checkConnect 52251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 52351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski String getHostName(boolean check) { 52451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski if (holder().getHostName() == null) { 52551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski holder().hostName = InetAddress.getHostFromNameService(this, check); 52651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 52751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski return holder().getHostName(); 52851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 52951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 53051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski /** 53151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Gets the fully qualified domain name for this IP address. 53251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Best effort method, meaning we may not be able to return 53351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * the FQDN depending on the underlying system configuration. 53451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 53551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <p>If there is a security manager, this method first 53651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * calls its <code>checkConnect</code> method 53751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * with the hostname and <code>-1</code> 53851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * as its arguments to see if the calling code is allowed to know 53951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * the hostname for this IP address, i.e., to connect to the host. 54051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * If the operation is not allowed, it will return 54151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * the textual representation of the IP address. 54251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 54351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @return the fully qualified domain name for this IP address, 54451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * or if the operation is not allowed by the security check, 54551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * the textual representation of the IP address. 54651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 54751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @see SecurityManager#checkConnect 54851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 54951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @since 1.4 55051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 55151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski public String getCanonicalHostName() { 55251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski if (canonicalHostName == null) { 55351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski canonicalHostName = 55451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski InetAddress.getHostFromNameService(this, true); 55551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 55651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski return canonicalHostName; 55751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 55851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 55951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski /** 56051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Returns the hostname for this address. 56151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 56251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <p>If there is a security manager, this method first 56351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * calls its <code>checkConnect</code> method 56451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * with the hostname and <code>-1</code> 56551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * as its arguments to see if the calling code is allowed to know 56651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * the hostname for this IP address, i.e., to connect to the host. 56751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * If the operation is not allowed, it will return 56851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * the textual representation of the IP address. 56951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 57051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @return the host name for this IP address, or if the operation 57151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * is not allowed by the security check, the textual 57251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * representation of the IP address. 57351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 57451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @param check make security check if true 57551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 57651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @see SecurityManager#checkConnect 57751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 57851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski private static String getHostFromNameService(InetAddress addr, boolean check) { 57951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski String host = null; 58051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski for (NameService nameService : nameServices) { 58151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski try { 58251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski // first lookup the hostname 58351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski host = nameService.getHostByAddr(addr.getAddress()); 58451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 58551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski /* check to see if calling code is allowed to know 58651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * the hostname for this IP address, ie, connect to the host 58751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 58851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski if (check) { 58951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski SecurityManager sec = System.getSecurityManager(); 59051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski if (sec != null) { 59151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski sec.checkConnect(host, -1); 59251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 59351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 59451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 59551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski /* now get all the IP addresses for this hostname, 59651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * and make sure one of them matches the original IP 59751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * address. We do this to try and prevent spoofing. 59851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 59951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 60051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski InetAddress[] arr = InetAddress.getAllByName0(host, check); 60151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski boolean ok = false; 60251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 60351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski if(arr != null) { 60451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski for(int i = 0; !ok && i < arr.length; i++) { 60551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski ok = addr.equals(arr[i]); 60651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 60751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 60851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 60951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski //XXX: if it looks a spoof just return the address? 61051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski if (!ok) { 61151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski host = addr.getHostAddress(); 61251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski return host; 61351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 61451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 61551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski break; 61651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 61751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } catch (SecurityException e) { 61851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski host = addr.getHostAddress(); 61951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski break; 62051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } catch (UnknownHostException e) { 62151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski host = addr.getHostAddress(); 62251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski // let next provider resolve the hostname 62351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 62451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 62551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 62651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski return host; 62751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 62851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 62951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski /** 63051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Returns the raw IP address of this <code>InetAddress</code> 63151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * object. The result is in network byte order: the highest order 63251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * byte of the address is in <code>getAddress()[0]</code>. 63351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 63451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @return the raw IP address of this object. 63551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 63651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski public byte[] getAddress() { 63751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski return null; 63851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 63951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 64051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski /** 64151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Returns the IP address string in textual presentation. 64251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 64351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @return the raw IP address in a string format. 64451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @since JDK1.0.2 64551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 64651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski public String getHostAddress() { 64751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski return null; 64851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 64951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 65051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski /** 65151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Returns a hashcode for this IP address. 65251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 65351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @return a hash code value for this IP address. 65451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 65551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski public int hashCode() { 65651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski return -1; 65751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 65851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 65951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski /** 66051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Compares this object against the specified object. 66151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * The result is <code>true</code> if and only if the argument is 66251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * not <code>null</code> and it represents the same IP address as 66351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * this object. 66451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <p> 66551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Two instances of <code>InetAddress</code> represent the same IP 66651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * address if the length of the byte arrays returned by 66751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <code>getAddress</code> is the same for both, and each of the 66851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * array components is the same for the byte arrays. 66951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 67051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @param obj the object to compare against. 67151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @return <code>true</code> if the objects are the same; 67251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <code>false</code> otherwise. 67351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @see java.net.InetAddress#getAddress() 67451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 67551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski public boolean equals(Object obj) { 67651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski return false; 67751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 67851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 67951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski /** 68051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Converts this IP address to a <code>String</code>. The 68151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * string returned is of the form: hostname / literal IP 68251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * address. 68351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 68451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * If the host name is unresolved, no reverse name service lookup 68551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * is performed. The hostname part will be represented by an empty string. 68651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 68751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @return a string representation of this IP address. 68851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 68951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski public String toString() { 69051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski String hostName = holder().getHostName(); 69151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski return ((hostName != null) ? hostName : "") 69251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski + "/" + getHostAddress(); 69351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 69451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 69551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski /* 69651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Cached addresses - our own litle nis, not! 69751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 69851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski private static Cache addressCache = new Cache(Cache.Type.Positive); 69951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 70051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski private static Cache negativeCache = new Cache(Cache.Type.Negative); 70151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 70251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski private static boolean addressCacheInit = false; 70351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 70451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski static InetAddress[] unknown_array; // put THIS in cache 70551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 70651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski static InetAddressImpl impl; 70751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 70851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski private static final HashMap<String, Void> lookupTable = new HashMap<>(); 70951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 71051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski /** 71151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Represents a cache entry 71251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 71351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski static final class CacheEntry { 71451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 71551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski CacheEntry(InetAddress[] addresses, long expiration) { 71651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski this.addresses = addresses; 71751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski this.expiration = expiration; 71851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 71951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 72051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski InetAddress[] addresses; 72151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski long expiration; 72251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 72351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 72451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski /** 72551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * A cache that manages entries based on a policy specified 72651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * at creation time. 72751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 72851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski static final class Cache { 72951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski private LinkedHashMap<String, CacheEntry> cache; 73051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski private Type type; 73151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 73251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski enum Type {Positive, Negative}; 73351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 73451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski /** 73551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Create cache 73651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 73751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski public Cache(Type type) { 73851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski this.type = type; 73951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski cache = new LinkedHashMap<String, CacheEntry>(); 74051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 74151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 74251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski private int getPolicy() { 74351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski if (type == Type.Positive) { 74451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski return InetAddressCachePolicy.get(); 74551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } else { 74651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski return InetAddressCachePolicy.getNegative(); 74751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 74851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 74951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 75051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski /** 75151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Add an entry to the cache. If there's already an 75251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * entry then for this host then the entry will be 75351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * replaced. 75451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 75551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski public Cache put(String host, InetAddress[] addresses) { 75651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski int policy = getPolicy(); 75751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski if (policy == InetAddressCachePolicy.NEVER) { 75851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski return this; 75951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 76051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 76151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski // purge any expired entries 76251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 76351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski if (policy != InetAddressCachePolicy.FOREVER) { 76451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 76551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski // As we iterate in insertion order we can 76651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski // terminate when a non-expired entry is found. 76751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski LinkedList<String> expired = new LinkedList<>(); 76851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski long now = System.currentTimeMillis(); 76951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski for (String key : cache.keySet()) { 77051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski CacheEntry entry = cache.get(key); 77151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 77251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski if (entry.expiration >= 0 && entry.expiration < now) { 77351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski expired.add(key); 77451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } else { 77551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski break; 77651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 77751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 77851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 77951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski for (String key : expired) { 78051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski cache.remove(key); 78151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 78251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 78351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 78451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski // create new entry and add it to the cache 78551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski // -- as a HashMap replaces existing entries we 78651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski // don't need to explicitly check if there is 78751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski // already an entry for this host. 78851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski long expiration; 78951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski if (policy == InetAddressCachePolicy.FOREVER) { 79051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski expiration = -1; 79151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } else { 79251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski expiration = System.currentTimeMillis() + (policy * 1000); 79351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 79451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski CacheEntry entry = new CacheEntry(addresses, expiration); 79551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski cache.put(host, entry); 79651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski return this; 79751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 79851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 79951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski /** 80051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Query the cache for the specific host. If found then 80151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * return its CacheEntry, or null if not found. 80251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 80351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski public CacheEntry get(String host) { 80451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski int policy = getPolicy(); 80551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski if (policy == InetAddressCachePolicy.NEVER) { 80651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski return null; 80751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 80851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski CacheEntry entry = cache.get(host); 80951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 81051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski // check if entry has expired 81151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski if (entry != null && policy != InetAddressCachePolicy.FOREVER) { 81251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski if (entry.expiration >= 0 && 81351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski entry.expiration < System.currentTimeMillis()) { 81451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski cache.remove(host); 81551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski entry = null; 81651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 81751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 81851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 81951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski return entry; 82051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 82151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 82251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 82351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski /* 82451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Initialize cache and insert anyLocalAddress into the 82551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * unknown array with no expiry. 82651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 82751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski private static void cacheInitIfNeeded() { 82851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski assert Thread.holdsLock(addressCache); 82951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski if (addressCacheInit) { 83051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski return; 83151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 83251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski unknown_array = new InetAddress[1]; 83351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski unknown_array[0] = impl.anyLocalAddress(); 83451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 83551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski addressCache.put(impl.anyLocalAddress().getHostName(), 83651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski unknown_array); 83751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 83851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski addressCacheInit = true; 83951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 84051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 84151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski /* 84251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Cache the given hostname and addresses. 84351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 84451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski private static void cacheAddresses(String hostname, 84551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski InetAddress[] addresses, 84651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski boolean success) { 84751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski hostname = hostname.toLowerCase(); 84851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski synchronized (addressCache) { 84951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski cacheInitIfNeeded(); 85051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski if (success) { 85151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski addressCache.put(hostname, addresses); 85251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } else { 85351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski negativeCache.put(hostname, addresses); 85451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 85551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 85651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 85751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 85851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski /* 85951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Lookup hostname in cache (positive & negative cache). If 86051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * found return addresses, null if not found. 86151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 86251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski private static InetAddress[] getCachedAddresses(String hostname) { 86351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski hostname = hostname.toLowerCase(); 86451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 86551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski // search both positive & negative caches 86651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 86751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski synchronized (addressCache) { 86851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski cacheInitIfNeeded(); 86951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 87051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski CacheEntry entry = addressCache.get(hostname); 87151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski if (entry == null) { 87251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski entry = negativeCache.get(hostname); 87351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 87451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 87551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski if (entry != null) { 87651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski return entry.addresses; 87751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 87851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 87951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 88051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski // not found 88151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski return null; 88251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 88351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 88451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski private static NameService createNSProvider(String provider) { 88551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski if (provider == null) 88651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski return null; 88751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 88851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski NameService nameService = null; 88951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski if (provider.equals("default")) { 89051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski // initialize the default name service 89151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski nameService = new NameService() { 89251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski public InetAddress[] lookupAllHostAddr(String host) 89351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski throws UnknownHostException { 89451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski return impl.lookupAllHostAddr(host); 89551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 89651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski public String getHostByAddr(byte[] addr) 89751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski throws UnknownHostException { 89851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski return impl.getHostByAddr(addr); 89951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 90051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski }; 90151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } else { 90251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski final String providerName = provider; 90351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski try { 90451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski nameService = java.security.AccessController.doPrivileged( 90551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski new java.security.PrivilegedExceptionAction<NameService>() { 90651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski public NameService run() { 90751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski Iterator itr = Service.providers(NameServiceDescriptor.class); 90851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski while (itr.hasNext()) { 90951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski NameServiceDescriptor nsd 91051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski = (NameServiceDescriptor)itr.next(); 91151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski if (providerName. 91251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski equalsIgnoreCase(nsd.getType()+"," 91351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski +nsd.getProviderName())) { 91451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski try { 91551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski return nsd.createNameService(); 91651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } catch (Exception e) { 91751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski e.printStackTrace(); 91851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski System.err.println( 91951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski "Cannot create name service:" 92051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski +providerName+": " + e); 92151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 92251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 92351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 92451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 92551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski return null; 92651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 92751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 92851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski ); 92951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } catch (java.security.PrivilegedActionException e) { 93051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 93151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 93251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 93351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski return nameService; 93451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 93551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 93651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski static { 93751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski // create the impl 93851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski impl = InetAddressImplFactory.create(); 93951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 94051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski // get name service if provided and requested 94151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski String provider = null;; 94251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski String propPrefix = "sun.net.spi.nameservice.provider."; 94351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski int n = 1; 94451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski nameServices = new ArrayList<NameService>(); 94551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski provider = AccessController.doPrivileged( 94651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski new GetPropertyAction(propPrefix + n)); 94751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski while (provider != null) { 94851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski NameService ns = createNSProvider(provider); 94951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski if (ns != null) 95051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski nameServices.add(ns); 95151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 95251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski n++; 95351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski provider = AccessController.doPrivileged( 95451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski new GetPropertyAction(propPrefix + n)); 95551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 95651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 95751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski // if not designate any name services provider, 95851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski // create a default one 95951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski if (nameServices.size() == 0) { 96051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski NameService ns = createNSProvider("default"); 96151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski nameServices.add(ns); 96251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 96351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 96451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 96551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski /** 96651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Creates an InetAddress based on the provided host name and IP address. 96751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * No name service is checked for the validity of the address. 96851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 96951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <p> The host name can either be a machine name, such as 97051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * "<code>java.sun.com</code>", or a textual representation of its IP 97151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * address. 97251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <p> No validity checking is done on the host name either. 97351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 97451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <p> If addr specifies an IPv4 address an instance of Inet4Address 97551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * will be returned; otherwise, an instance of Inet6Address 97651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * will be returned. 97751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 97851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <p> IPv4 address byte array must be 4 bytes long and IPv6 byte array 97951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * must be 16 bytes long 98051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 98151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @param host the specified host 98251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @param addr the raw IP address in network byte order 98351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @return an InetAddress object created from the raw IP address. 98451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @exception UnknownHostException if IP address is of illegal length 98551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @since 1.4 98651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 98751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski public static InetAddress getByAddress(String host, byte[] addr) 98851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski throws UnknownHostException { 98951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski if (host != null && host.length() > 0 && host.charAt(0) == '[') { 99051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski if (host.charAt(host.length()-1) == ']') { 99151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski host = host.substring(1, host.length() -1); 99251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 99351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 99451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski if (addr != null) { 99551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski if (addr.length == Inet4Address.INADDRSZ) { 99651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski return new Inet4Address(host, addr); 99751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } else if (addr.length == Inet6Address.INADDRSZ) { 99851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski byte[] newAddr 99951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski = IPAddressUtil.convertFromIPv4MappedAddress(addr); 100051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski if (newAddr != null) { 100151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski return new Inet4Address(host, newAddr); 100251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } else { 100351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski return new Inet6Address(host, addr); 100451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 100551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 100651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 100751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski throw new UnknownHostException("addr is of illegal length"); 100851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 100951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 101051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 101151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski /** 101251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Determines the IP address of a host, given the host's name. 101351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 101451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <p> The host name can either be a machine name, such as 101551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * "<code>java.sun.com</code>", or a textual representation of its 101651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * IP address. If a literal IP address is supplied, only the 101751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * validity of the address format is checked. 101851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 101951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <p> For <code>host</code> specified in literal IPv6 address, 102051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * either the form defined in RFC 2732 or the literal IPv6 address 102151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * format defined in RFC 2373 is accepted. IPv6 scoped addresses are also 102251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * supported. See <a href="Inet6Address.html#scoped">here</a> for a description of IPv6 102351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * scoped addresses. 102451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 102551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <p> If the host is <tt>null</tt> then an <tt>InetAddress</tt> 102651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * representing an address of the loopback interface is returned. 102751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * See <a href="http://www.ietf.org/rfc/rfc3330.txt">RFC 3330</a> 102851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * section 2 and <a href="http://www.ietf.org/rfc/rfc2373.txt">RFC 2373</a> 102951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * section 2.5.3. </p> 103051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 103151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @param host the specified host, or <code>null</code>. 103251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @return an IP address for the given host name. 103351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @exception UnknownHostException if no IP address for the 103451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <code>host</code> could be found, or if a scope_id was specified 103551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * for a global IPv6 address. 103651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @exception SecurityException if a security manager exists 103751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * and its checkConnect method doesn't allow the operation 103851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 103951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski public static InetAddress getByName(String host) 104051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski throws UnknownHostException { 104151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski return InetAddress.getAllByName(host)[0]; 104251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 104351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 104451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski // called from deployment cache manager 104551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski private static InetAddress getByName(String host, InetAddress reqAddr) 104651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski throws UnknownHostException { 104751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski return InetAddress.getAllByName(host, reqAddr)[0]; 104851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 104951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 105051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski /** 105151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Given the name of a host, returns an array of its IP addresses, 105251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * based on the configured name service on the system. 105351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 105451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <p> The host name can either be a machine name, such as 105551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * "<code>java.sun.com</code>", or a textual representation of its IP 105651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * address. If a literal IP address is supplied, only the 105751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * validity of the address format is checked. 105851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 105951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <p> For <code>host</code> specified in <i>literal IPv6 address</i>, 106051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * either the form defined in RFC 2732 or the literal IPv6 address 106151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * format defined in RFC 2373 is accepted. A literal IPv6 address may 106251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * also be qualified by appending a scoped zone identifier or scope_id. 106351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * The syntax and usage of scope_ids is described 106451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <a href="Inet6Address.html#scoped">here</a>. 106551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <p> If the host is <tt>null</tt> then an <tt>InetAddress</tt> 106651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * representing an address of the loopback interface is returned. 106751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * See <a href="http://www.ietf.org/rfc/rfc3330.txt">RFC 3330</a> 106851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * section 2 and <a href="http://www.ietf.org/rfc/rfc2373.txt">RFC 2373</a> 106951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * section 2.5.3. </p> 107051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 107151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <p> If there is a security manager and <code>host</code> is not 107251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * null and <code>host.length() </code> is not equal to zero, the 107351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * security manager's 107451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <code>checkConnect</code> method is called 107551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * with the hostname and <code>-1</code> 107651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * as its arguments to see if the operation is allowed. 107751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 107851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @param host the name of the host, or <code>null</code>. 107951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @return an array of all the IP addresses for a given host name. 108051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 108151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @exception UnknownHostException if no IP address for the 108251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <code>host</code> could be found, or if a scope_id was specified 108351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * for a global IPv6 address. 108451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @exception SecurityException if a security manager exists and its 108551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <code>checkConnect</code> method doesn't allow the operation. 108651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 108751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @see SecurityManager#checkConnect 108851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 108951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski public static InetAddress[] getAllByName(String host) 109051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski throws UnknownHostException { 109151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski return getAllByName(host, null); 109251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 109351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 109451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski private static InetAddress[] getAllByName(String host, InetAddress reqAddr) 109551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski throws UnknownHostException { 109651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 109751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski if (host == null || host.length() == 0) { 109851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski InetAddress[] ret = new InetAddress[1]; 109951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski ret[0] = impl.loopbackAddress(); 110051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski return ret; 110151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 110251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 110351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski boolean ipv6Expected = false; 110451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski if (host.charAt(0) == '[') { 110551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski // This is supposed to be an IPv6 literal 110651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski if (host.length() > 2 && host.charAt(host.length()-1) == ']') { 110751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski host = host.substring(1, host.length() -1); 110851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski ipv6Expected = true; 110951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } else { 111051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski // This was supposed to be a IPv6 address, but it's not! 111151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski throw new UnknownHostException(host + ": invalid IPv6 address"); 111251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 111351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 111451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 111551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski // if host is an IP address, we won't do further lookup 111651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski if (Character.digit(host.charAt(0), 16) != -1 111751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski || (host.charAt(0) == ':')) { 111851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski byte[] addr = null; 111951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski int numericZone = -1; 112051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski String ifname = null; 112151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski // see if it is IPv4 address 112251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski addr = IPAddressUtil.textToNumericFormatV4(host); 112351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski if (addr == null) { 112451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski // see if it is IPv6 address 112551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski // Check if a numeric or string zone id is present 112651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski int pos; 112751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski if ((pos=host.indexOf ("%")) != -1) { 112851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski numericZone = checkNumericZone (host); 112951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski if (numericZone == -1) { /* remainder of string must be an ifname */ 113051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski ifname = host.substring (pos+1); 113151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 113251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 113351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski addr = IPAddressUtil.textToNumericFormatV6(host); 113451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } else if (ipv6Expected) { 113551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski // Means an IPv4 litteral between brackets! 113651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski throw new UnknownHostException("["+host+"]"); 113751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 113851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski InetAddress[] ret = new InetAddress[1]; 113951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski if(addr != null) { 114051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski if (addr.length == Inet4Address.INADDRSZ) { 114151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski ret[0] = new Inet4Address(null, addr); 114251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } else { 114351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski if (ifname != null) { 114451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski ret[0] = new Inet6Address(null, addr, ifname); 114551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } else { 114651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski ret[0] = new Inet6Address(null, addr, numericZone); 114751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 114851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 114951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski return ret; 115051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 115151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } else if (ipv6Expected) { 115251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski // We were expecting an IPv6 Litteral, but got something else 115351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski throw new UnknownHostException("["+host+"]"); 115451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 115551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski return getAllByName0(host, reqAddr, true); 115651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 115751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 115851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski /** 115951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Returns the loopback address. 116051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <p> 116151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * The InetAddress returned will represent the IPv4 116251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * loopback address, 127.0.0.1, or the IPv6 loopback 116351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * address, ::1. The IPv4 loopback address returned 116451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * is only one of many in the form 127.*.*.* 116551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 116651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @return the InetAddress loopback instance. 116751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @since 1.7 116851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 116951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski public static InetAddress getLoopbackAddress() { 117051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski return impl.loopbackAddress(); 117151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 117251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 117351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 117451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski /** 117551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * check if the literal address string has %nn appended 117651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * returns -1 if not, or the numeric value otherwise. 117751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 117851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * %nn may also be a string that represents the displayName of 117951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * a currently available NetworkInterface. 118051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 118151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski private static int checkNumericZone (String s) throws UnknownHostException { 118251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski int percent = s.indexOf ('%'); 118351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski int slen = s.length(); 118451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski int digit, zone=0; 118551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski if (percent == -1) { 118651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski return -1; 118751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 118851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski for (int i=percent+1; i<slen; i++) { 118951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski char c = s.charAt(i); 119051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski if (c == ']') { 119151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski if (i == percent+1) { 119251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski /* empty per-cent field */ 119351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski return -1; 119451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 119551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski break; 119651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 119751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski if ((digit = Character.digit (c, 10)) < 0) { 119851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski return -1; 119951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 120051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski zone = (zone * 10) + digit; 120151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 120251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski return zone; 120351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 120451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 120551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski private static InetAddress[] getAllByName0 (String host) 120651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski throws UnknownHostException 120751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski { 120851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski return getAllByName0(host, true); 120951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 121051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 121151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski /** 121251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * package private so SocketPermission can call it 121351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 121451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski static InetAddress[] getAllByName0 (String host, boolean check) 121551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski throws UnknownHostException { 121651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski return getAllByName0 (host, null, check); 121751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 121851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 121951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski private static InetAddress[] getAllByName0 (String host, InetAddress reqAddr, boolean check) 122051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski throws UnknownHostException { 122151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 122251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski /* If it gets here it is presumed to be a hostname */ 122351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski /* Cache.get can return: null, unknownAddress, or InetAddress[] */ 122451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 122551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski /* make sure the connection to the host is allowed, before we 122651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * give out a hostname 122751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 122851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski if (check) { 122951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski SecurityManager security = System.getSecurityManager(); 123051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski if (security != null) { 123151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski security.checkConnect(host, -1); 123251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 123351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 123451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 123551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski InetAddress[] addresses = getCachedAddresses(host); 123651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 123751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski /* If no entry in cache, then do the host lookup */ 123851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski if (addresses == null) { 123951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski addresses = getAddressesFromNameService(host, reqAddr); 124051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 124151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 124251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski if (addresses == unknown_array) 124351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski throw new UnknownHostException(host); 124451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 124551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski return addresses.clone(); 124651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 124751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 124851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski private static InetAddress[] getAddressesFromNameService(String host, InetAddress reqAddr) 124951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski throws UnknownHostException 125051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski { 125151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski InetAddress[] addresses = null; 125251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski boolean success = false; 125351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski UnknownHostException ex = null; 125451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 125551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski // Check whether the host is in the lookupTable. 125651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski // 1) If the host isn't in the lookupTable when 125751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski // checkLookupTable() is called, checkLookupTable() 125851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski // would add the host in the lookupTable and 125951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski // return null. So we will do the lookup. 126051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski // 2) If the host is in the lookupTable when 126151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski // checkLookupTable() is called, the current thread 126251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski // would be blocked until the host is removed 126351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski // from the lookupTable. Then this thread 126451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski // should try to look up the addressCache. 126551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski // i) if it found the addresses in the 126651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski // addressCache, checkLookupTable() would 126751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski // return the addresses. 126851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski // ii) if it didn't find the addresses in the 126951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski // addressCache for any reason, 127051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski // it should add the host in the 127151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski // lookupTable and return null so the 127251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski // following code would do a lookup itself. 127351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski if ((addresses = checkLookupTable(host)) == null) { 127451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski try { 127551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski // This is the first thread which looks up the addresses 127651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski // this host or the cache entry for this host has been 127751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski // expired so this thread should do the lookup. 127851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski for (NameService nameService : nameServices) { 127951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski try { 128051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski /* 128151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Do not put the call to lookup() inside the 128251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * constructor. if you do you will still be 128351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * allocating space when the lookup fails. 128451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 128551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 128651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski addresses = nameService.lookupAllHostAddr(host); 128751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski success = true; 128851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski break; 128951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } catch (UnknownHostException uhe) { 129051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski if (host.equalsIgnoreCase("localhost")) { 129151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski InetAddress[] local = new InetAddress[] { impl.loopbackAddress() }; 129251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski addresses = local; 129351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski success = true; 129451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski break; 129551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 129651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski else { 129751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski addresses = unknown_array; 129851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski success = false; 129951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski ex = uhe; 130051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 130151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 130251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 130351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 130451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski // More to do? 130551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski if (reqAddr != null && addresses.length > 1 && !addresses[0].equals(reqAddr)) { 130651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski // Find it? 130751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski int i = 1; 130851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski for (; i < addresses.length; i++) { 130951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski if (addresses[i].equals(reqAddr)) { 131051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski break; 131151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 131251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 131351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski // Rotate 131451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski if (i < addresses.length) { 131551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski InetAddress tmp, tmp2 = reqAddr; 131651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski for (int j = 0; j < i; j++) { 131751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski tmp = addresses[j]; 131851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski addresses[j] = tmp2; 131951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski tmp2 = tmp; 132051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 132151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski addresses[i] = tmp2; 132251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 132351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 132451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski // Cache the address. 132551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski cacheAddresses(host, addresses, success); 132651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 132751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski if (!success && ex != null) 132851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski throw ex; 132951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 133051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } finally { 133151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski // Delete host from the lookupTable and notify 133251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski // all threads waiting on the lookupTable monitor. 133351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski updateLookupTable(host); 133451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 133551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 133651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 133751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski return addresses; 133851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 133951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 134051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 134151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski private static InetAddress[] checkLookupTable(String host) { 134251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski synchronized (lookupTable) { 134351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski // If the host isn't in the lookupTable, add it in the 134451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski // lookuptable and return null. The caller should do 134551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski // the lookup. 134651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski if (lookupTable.containsKey(host) == false) { 134751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski lookupTable.put(host, null); 134851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski return null; 134951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 135051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 135151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski // If the host is in the lookupTable, it means that another 135251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski // thread is trying to look up the addresses of this host. 135351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski // This thread should wait. 135451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski while (lookupTable.containsKey(host)) { 135551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski try { 135651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski lookupTable.wait(); 135751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } catch (InterruptedException e) { 135851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 135951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 136051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 136151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 136251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski // The other thread has finished looking up the addresses of 136351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski // the host. This thread should retry to get the addresses 136451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski // from the addressCache. If it doesn't get the addresses from 136551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski // the cache, it will try to look up the addresses itself. 136651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski InetAddress[] addresses = getCachedAddresses(host); 136751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski if (addresses == null) { 136851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski synchronized (lookupTable) { 136951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski lookupTable.put(host, null); 137051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski return null; 137151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 137251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 137351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 137451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski return addresses; 137551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 137651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 137751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski private static void updateLookupTable(String host) { 137851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski synchronized (lookupTable) { 137951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski lookupTable.remove(host); 138051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski lookupTable.notifyAll(); 138151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 138251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 138351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 138451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski /** 138551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Returns an <code>InetAddress</code> object given the raw IP address . 138651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * The argument is in network byte order: the highest order 138751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * byte of the address is in <code>getAddress()[0]</code>. 138851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 138951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <p> This method doesn't block, i.e. no reverse name service lookup 139051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * is performed. 139151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 139251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <p> IPv4 address byte array must be 4 bytes long and IPv6 byte array 139351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * must be 16 bytes long 139451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 139551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @param addr the raw IP address in network byte order 139651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @return an InetAddress object created from the raw IP address. 139751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @exception UnknownHostException if IP address is of illegal length 139851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @since 1.4 139951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 140051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski public static InetAddress getByAddress(byte[] addr) 140151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski throws UnknownHostException { 140251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski return getByAddress(null, addr); 140351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 140451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 140551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski private static InetAddress cachedLocalHost = null; 140651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski private static long cacheTime = 0; 140751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski private static final long maxCacheTime = 5000L; 140851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski private static final Object cacheLock = new Object(); 140951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 141051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski /** 141151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Returns the address of the local host. This is achieved by retrieving 141251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * the name of the host from the system, then resolving that name into 141351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * an <code>InetAddress</code>. 141451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 141551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <P>Note: The resolved address may be cached for a short period of time. 141651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * </P> 141751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 141851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <p>If there is a security manager, its 141951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <code>checkConnect</code> method is called 142051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * with the local host name and <code>-1</code> 142151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * as its arguments to see if the operation is allowed. 142251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * If the operation is not allowed, an InetAddress representing 142351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * the loopback address is returned. 142451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 142551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @return the address of the local host. 142651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 142751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @exception UnknownHostException if the local host name could not 142851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * be resolved into an address. 142951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 143051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @see SecurityManager#checkConnect 143151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @see java.net.InetAddress#getByName(java.lang.String) 143251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 143351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski public static InetAddress getLocalHost() throws UnknownHostException { 143451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 143551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski SecurityManager security = System.getSecurityManager(); 143651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski try { 143751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski String local = impl.getLocalHostName(); 143851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 143951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski if (security != null) { 144051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski security.checkConnect(local, -1); 144151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 144251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 144351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski if (local.equals("localhost")) { 144451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski return impl.loopbackAddress(); 144551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 144651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 144751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski InetAddress ret = null; 144851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski synchronized (cacheLock) { 144951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski long now = System.currentTimeMillis(); 145051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski if (cachedLocalHost != null) { 145151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski if ((now - cacheTime) < maxCacheTime) // Less than 5s old? 145251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski ret = cachedLocalHost; 145351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski else 145451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski cachedLocalHost = null; 145551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 145651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 145751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski // we are calling getAddressesFromNameService directly 145851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski // to avoid getting localHost from cache 145951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski if (ret == null) { 146051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski InetAddress[] localAddrs; 146151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski try { 146251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski localAddrs = 146351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski InetAddress.getAddressesFromNameService(local, null); 146451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } catch (UnknownHostException uhe) { 146551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski // Rethrow with a more informative error message. 146651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski UnknownHostException uhe2 = 146751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski new UnknownHostException(local + ": " + 146851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski uhe.getMessage()); 146951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski uhe2.initCause(uhe); 147051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski throw uhe2; 147151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 147251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski cachedLocalHost = localAddrs[0]; 147351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski cacheTime = now; 147451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski ret = localAddrs[0]; 147551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 147651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 147751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski return ret; 147851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } catch (java.lang.SecurityException e) { 147951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski return impl.loopbackAddress(); 148051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 148151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 148251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 148351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski /** 148451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Perform class load-time initializations. 148551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 148651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski private static native void init(); 148751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 148851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 148951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski /* 149051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Returns the InetAddress representing anyLocalAddress 149151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * (typically 0.0.0.0 or ::0) 149251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 149351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski static InetAddress anyLocalAddress() { 149451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski return impl.anyLocalAddress(); 149551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 149651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 149751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski /* 149851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Load and instantiate an underlying impl class 149951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 150051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski static InetAddressImpl loadImpl(String implName) { 150151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski Object impl = null; 150251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 150351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski /* 150451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Property "impl.prefix" will be prepended to the classname 150551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * of the implementation object we instantiate, to which we 150651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * delegate the real work (like native methods). This 150751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * property can vary across implementations of the java. 150851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * classes. The default is an empty String "". 150951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 151051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski String prefix = AccessController.doPrivileged( 151151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski new GetPropertyAction("impl.prefix", "")); 151251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski try { 151351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski impl = Class.forName("java.net." + prefix + implName).newInstance(); 151451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } catch (ClassNotFoundException e) { 151551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski System.err.println("Class not found: java.net." + prefix + 151651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski implName + ":\ncheck impl.prefix property " + 151751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski "in your properties file."); 151851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } catch (InstantiationException e) { 151951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski System.err.println("Could not instantiate: java.net." + prefix + 152051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski implName + ":\ncheck impl.prefix property " + 152151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski "in your properties file."); 152251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } catch (IllegalAccessException e) { 152351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski System.err.println("Cannot access class: java.net." + prefix + 152451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski implName + ":\ncheck impl.prefix property " + 152551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski "in your properties file."); 152651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 152751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 152851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski if (impl == null) { 152951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski try { 153051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski impl = Class.forName(implName).newInstance(); 153151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } catch (Exception e) { 153251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski throw new Error("System property impl.prefix incorrect"); 153351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 153451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 153551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 153651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski return (InetAddressImpl) impl; 153751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 153851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 153951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski private void readObjectNoData (ObjectInputStream s) throws 154051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski IOException, ClassNotFoundException { 154151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski if (getClass().getClassLoader() != null) { 154251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski throw new SecurityException ("invalid address type"); 154351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 154451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 154551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 154651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski private static final long FIELDS_OFFSET; 154751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski private static final sun.misc.Unsafe UNSAFE; 154851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 154951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski static { 155051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski try { 155151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski sun.misc.Unsafe unsafe = sun.misc.Unsafe.getUnsafe(); 155251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski FIELDS_OFFSET = unsafe.objectFieldOffset( 155351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski InetAddress.class.getDeclaredField("holder") 155451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski ); 155551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski UNSAFE = unsafe; 155651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } catch (ReflectiveOperationException e) { 155751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski throw new Error(e); 155851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 155951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 156051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 156151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski private void readObject (ObjectInputStream s) throws 156251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski IOException, ClassNotFoundException { 156351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski if (getClass().getClassLoader() != null) { 156451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski throw new SecurityException ("invalid address type"); 156551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 156651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski GetField gf = s.readFields(); 156751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski String host = (String)gf.get("hostName", null); 156851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski int address= gf.get("address", 0); 156951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski int family= gf.get("family", 0); 157051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski InetAddressHolder h = new InetAddressHolder(host, address, family); 157151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski UNSAFE.putObject(this, FIELDS_OFFSET, h); 157251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 157351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 157451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski /* needed because the serializable fields no longer exist */ 157551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 157651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski /** 157751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @serialField hostName String 157851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @serialField address int 157951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @serialField family int 158051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 158151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski private static final ObjectStreamField[] serialPersistentFields = { 158251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski new ObjectStreamField("hostName", String.class), 158351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski new ObjectStreamField("address", int.class), 158451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski new ObjectStreamField("family", int.class), 158551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski }; 158651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 158751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski private void writeObject (ObjectOutputStream s) throws 158851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski IOException { 158951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski if (getClass().getClassLoader() != null) { 159051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski throw new SecurityException ("invalid address type"); 159151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 159251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski PutField pf = s.putFields(); 159351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski pf.put("hostName", holder().hostName); 159451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski pf.put("address", holder().address); 159551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski pf.put("family", holder().family); 159651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski s.writeFields(); 159751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski s.flush(); 159851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 159951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski} 160051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 160151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski/* 160251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Simple factory to create the impl 160351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 160451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebskiclass InetAddressImplFactory { 160551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 160651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski static InetAddressImpl create() { 160751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski return InetAddress.loadImpl(isIPv6Supported() ? 160851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski "Inet6AddressImpl" : "Inet4AddressImpl"); 160951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 161051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 161151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski static native boolean isIPv6Supported(); 161251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski} 1613