mirror of
git://gcc.gnu.org/git/gcc.git
synced 2025-02-25 13:26:17 +08:00
InetAddress.java: Removed.
2006-11-03 Gary Benson <gbenson@redhat.com> * java/net/InetAddress.java: Removed. * java/net/natInetAddressNoNet.cc: Likewise. * java/net/natInetAddressPosix.cc: Likewise. * java/net/natInetAddressWin32.cc: Likewise. * java/net/VMInetAddress.java (getLocalHostname, lookupInaddrAny, getHostByAddr, getHostByName, aton): Replace glue methods with native ones. * java/net/natVMInetAddressNoNet.cc: New file. * java/net/natVMInetAddressPosix.cc: Likewise. * java/net/natVMInetAddressWin32.cc: Likewise. * Makefile.am, configure.ac: Reflect the above. * sources.am, Makefile.in, configure: Rebuilt. * java/net/natVMNetworkInterfaceWin32.cc (winsock2GetRealNetworkInterfaces): Create InetAddress objects using InetAddress.getByAddress. * gnu/java/net/natPlainSocketImplWin32.cc (accept, getOption): Likewise. * gnu/java/net/natPlainDatagramSocketImplWin32.cc (peekData, receive, getOption): Likewise. From-SVN: r118451
This commit is contained in:
parent
5d7de335d7
commit
adefdaca2d
@ -1,3 +1,26 @@
|
||||
2006-11-03 Gary Benson <gbenson@redhat.com>
|
||||
|
||||
* java/net/InetAddress.java: Removed.
|
||||
* java/net/natInetAddressNoNet.cc: Likewise.
|
||||
* java/net/natInetAddressPosix.cc: Likewise.
|
||||
* java/net/natInetAddressWin32.cc: Likewise.
|
||||
* java/net/VMInetAddress.java (getLocalHostname,
|
||||
lookupInaddrAny, getHostByAddr, getHostByName,
|
||||
aton): Replace glue methods with native ones.
|
||||
* java/net/natVMInetAddressNoNet.cc: New file.
|
||||
* java/net/natVMInetAddressPosix.cc: Likewise.
|
||||
* java/net/natVMInetAddressWin32.cc: Likewise.
|
||||
* Makefile.am, configure.ac: Reflect the above.
|
||||
* sources.am, Makefile.in, configure: Rebuilt.
|
||||
|
||||
* java/net/natVMNetworkInterfaceWin32.cc
|
||||
(winsock2GetRealNetworkInterfaces): Create InetAddress
|
||||
objects using InetAddress.getByAddress.
|
||||
* gnu/java/net/natPlainSocketImplWin32.cc
|
||||
(accept, getOption): Likewise.
|
||||
* gnu/java/net/natPlainDatagramSocketImplWin32.cc
|
||||
(peekData, receive, getOption): Likewise.
|
||||
|
||||
2006-11-02 Keith Seitz <keiths@redhat.com>
|
||||
|
||||
* gnu/classpath/jdwp/natVMMethod.cc (getLineTable): Implement.
|
||||
|
@ -858,7 +858,7 @@ java/lang/reflect/natConstructor.cc \
|
||||
java/lang/reflect/natField.cc \
|
||||
java/lang/reflect/natMethod.cc \
|
||||
java/net/natVMNetworkInterface.cc \
|
||||
java/net/natInetAddress.cc \
|
||||
java/net/natVMInetAddress.cc \
|
||||
java/net/natURLClassLoader.cc \
|
||||
java/nio/channels/natVMChannels.cc \
|
||||
java/nio/natDirectByteBufferImpl.cc \
|
||||
|
@ -95,7 +95,7 @@ CONFIG_HEADER = $(top_builddir)/include/config.h \
|
||||
$(top_builddir)/gcj/libgcj-config.h
|
||||
CONFIG_CLEAN_FILES = libgcj.pc libgcj.spec libgcj-test.spec \
|
||||
scripts/jar java/io/natFile.cc java/lang/ConcreteProcess.java \
|
||||
java/lang/natConcreteProcess.cc java/net/natInetAddress.cc \
|
||||
java/lang/natConcreteProcess.cc java/net/natVMInetAddress.cc \
|
||||
java/net/natVMNetworkInterface.cc \
|
||||
gnu/java/net/natPlainSocketImpl.cc \
|
||||
gnu/java/net/natPlainDatagramSocketImpl.cc \
|
||||
@ -300,7 +300,7 @@ am__libgcj_la_SOURCES_DIST = prims.cc jni.cc jvmti.cc exception.cc \
|
||||
java/lang/ref/natReference.cc java/lang/reflect/natArray.cc \
|
||||
java/lang/reflect/natConstructor.cc \
|
||||
java/lang/reflect/natField.cc java/lang/reflect/natMethod.cc \
|
||||
java/net/natVMNetworkInterface.cc java/net/natInetAddress.cc \
|
||||
java/net/natVMNetworkInterface.cc java/net/natVMInetAddress.cc \
|
||||
java/net/natURLClassLoader.cc \
|
||||
java/nio/channels/natVMChannels.cc \
|
||||
java/nio/natDirectByteBufferImpl.cc \
|
||||
@ -348,7 +348,7 @@ am__objects_2 = gnu/classpath/natSystemProperties.lo \
|
||||
java/lang/ref/natReference.lo java/lang/reflect/natArray.lo \
|
||||
java/lang/reflect/natConstructor.lo \
|
||||
java/lang/reflect/natField.lo java/lang/reflect/natMethod.lo \
|
||||
java/net/natVMNetworkInterface.lo java/net/natInetAddress.lo \
|
||||
java/net/natVMNetworkInterface.lo java/net/natVMInetAddress.lo \
|
||||
java/net/natURLClassLoader.lo \
|
||||
java/nio/channels/natVMChannels.lo \
|
||||
java/nio/natDirectByteBufferImpl.lo \
|
||||
@ -4130,7 +4130,7 @@ classpath/java/net/FileNameMap.java \
|
||||
classpath/java/net/HttpURLConnection.java \
|
||||
classpath/java/net/Inet4Address.java \
|
||||
classpath/java/net/Inet6Address.java \
|
||||
java/net/InetAddress.java \
|
||||
classpath/java/net/InetAddress.java \
|
||||
classpath/java/net/InetSocketAddress.java \
|
||||
classpath/java/net/JarURLConnection.java \
|
||||
classpath/java/net/MalformedURLException.java \
|
||||
@ -7431,7 +7431,7 @@ java/lang/reflect/natConstructor.cc \
|
||||
java/lang/reflect/natField.cc \
|
||||
java/lang/reflect/natMethod.cc \
|
||||
java/net/natVMNetworkInterface.cc \
|
||||
java/net/natInetAddress.cc \
|
||||
java/net/natVMInetAddress.cc \
|
||||
java/net/natURLClassLoader.cc \
|
||||
java/nio/channels/natVMChannels.cc \
|
||||
java/nio/natDirectByteBufferImpl.cc \
|
||||
@ -7929,7 +7929,7 @@ java/net/$(DEPDIR)/$(am__dirstamp):
|
||||
@: > java/net/$(DEPDIR)/$(am__dirstamp)
|
||||
java/net/natVMNetworkInterface.lo: java/net/$(am__dirstamp) \
|
||||
java/net/$(DEPDIR)/$(am__dirstamp)
|
||||
java/net/natInetAddress.lo: java/net/$(am__dirstamp) \
|
||||
java/net/natVMInetAddress.lo: java/net/$(am__dirstamp) \
|
||||
java/net/$(DEPDIR)/$(am__dirstamp)
|
||||
java/net/natURLClassLoader.lo: java/net/$(am__dirstamp) \
|
||||
java/net/$(DEPDIR)/$(am__dirstamp)
|
||||
@ -8261,10 +8261,10 @@ mostlyclean-compile:
|
||||
-rm -f java/lang/reflect/natField.lo
|
||||
-rm -f java/lang/reflect/natMethod.$(OBJEXT)
|
||||
-rm -f java/lang/reflect/natMethod.lo
|
||||
-rm -f java/net/natInetAddress.$(OBJEXT)
|
||||
-rm -f java/net/natInetAddress.lo
|
||||
-rm -f java/net/natURLClassLoader.$(OBJEXT)
|
||||
-rm -f java/net/natURLClassLoader.lo
|
||||
-rm -f java/net/natVMInetAddress.$(OBJEXT)
|
||||
-rm -f java/net/natVMInetAddress.lo
|
||||
-rm -f java/net/natVMNetworkInterface.$(OBJEXT)
|
||||
-rm -f java/net/natVMNetworkInterface.lo
|
||||
-rm -f java/nio/channels/natVMChannels.$(OBJEXT)
|
||||
@ -8392,8 +8392,8 @@ distclean-compile:
|
||||
@AMDEP_TRUE@@am__include@ @am__quote@java/lang/reflect/$(DEPDIR)/natConstructor.Plo@am__quote@
|
||||
@AMDEP_TRUE@@am__include@ @am__quote@java/lang/reflect/$(DEPDIR)/natField.Plo@am__quote@
|
||||
@AMDEP_TRUE@@am__include@ @am__quote@java/lang/reflect/$(DEPDIR)/natMethod.Plo@am__quote@
|
||||
@AMDEP_TRUE@@am__include@ @am__quote@java/net/$(DEPDIR)/natInetAddress.Plo@am__quote@
|
||||
@AMDEP_TRUE@@am__include@ @am__quote@java/net/$(DEPDIR)/natURLClassLoader.Plo@am__quote@
|
||||
@AMDEP_TRUE@@am__include@ @am__quote@java/net/$(DEPDIR)/natVMInetAddress.Plo@am__quote@
|
||||
@AMDEP_TRUE@@am__include@ @am__quote@java/net/$(DEPDIR)/natVMNetworkInterface.Plo@am__quote@
|
||||
@AMDEP_TRUE@@am__include@ @am__quote@java/nio/$(DEPDIR)/natDirectByteBufferImpl.Plo@am__quote@
|
||||
@AMDEP_TRUE@@am__include@ @am__quote@java/nio/channels/$(DEPDIR)/natVMChannels.Plo@am__quote@
|
||||
|
6
libjava/configure
vendored
6
libjava/configure
vendored
@ -7486,9 +7486,9 @@ test -d java/lang || mkdir java/lang
|
||||
ac_config_links="$ac_config_links java/lang/natConcreteProcess.cc:java/lang/nat${PLATFORM}Process.cc"
|
||||
|
||||
|
||||
# Likewise for natInetAddress.cc and natVMNetworkInterface.cc.
|
||||
# Likewise for natVMInetAddress.cc and natVMNetworkInterface.cc.
|
||||
test -d java/net || mkdir java/net
|
||||
ac_config_links="$ac_config_links java/net/natInetAddress.cc:java/net/natInetAddress${PLATFORMNET}.cc"
|
||||
ac_config_links="$ac_config_links java/net/natVMInetAddress.cc:java/net/natVMInetAddress${PLATFORMNET}.cc"
|
||||
|
||||
ac_config_links="$ac_config_links java/net/natVMNetworkInterface.cc:java/net/natVMNetworkInterface${PLATFORMNET}.cc"
|
||||
|
||||
@ -17479,7 +17479,7 @@ do
|
||||
"java/io/natFile.cc" ) CONFIG_LINKS="$CONFIG_LINKS java/io/natFile.cc:java/io/natFile${FILE-${PLATFORM}}.cc" ;;
|
||||
"java/lang/ConcreteProcess.java" ) CONFIG_LINKS="$CONFIG_LINKS java/lang/ConcreteProcess.java:java/lang/${PLATFORM}Process.java" ;;
|
||||
"java/lang/natConcreteProcess.cc" ) CONFIG_LINKS="$CONFIG_LINKS java/lang/natConcreteProcess.cc:java/lang/nat${PLATFORM}Process.cc" ;;
|
||||
"java/net/natInetAddress.cc" ) CONFIG_LINKS="$CONFIG_LINKS java/net/natInetAddress.cc:java/net/natInetAddress${PLATFORMNET}.cc" ;;
|
||||
"java/net/natVMInetAddress.cc" ) CONFIG_LINKS="$CONFIG_LINKS java/net/natVMInetAddress.cc:java/net/natVMInetAddress${PLATFORMNET}.cc" ;;
|
||||
"java/net/natVMNetworkInterface.cc" ) CONFIG_LINKS="$CONFIG_LINKS java/net/natVMNetworkInterface.cc:java/net/natVMNetworkInterface${PLATFORMNET}.cc" ;;
|
||||
"gnu/java/net/natPlainSocketImpl.cc" ) CONFIG_LINKS="$CONFIG_LINKS gnu/java/net/natPlainSocketImpl.cc:gnu/java/net/natPlainSocketImpl${PLATFORMNET}.cc" ;;
|
||||
"gnu/java/net/natPlainDatagramSocketImpl.cc" ) CONFIG_LINKS="$CONFIG_LINKS gnu/java/net/natPlainDatagramSocketImpl.cc:gnu/java/net/natPlainDatagramSocketImpl${PLATFORMNET}.cc" ;;
|
||||
|
@ -663,9 +663,9 @@ test -d java/lang || mkdir java/lang
|
||||
AC_CONFIG_LINKS(java/lang/ConcreteProcess.java:java/lang/${PLATFORM}Process.java)
|
||||
AC_CONFIG_LINKS(java/lang/natConcreteProcess.cc:java/lang/nat${PLATFORM}Process.cc)
|
||||
|
||||
# Likewise for natInetAddress.cc and natVMNetworkInterface.cc.
|
||||
# Likewise for natVMInetAddress.cc and natVMNetworkInterface.cc.
|
||||
test -d java/net || mkdir java/net
|
||||
AC_CONFIG_LINKS(java/net/natInetAddress.cc:java/net/natInetAddress${PLATFORMNET}.cc)
|
||||
AC_CONFIG_LINKS(java/net/natVMInetAddress.cc:java/net/natVMInetAddress${PLATFORMNET}.cc)
|
||||
AC_CONFIG_LINKS(java/net/natVMNetworkInterface.cc:java/net/natVMNetworkInterface${PLATFORMNET}.cc)
|
||||
|
||||
# Likewise for natPlainSocketImpl.cc and natPlainDatagramSocketImpl.cc.
|
||||
|
@ -1,4 +1,4 @@
|
||||
/* Copyright (C) 2003 Free Software Foundation
|
||||
/* Copyright (C) 2003, 2006 Free Software Foundation
|
||||
|
||||
This file is part of libgcj.
|
||||
|
||||
@ -238,7 +238,7 @@ gnu::java::net::PlainDatagramSocketImpl::peekData(::java::net::DatagramPacket *p
|
||||
else
|
||||
throw new ::java::net::SocketException (JvNewStringUTF ("invalid family"));
|
||||
|
||||
p->setAddress (new ::java::net::InetAddress (raddr, NULL));
|
||||
p->setAddress (::java::net::InetAddress::getByAddress (raddr));
|
||||
p->setPort (rport);
|
||||
p->length = (jint) retlen;
|
||||
return rport;
|
||||
@ -360,7 +360,7 @@ gnu::java::net::PlainDatagramSocketImpl::receive (::java::net::DatagramPacket *p
|
||||
else
|
||||
throw new ::java::net::SocketException (JvNewStringUTF ("invalid family"));
|
||||
|
||||
p->setAddress (new ::java::net::InetAddress (raddr, NULL));
|
||||
p->setAddress (::java::net::InetAddress::getByAddress (raddr));
|
||||
p->setPort (rport);
|
||||
p->length = (jint) retlen;
|
||||
return;
|
||||
@ -656,7 +656,7 @@ gnu::java::net::PlainDatagramSocketImpl::getOption (jint optID)
|
||||
else
|
||||
throw new ::java::net::SocketException (
|
||||
JvNewStringUTF ("invalid family"));
|
||||
localAddress = new ::java::net::InetAddress (laddr, NULL);
|
||||
localAddress = ::java::net::InetAddress::getByAddress (laddr);
|
||||
}
|
||||
return localAddress;
|
||||
break;
|
||||
|
@ -1,4 +1,4 @@
|
||||
/* Copyright (C) 2003, 2004, 2005 Free Software Foundation
|
||||
/* Copyright (C) 2003, 2004, 2005, 2006 Free Software Foundation
|
||||
|
||||
This file is part of libgcj.
|
||||
|
||||
@ -328,7 +328,7 @@ gnu::java::net::PlainSocketImpl::accept (gnu::java::net::PlainSocketImpl *s)
|
||||
|
||||
s->native_fd = (jint) hSocket;
|
||||
s->localport = localport;
|
||||
s->address = new ::java::net::InetAddress (raddr, NULL);
|
||||
s->address = ::java::net::InetAddress::getByAddress (raddr);
|
||||
s->port = rport;
|
||||
return;
|
||||
|
||||
@ -735,7 +735,7 @@ gnu::java::net::PlainSocketImpl::getOption (jint optID)
|
||||
else
|
||||
throw new ::java::net::SocketException
|
||||
(JvNewStringUTF ("invalid family"));
|
||||
localAddress = new ::java::net::InetAddress (laddr, NULL);
|
||||
localAddress = ::java::net::InetAddress::getByAddress (laddr);
|
||||
}
|
||||
|
||||
return localAddress;
|
||||
|
@ -1,819 +0,0 @@
|
||||
/* InetAddress.java -- Class to model an Internet address
|
||||
Copyright (C) 1998, 1999, 2002, 2004, 2005, 2006
|
||||
Free Software Foundation, Inc.
|
||||
|
||||
This file is part of GNU Classpath.
|
||||
|
||||
GNU Classpath is free software; you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation; either version 2, or (at your option)
|
||||
any later version.
|
||||
|
||||
GNU Classpath is distributed in the hope that it will be useful, but
|
||||
WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with GNU Classpath; see the file COPYING. If not, write to the
|
||||
Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
|
||||
02110-1301 USA.
|
||||
|
||||
Linking this library statically or dynamically with other modules is
|
||||
making a combined work based on this library. Thus, the terms and
|
||||
conditions of the GNU General Public License cover the whole
|
||||
combination.
|
||||
|
||||
As a special exception, the copyright holders of this library give you
|
||||
permission to link this library with independent modules to produce an
|
||||
executable, regardless of the license terms of these independent
|
||||
modules, and to copy and distribute the resulting executable under
|
||||
terms of your choice, provided that you also meet, for each linked
|
||||
independent module, the terms and conditions of the license of that
|
||||
module. An independent module is a module which is not derived from
|
||||
or based on this library. If you modify this library, you may extend
|
||||
this exception to your version of the library, but you are not
|
||||
obligated to do so. If you do not wish to do so, delete this
|
||||
exception statement from your version. */
|
||||
|
||||
|
||||
package java.net;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.io.ObjectInputStream;
|
||||
import java.io.ObjectOutputStream;
|
||||
import java.io.ObjectStreamException;
|
||||
import java.io.Serializable;
|
||||
|
||||
/**
|
||||
* This class models an Internet address. It does not have a public
|
||||
* constructor. Instead, new instances of this objects are created
|
||||
* using the static methods getLocalHost(), getByName(), and
|
||||
* getAllByName().
|
||||
*
|
||||
* <p>This class fulfills the function of the C style functions gethostname(),
|
||||
* gethostbyname(), and gethostbyaddr(). It resolves Internet DNS names
|
||||
* into their corresponding numeric addresses and vice versa.</p>
|
||||
*
|
||||
* @author Aaron M. Renn (arenn@urbanophile.com)
|
||||
* @author Per Bothner
|
||||
* @author Gary Benson (gbenson@redhat.com)
|
||||
*
|
||||
* @specnote This class is not final since JK 1.4
|
||||
*/
|
||||
public class InetAddress implements Serializable
|
||||
{
|
||||
private static final long serialVersionUID = 3286316764910316507L;
|
||||
|
||||
/**
|
||||
* Stores static localhost address object.
|
||||
*/
|
||||
static InetAddress LOCALHOST;
|
||||
static
|
||||
{
|
||||
try
|
||||
{
|
||||
LOCALHOST = getByAddress("localhost", new byte[] {127, 0, 0, 1});
|
||||
// Some soon-to-be-removed native code synchronizes on this.
|
||||
loopbackAddress = LOCALHOST;
|
||||
}
|
||||
catch (UnknownHostException e)
|
||||
{
|
||||
throw new RuntimeException("should never happen", e);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Dummy InetAddress, used to bind socket to any (all) network interfaces.
|
||||
*/
|
||||
static InetAddress ANY_IF;
|
||||
static
|
||||
{
|
||||
byte[] addr;
|
||||
try
|
||||
{
|
||||
addr = VMInetAddress.lookupInaddrAny();
|
||||
}
|
||||
catch (UnknownHostException e)
|
||||
{
|
||||
// Make one up and hope it works.
|
||||
addr = new byte[] {0, 0, 0, 0};
|
||||
}
|
||||
try
|
||||
{
|
||||
ANY_IF = getByAddress(addr);
|
||||
}
|
||||
catch (UnknownHostException e)
|
||||
{
|
||||
throw new RuntimeException("should never happen", e);
|
||||
}
|
||||
ANY_IF.hostName = ANY_IF.getHostName();
|
||||
}
|
||||
|
||||
/**
|
||||
* The Serialized Form specifies that an int 'address' is saved/restored.
|
||||
* This class uses a byte array internally so we'll just do the conversion
|
||||
* at serialization time and leave the rest of the algorithm as is.
|
||||
*/
|
||||
private int address;
|
||||
|
||||
/**
|
||||
* An array of octets representing an IP address.
|
||||
*/
|
||||
transient byte[] addr;
|
||||
|
||||
/**
|
||||
* The name of the host for this address.
|
||||
*/
|
||||
String hostName;
|
||||
|
||||
/**
|
||||
* Needed for serialization.
|
||||
*/
|
||||
private int family;
|
||||
|
||||
/**
|
||||
* Constructor. Prior to the introduction of IPv6 support in 1.4,
|
||||
* methods such as InetAddress.getByName() would return InetAddress
|
||||
* objects. From 1.4 such methods returned either Inet4Address or
|
||||
* Inet6Address objects, but for compatibility Inet4Address objects
|
||||
* are serialized as InetAddresses. As such, there are only two
|
||||
* places where it is appropriate to invoke this constructor: within
|
||||
* subclasses constructors and within Inet4Address.writeReplace().
|
||||
*
|
||||
* @param ipaddr The IP number of this address as an array of bytes
|
||||
* @param hostname The hostname of this IP address.
|
||||
* @param family The address family of this IP address.
|
||||
*/
|
||||
InetAddress(byte[] ipaddr, String hostname, int family)
|
||||
{
|
||||
addr = (null == ipaddr) ? null : (byte[]) ipaddr.clone();
|
||||
hostName = hostname;
|
||||
this.family = family;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns true if this address is a multicast address, false otherwise.
|
||||
* An address is multicast if the high four bits are "1110". These are
|
||||
* also known as "Class D" addresses.
|
||||
*
|
||||
* <p>This method cannot be abstract for backward compatibility reasons. By
|
||||
* default it always throws {@link UnsupportedOperationException} unless
|
||||
* overridden.</p>
|
||||
*
|
||||
* @return true if mulitcast, false if not
|
||||
*
|
||||
* @since 1.1
|
||||
*/
|
||||
public boolean isMulticastAddress()
|
||||
{
|
||||
// This method is masked on Posix systems, where all InetAddress
|
||||
// objects are created using InetAddress.getByAddress() which
|
||||
// returns either Inet4Address or Inet6Address objects. Certain
|
||||
// native methods on Win32 use "new InetAddress" in which case
|
||||
// this method will be visible.
|
||||
try
|
||||
{
|
||||
return getByAddress(hostName, addr).isMulticastAddress();
|
||||
}
|
||||
catch (UnknownHostException e)
|
||||
{
|
||||
throw new RuntimeException("should never happen", e);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Utility routine to check if the InetAddress in a wildcard address
|
||||
*
|
||||
* <p>This method cannot be abstract for backward compatibility reasons. By
|
||||
* default it always throws {@link UnsupportedOperationException} unless
|
||||
* overridden.</p>
|
||||
*
|
||||
* @since 1.4
|
||||
*/
|
||||
public boolean isAnyLocalAddress()
|
||||
{
|
||||
// This is inefficient, but certain methods on Win32 create
|
||||
// InetAddress objects using "new InetAddress" rather than
|
||||
// "InetAddress.getByAddress" so we provide a method body.
|
||||
// This code is never executed on Posix systems.
|
||||
try
|
||||
{
|
||||
return getByAddress(hostName, addr).isAnyLocalAddress();
|
||||
}
|
||||
catch (UnknownHostException e)
|
||||
{
|
||||
throw new RuntimeException("should never happen", e);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Utility routine to check if the InetAddress is a loopback address
|
||||
*
|
||||
* <p>This method cannot be abstract for backward compatibility reasons. By
|
||||
* default it always throws {@link UnsupportedOperationException} unless
|
||||
* overridden.</p>
|
||||
*
|
||||
* @since 1.4
|
||||
*/
|
||||
public boolean isLoopbackAddress()
|
||||
{
|
||||
// This method is masked on Posix systems, where all InetAddress
|
||||
// objects are created using InetAddress.getByAddress() which
|
||||
// returns either Inet4Address or Inet6Address objects. Certain
|
||||
// native methods on Win32 use "new InetAddress" in which case
|
||||
// this method will be visible.
|
||||
try
|
||||
{
|
||||
return getByAddress(hostName, addr).isLoopbackAddress();
|
||||
}
|
||||
catch (UnknownHostException e)
|
||||
{
|
||||
throw new RuntimeException("should never happen", e);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Utility routine to check if InetAddress is a link local address
|
||||
*
|
||||
* <p>This method cannot be abstract for backward compatibility reasons. By
|
||||
* default it always throws {@link UnsupportedOperationException} unless
|
||||
* overridden.</p>
|
||||
*
|
||||
* @since 1.4
|
||||
*/
|
||||
public boolean isLinkLocalAddress()
|
||||
{
|
||||
// This method is masked on Posix systems, where all InetAddress
|
||||
// objects are created using InetAddress.getByAddress() which
|
||||
// returns either Inet4Address or Inet6Address objects. Certain
|
||||
// native methods on Win32 use "new InetAddress" in which case
|
||||
// this method will be visible.
|
||||
try
|
||||
{
|
||||
return getByAddress(hostName, addr).isLinkLocalAddress();
|
||||
}
|
||||
catch (UnknownHostException e)
|
||||
{
|
||||
throw new RuntimeException("should never happen", e);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Utility routine to check if InetAddress is a site local address
|
||||
*
|
||||
* <p>This method cannot be abstract for backward compatibility reasons. By
|
||||
* default it always throws {@link UnsupportedOperationException} unless
|
||||
* overridden.</p>
|
||||
*
|
||||
* @since 1.4
|
||||
*/
|
||||
public boolean isSiteLocalAddress()
|
||||
{
|
||||
// This method is masked on Posix systems, where all InetAddress
|
||||
// objects are created using InetAddress.getByAddress() which
|
||||
// returns either Inet4Address or Inet6Address objects. Certain
|
||||
// native methods on Win32 use "new InetAddress" in which case
|
||||
// this method will be visible.
|
||||
try
|
||||
{
|
||||
return getByAddress(hostName, addr).isSiteLocalAddress();
|
||||
}
|
||||
catch (UnknownHostException e)
|
||||
{
|
||||
throw new RuntimeException("should never happen", e);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Utility routine to check if InetAddress is a global multicast address
|
||||
*
|
||||
* <p>This method cannot be abstract for backward compatibility reasons. By
|
||||
* default it always throws {@link UnsupportedOperationException} unless
|
||||
* overridden.</p>
|
||||
*
|
||||
* @since 1.4
|
||||
*/
|
||||
public boolean isMCGlobal()
|
||||
{
|
||||
// This method is masked on Posix systems, where all InetAddress
|
||||
// objects are created using InetAddress.getByAddress() which
|
||||
// returns either Inet4Address or Inet6Address objects. Certain
|
||||
// native methods on Win32 use "new InetAddress" in which case
|
||||
// this method will be visible.
|
||||
try
|
||||
{
|
||||
return getByAddress(hostName, addr).isMCGlobal();
|
||||
}
|
||||
catch (UnknownHostException e)
|
||||
{
|
||||
throw new RuntimeException("should never happen", e);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Utility routine to check if InetAddress is a node local multicast address.
|
||||
*
|
||||
* <p>This method cannot be abstract for backward compatibility reasons. By
|
||||
* default it always throws {@link UnsupportedOperationException} unless
|
||||
* overridden.</p>
|
||||
*
|
||||
* @since 1.4
|
||||
*/
|
||||
public boolean isMCNodeLocal()
|
||||
{
|
||||
// This method is masked on Posix systems, where all InetAddress
|
||||
// objects are created using InetAddress.getByAddress() which
|
||||
// returns either Inet4Address or Inet6Address objects. Certain
|
||||
// native methods on Win32 use "new InetAddress" in which case
|
||||
// this method will be visible.
|
||||
try
|
||||
{
|
||||
return getByAddress(hostName, addr).isMCNodeLocal();
|
||||
}
|
||||
catch (UnknownHostException e)
|
||||
{
|
||||
throw new RuntimeException("should never happen", e);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Utility routine to check if InetAddress is a link local multicast address.
|
||||
*
|
||||
* <p>This method cannot be abstract for backward compatibility reasons. By
|
||||
* default it always throws {@link UnsupportedOperationException} unless
|
||||
* overridden.</p>
|
||||
*
|
||||
* @since 1.4
|
||||
*/
|
||||
public boolean isMCLinkLocal()
|
||||
{
|
||||
// This method is masked on Posix systems, where all InetAddress
|
||||
// objects are created using InetAddress.getByAddress() which
|
||||
// returns either Inet4Address or Inet6Address objects. Certain
|
||||
// native methods on Win32 use "new InetAddress" in which case
|
||||
// this method will be visible.
|
||||
try
|
||||
{
|
||||
return getByAddress(hostName, addr).isMCLinkLocal();
|
||||
}
|
||||
catch (UnknownHostException e)
|
||||
{
|
||||
throw new RuntimeException("should never happen", e);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Utility routine to check if InetAddress is a site local multicast address.
|
||||
*
|
||||
* <p>This method cannot be abstract for backward compatibility reasons. By
|
||||
* default it always throws {@link UnsupportedOperationException} unless
|
||||
* overridden.</p>
|
||||
*
|
||||
* @since 1.4
|
||||
*/
|
||||
public boolean isMCSiteLocal()
|
||||
{
|
||||
// This method is masked on Posix systems, where all InetAddress
|
||||
// objects are created using InetAddress.getByAddress() which
|
||||
// returns either Inet4Address or Inet6Address objects. Certain
|
||||
// native methods on Win32 use "new InetAddress" in which case
|
||||
// this method will be visible.
|
||||
try
|
||||
{
|
||||
return getByAddress(hostName, addr).isMCSiteLocal();
|
||||
}
|
||||
catch (UnknownHostException e)
|
||||
{
|
||||
throw new RuntimeException("should never happen", e);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Utility routine to check if InetAddress is a organization local
|
||||
* multicast address.
|
||||
*
|
||||
* <p>This method cannot be abstract for backward compatibility reasons. By
|
||||
* default it always throws {@link UnsupportedOperationException} unless
|
||||
* overridden.</p>
|
||||
*
|
||||
* @since 1.4
|
||||
*/
|
||||
public boolean isMCOrgLocal()
|
||||
{
|
||||
// This method is masked on Posix systems, where all InetAddress
|
||||
// objects are created using InetAddress.getByAddress() which
|
||||
// returns either Inet4Address or Inet6Address objects. Certain
|
||||
// native methods on Win32 use "new InetAddress" in which case
|
||||
// this method will be visible.
|
||||
try
|
||||
{
|
||||
return getByAddress(hostName, addr).isMCOrgLocal();
|
||||
}
|
||||
catch (UnknownHostException e)
|
||||
{
|
||||
throw new RuntimeException("should never happen", e);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the hostname for this address. This will return the IP address
|
||||
* as a String if there is no hostname available for this address
|
||||
*
|
||||
* @return The hostname for this address
|
||||
*/
|
||||
public String getHostName()
|
||||
{
|
||||
if (hostName == null)
|
||||
hostName = getCanonicalHostName();
|
||||
|
||||
return hostName;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the canonical hostname represented by this InetAddress
|
||||
*/
|
||||
String internalGetCanonicalHostName()
|
||||
{
|
||||
try
|
||||
{
|
||||
return ResolverCache.getHostByAddr(addr);
|
||||
}
|
||||
catch (UnknownHostException e)
|
||||
{
|
||||
return getHostAddress();
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the canonical hostname represented by this InetAddress
|
||||
*
|
||||
* @since 1.4
|
||||
*/
|
||||
public String getCanonicalHostName()
|
||||
{
|
||||
String hostname = internalGetCanonicalHostName();
|
||||
|
||||
SecurityManager sm = System.getSecurityManager();
|
||||
if (sm != null)
|
||||
{
|
||||
try
|
||||
{
|
||||
sm.checkConnect(hostname, -1);
|
||||
}
|
||||
catch (SecurityException e)
|
||||
{
|
||||
return getHostAddress();
|
||||
}
|
||||
}
|
||||
|
||||
return hostname;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the IP address of this object as a byte array.
|
||||
*
|
||||
* @return IP address
|
||||
*/
|
||||
public byte[] getAddress()
|
||||
{
|
||||
// An experiment shows that JDK1.2 returns a different byte array each
|
||||
// time. This makes sense, in terms of security.
|
||||
return (byte[]) addr.clone();
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the IP address of this object as a String.
|
||||
*
|
||||
* <p>This method cannot be abstract for backward compatibility reasons. By
|
||||
* default it always throws {@link UnsupportedOperationException} unless
|
||||
* overridden.</p>
|
||||
*
|
||||
* @return The IP address of this object in String form
|
||||
*
|
||||
* @since 1.0.2
|
||||
*/
|
||||
public String getHostAddress()
|
||||
{
|
||||
// This method is masked on Posix systems, where all InetAddress
|
||||
// objects are created using InetAddress.getByAddress() which
|
||||
// returns either Inet4Address or Inet6Address objects. Certain
|
||||
// native methods on Win32 use "new InetAddress" in which case
|
||||
// this method will be visible.
|
||||
try
|
||||
{
|
||||
return getByAddress(hostName, addr).getHostAddress();
|
||||
}
|
||||
catch (UnknownHostException e)
|
||||
{
|
||||
throw new RuntimeException("should never happen", e);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns a hash value for this address. Useful for creating hash
|
||||
* tables. Overrides Object.hashCode()
|
||||
*
|
||||
* @return A hash value for this address.
|
||||
*/
|
||||
public int hashCode()
|
||||
{
|
||||
// There hashing algorithm is not specified, but a simple experiment
|
||||
// shows that it is equal to the address, as a 32-bit big-endian integer.
|
||||
int hash = 0;
|
||||
int len = addr.length;
|
||||
int i = len > 4 ? len - 4 : 0;
|
||||
|
||||
for (; i < len; i++)
|
||||
hash = (hash << 8) | (addr[i] & 0xff);
|
||||
|
||||
return hash;
|
||||
}
|
||||
|
||||
/**
|
||||
* Tests this address for equality against another InetAddress. The two
|
||||
* addresses are considered equal if they contain the exact same octets.
|
||||
* This implementation overrides Object.equals()
|
||||
*
|
||||
* @param obj The address to test for equality
|
||||
*
|
||||
* @return true if the passed in object's address is equal to this one's,
|
||||
* false otherwise
|
||||
*/
|
||||
public boolean equals(Object obj)
|
||||
{
|
||||
if (! (obj instanceof InetAddress))
|
||||
return false;
|
||||
|
||||
// "The Java Class Libraries" 2nd edition says "If a machine has
|
||||
// multiple names instances of InetAddress for different name of
|
||||
// that same machine are not equal. This is because they have
|
||||
// different host names." This violates the description in the
|
||||
// JDK 1.2 API documentation. A little experimentation
|
||||
// shows that the latter is correct.
|
||||
byte[] addr2 = ((InetAddress) obj).addr;
|
||||
|
||||
if (addr.length != addr2.length)
|
||||
return false;
|
||||
|
||||
for (int i = 0; i < addr.length; i++)
|
||||
if (addr[i] != addr2[i])
|
||||
return false;
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* Converts this address to a String. This string contains the IP in
|
||||
* dotted decimal form. For example: "127.0.0.1" This method is equivalent
|
||||
* to getHostAddress() and overrides Object.toString()
|
||||
*
|
||||
* @return This address in String form
|
||||
*/
|
||||
public String toString()
|
||||
{
|
||||
String addr = getHostAddress();
|
||||
String host = (hostName != null) ? hostName : "";
|
||||
return host + "/" + addr;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns an InetAddress object given the raw IP address.
|
||||
*
|
||||
* The argument is in network byte order: the highest order byte of the
|
||||
* address is in getAddress()[0].
|
||||
*
|
||||
* @param addr The IP address to create the InetAddress object from
|
||||
*
|
||||
* @exception UnknownHostException If IP address has illegal length
|
||||
*
|
||||
* @since 1.4
|
||||
*/
|
||||
public static InetAddress getByAddress(byte[] addr)
|
||||
throws UnknownHostException
|
||||
{
|
||||
return getByAddress(null, addr);
|
||||
}
|
||||
|
||||
/**
|
||||
* Creates an InetAddress based on the provided host name and IP address.
|
||||
* No name service is checked for the validity of the address.
|
||||
*
|
||||
* @param host The hostname of the InetAddress object to create
|
||||
* @param addr The IP address to create the InetAddress object from
|
||||
*
|
||||
* @exception UnknownHostException If IP address is of illegal length
|
||||
*
|
||||
* @since 1.4
|
||||
*/
|
||||
public static InetAddress getByAddress(String host, byte[] addr)
|
||||
throws UnknownHostException
|
||||
{
|
||||
if (addr.length == 4)
|
||||
return new Inet4Address(addr, host);
|
||||
|
||||
if (addr.length == 16)
|
||||
{
|
||||
for (int i = 0; i < 12; i++)
|
||||
{
|
||||
if (addr[i] != (i < 10 ? 0 : (byte) 0xFF))
|
||||
return new Inet6Address(addr, host);
|
||||
}
|
||||
|
||||
byte[] ip4addr = new byte[4];
|
||||
ip4addr[0] = addr[12];
|
||||
ip4addr[1] = addr[13];
|
||||
ip4addr[2] = addr[14];
|
||||
ip4addr[3] = addr[15];
|
||||
return new Inet4Address(ip4addr, host);
|
||||
}
|
||||
|
||||
throw new UnknownHostException("IP address has illegal length");
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns an InetAddress object representing the IP address of
|
||||
* the given literal IP address in dotted decimal format such as
|
||||
* "127.0.0.1". This is used by SocketPermission.setHostPort()
|
||||
* to parse literal IP addresses without performing a DNS lookup.
|
||||
*
|
||||
* @param literal The literal IP address to create the InetAddress
|
||||
* object from
|
||||
*
|
||||
* @return The address of the host as an InetAddress object, or
|
||||
* null if the IP address is invalid.
|
||||
*/
|
||||
static InetAddress getByLiteral(String literal)
|
||||
{
|
||||
byte[] address = VMInetAddress.aton(literal);
|
||||
if (address == null)
|
||||
return null;
|
||||
|
||||
try
|
||||
{
|
||||
return getByAddress(address);
|
||||
}
|
||||
catch (UnknownHostException e)
|
||||
{
|
||||
throw new RuntimeException("should never happen", e);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns an InetAddress object representing the IP address of the given
|
||||
* hostname. This name can be either a hostname such as "www.urbanophile.com"
|
||||
* or an IP address in dotted decimal format such as "127.0.0.1". If the
|
||||
* hostname is null or "", the hostname of the local machine is supplied by
|
||||
* default. This method is equivalent to returning the first element in
|
||||
* the InetAddress array returned from GetAllByName.
|
||||
*
|
||||
* @param hostname The name of the desired host, or null for the local
|
||||
* loopback address.
|
||||
*
|
||||
* @return The address of the host as an InetAddress object.
|
||||
*
|
||||
* @exception UnknownHostException If no IP address for the host could
|
||||
* be found
|
||||
* @exception SecurityException If a security manager exists and its
|
||||
* checkConnect method doesn't allow the operation
|
||||
*/
|
||||
public static InetAddress getByName(String hostname)
|
||||
throws UnknownHostException
|
||||
{
|
||||
InetAddress[] addresses = getAllByName(hostname);
|
||||
return addresses[0];
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns an array of InetAddress objects representing all the host/ip
|
||||
* addresses of a given host, given the host's name. This name can be
|
||||
* either a hostname such as "www.urbanophile.com" or an IP address in
|
||||
* dotted decimal format such as "127.0.0.1". If the value is null, the
|
||||
* hostname of the local machine is supplied by default.
|
||||
*
|
||||
* @param hostname The name of the desired host, or null for the
|
||||
* local loopback address.
|
||||
*
|
||||
* @return All addresses of the host as an array of InetAddress objects.
|
||||
*
|
||||
* @exception UnknownHostException If no IP address for the host could
|
||||
* be found
|
||||
* @exception SecurityException If a security manager exists and its
|
||||
* checkConnect method doesn't allow the operation
|
||||
*/
|
||||
public static InetAddress[] getAllByName(String hostname)
|
||||
throws UnknownHostException
|
||||
{
|
||||
// If null or the empty string is supplied, the loopback address
|
||||
// is returned.
|
||||
if (hostname == null || hostname.length() == 0)
|
||||
return new InetAddress[] {LOCALHOST};
|
||||
|
||||
// Check if hostname is an IP address
|
||||
InetAddress address = getByLiteral(hostname);
|
||||
if (address != null)
|
||||
return new InetAddress[] {address};
|
||||
|
||||
// Perform security check before resolving
|
||||
SecurityManager sm = System.getSecurityManager();
|
||||
if (sm != null)
|
||||
sm.checkConnect(hostname, -1);
|
||||
|
||||
// Resolve the hostname
|
||||
byte[][] iplist = ResolverCache.getHostByName(hostname);
|
||||
if (iplist.length == 0)
|
||||
throw new UnknownHostException(hostname);
|
||||
|
||||
InetAddress[] addresses = new InetAddress[iplist.length];
|
||||
for (int i = 0; i < iplist.length; i++)
|
||||
addresses[i] = getByAddress(hostname, iplist[i]);
|
||||
|
||||
return addresses;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns an InetAddress object representing the address of the current
|
||||
* host.
|
||||
*
|
||||
* @return The local host's address
|
||||
*
|
||||
* @exception UnknownHostException If no IP address for the host could
|
||||
* be found
|
||||
*/
|
||||
public static InetAddress getLocalHost() throws UnknownHostException
|
||||
{
|
||||
String hostname = VMInetAddress.getLocalHostname();
|
||||
try
|
||||
{
|
||||
return getByName(hostname);
|
||||
}
|
||||
catch (SecurityException e)
|
||||
{
|
||||
return LOCALHOST;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Inet4Address objects are serialized as InetAddress objects.
|
||||
* This deserializes them back into Inet4Address objects.
|
||||
*/
|
||||
private Object readResolve() throws ObjectStreamException
|
||||
{
|
||||
return new Inet4Address(addr, hostName);
|
||||
}
|
||||
|
||||
private void readObject(ObjectInputStream ois)
|
||||
throws IOException, ClassNotFoundException
|
||||
{
|
||||
ois.defaultReadObject();
|
||||
addr = new byte[4];
|
||||
addr[3] = (byte) address;
|
||||
|
||||
for (int i = 2; i >= 0; --i)
|
||||
addr[i] = (byte) (address >>= 8);
|
||||
}
|
||||
|
||||
private void writeObject(ObjectOutputStream oos) throws IOException
|
||||
{
|
||||
// Build a 32 bit address from the last 4 bytes of a 4 byte IPv4 address
|
||||
// or a 16 byte IPv6 address.
|
||||
int len = addr.length;
|
||||
int i = len - 4;
|
||||
|
||||
for (; i < len; i++)
|
||||
address = address << 8 | (addr[i] & 0xff);
|
||||
|
||||
oos.defaultWriteObject();
|
||||
}
|
||||
|
||||
// The native methods remain here for now;
|
||||
// methods in VMInetAddress map onto them.
|
||||
static native byte[] aton(String hostname);
|
||||
static native InetAddress[] lookup (String hostname,
|
||||
InetAddress ipaddr, boolean all);
|
||||
static native int getFamily (byte[] ipaddr);
|
||||
static native String getLocalHostname();
|
||||
|
||||
// Some soon-to-be-removed native code synchronizes on this.
|
||||
static InetAddress loopbackAddress;
|
||||
|
||||
// Some soon-to-be-removed code uses this old and broken method.
|
||||
InetAddress(byte[] ipaddr, String hostname)
|
||||
{
|
||||
addr = (null == ipaddr) ? null : (byte[]) ipaddr.clone();
|
||||
hostName = hostname;
|
||||
|
||||
if (ipaddr != null)
|
||||
family = getFamily(ipaddr);
|
||||
}
|
||||
|
||||
// Some soon-to-be-removed native code uses these old methods.
|
||||
private static InetAddress[] allocArray (int count)
|
||||
{
|
||||
return new InetAddress [count];
|
||||
}
|
||||
private static SecurityException checkConnect (String hostname)
|
||||
{
|
||||
return null;
|
||||
}
|
||||
}
|
@ -58,18 +58,12 @@ class VMInetAddress implements Serializable
|
||||
*
|
||||
* @return The local hostname.
|
||||
*/
|
||||
public static String getLocalHostname()
|
||||
{
|
||||
return InetAddress.getLocalHostname();
|
||||
}
|
||||
public static native String getLocalHostname();
|
||||
|
||||
/**
|
||||
* Returns the value of the special address INADDR_ANY
|
||||
*/
|
||||
public static byte[] lookupInaddrAny() throws UnknownHostException
|
||||
{
|
||||
return new byte[] {0, 0, 0, 0};
|
||||
}
|
||||
public static native byte[] lookupInaddrAny() throws UnknownHostException;
|
||||
|
||||
/**
|
||||
* This method returns the hostname for a given IP address. It will
|
||||
@ -81,26 +75,15 @@ class VMInetAddress implements Serializable
|
||||
*
|
||||
* @exception UnknownHostException If the reverse lookup fails
|
||||
*/
|
||||
public static String getHostByAddr(byte[] ip) throws UnknownHostException
|
||||
{
|
||||
InetAddress addr = InetAddress.getByAddress(ip);
|
||||
InetAddress.lookup(null, addr, false);
|
||||
return addr.getHostName();
|
||||
}
|
||||
public static native String getHostByAddr(byte[] ip)
|
||||
throws UnknownHostException;
|
||||
|
||||
/**
|
||||
* Returns a list of all IP addresses for a given hostname. Will throw
|
||||
* an UnknownHostException if the hostname cannot be resolved.
|
||||
*/
|
||||
public static byte[][] getHostByName(String hostname)
|
||||
throws UnknownHostException
|
||||
{
|
||||
InetAddress[] iaddrs = InetAddress.lookup(hostname, null, true);
|
||||
byte[][] addrs = new byte[iaddrs.length][];
|
||||
for (int i = 0; i < iaddrs.length; i++)
|
||||
addrs[i] = iaddrs[i].getAddress();
|
||||
return addrs;
|
||||
}
|
||||
public static native byte[][] getHostByName(String hostname)
|
||||
throws UnknownHostException;
|
||||
|
||||
/**
|
||||
* Return the IP address represented by a literal address.
|
||||
@ -110,8 +93,5 @@ class VMInetAddress implements Serializable
|
||||
*
|
||||
* @return The IP address as a byte array
|
||||
*/
|
||||
public static byte[] aton(String address)
|
||||
{
|
||||
return InetAddress.aton(address);
|
||||
}
|
||||
public static native byte[] aton(String address);
|
||||
}
|
||||
|
@ -1,36 +0,0 @@
|
||||
/* Copyright (C) 2003 Free Software Foundation
|
||||
|
||||
This file is part of libgcj.
|
||||
|
||||
This software is copyrighted work licensed under the terms of the
|
||||
Libgcj License. Please consult the file "LIBGCJ_LICENSE" for
|
||||
details. */
|
||||
|
||||
#include <config.h>
|
||||
#include <stddef.h>
|
||||
|
||||
#include <java/net/InetAddress.h>
|
||||
|
||||
jbyteArray
|
||||
java::net::InetAddress::aton (jstring)
|
||||
{
|
||||
return NULL;
|
||||
}
|
||||
|
||||
jint
|
||||
java::net::InetAddress::getFamily (jbyteArray bytes)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
JArray<java::net::InetAddress*> *
|
||||
java::net::InetAddress::lookup (jstring, java::net::InetAddress *, jboolean)
|
||||
{
|
||||
return NULL;
|
||||
}
|
||||
|
||||
jstring
|
||||
java::net::InetAddress::getLocalHostname ()
|
||||
{
|
||||
return NULL;
|
||||
}
|
@ -1,304 +0,0 @@
|
||||
/* Copyright (C) 2003 Free Software Foundation
|
||||
|
||||
This file is part of libgcj.
|
||||
|
||||
This software is copyrighted work licensed under the terms of the
|
||||
Libgcj License. Please consult the file "LIBGCJ_LICENSE" for
|
||||
details. */
|
||||
|
||||
#include <config.h>
|
||||
|
||||
#ifdef HAVE_UNISTD_H
|
||||
#include <unistd.h>
|
||||
#endif
|
||||
#include <string.h>
|
||||
#include <errno.h>
|
||||
|
||||
#include <sys/param.h>
|
||||
#include <sys/types.h>
|
||||
#ifdef HAVE_SYS_SOCKET_H
|
||||
#include <sys/socket.h>
|
||||
#endif
|
||||
#ifdef HAVE_NETINET_IN_H
|
||||
#include <netinet/in.h>
|
||||
#endif
|
||||
#ifdef HAVE_ARPA_INET_H
|
||||
#include <arpa/inet.h>
|
||||
#endif
|
||||
#ifdef HAVE_NETDB_H
|
||||
#include <netdb.h>
|
||||
#endif
|
||||
|
||||
#include <gcj/cni.h>
|
||||
#include <jvm.h>
|
||||
#include <java/net/InetAddress.h>
|
||||
#include <java/net/UnknownHostException.h>
|
||||
#include <java/lang/SecurityException.h>
|
||||
|
||||
#if defined(HAVE_UNAME) && ! defined(HAVE_GETHOSTNAME)
|
||||
#include <sys/utsname.h>
|
||||
#endif
|
||||
|
||||
#ifndef HAVE_GETHOSTNAME_DECL
|
||||
extern "C" int gethostname (char *name, int namelen);
|
||||
#endif
|
||||
|
||||
jbyteArray
|
||||
java::net::InetAddress::aton (jstring host)
|
||||
{
|
||||
char *hostname;
|
||||
char buf[100];
|
||||
int len = JvGetStringUTFLength(host);
|
||||
if (len < 100)
|
||||
hostname = buf;
|
||||
else
|
||||
hostname = (char*) _Jv_AllocBytes (len+1);
|
||||
JvGetStringUTFRegion (host, 0, host->length(), hostname);
|
||||
buf[len] = '\0';
|
||||
char* bytes = NULL;
|
||||
int blen = 0;
|
||||
#ifdef HAVE_INET_ATON
|
||||
struct in_addr laddr;
|
||||
if (inet_aton (hostname, &laddr))
|
||||
{
|
||||
bytes = (char*) &laddr;
|
||||
blen = 4;
|
||||
}
|
||||
#elif defined(HAVE_INET_ADDR)
|
||||
#if ! HAVE_IN_ADDR_T
|
||||
typedef jint in_addr_t;
|
||||
#endif
|
||||
in_addr_t laddr = inet_addr (hostname);
|
||||
if (laddr != (in_addr_t)(-1))
|
||||
{
|
||||
bytes = (char*) &laddr;
|
||||
blen = 4;
|
||||
}
|
||||
#endif
|
||||
#if defined (HAVE_INET_PTON) && defined (HAVE_INET6)
|
||||
char inet6_addr[16];
|
||||
if (len != 0 && inet_pton (AF_INET6, hostname, inet6_addr) > 0)
|
||||
{
|
||||
bytes = inet6_addr;
|
||||
blen = 16;
|
||||
}
|
||||
#endif
|
||||
if (blen == 0)
|
||||
return NULL;
|
||||
jbyteArray result = JvNewByteArray (blen);
|
||||
memcpy (elements (result), bytes, blen);
|
||||
return result;
|
||||
}
|
||||
|
||||
jint
|
||||
java::net::InetAddress::getFamily (jbyteArray bytes)
|
||||
{
|
||||
int len = bytes->length;
|
||||
if (len == 4)
|
||||
return AF_INET;
|
||||
#ifdef HAVE_INET6
|
||||
else if (len == 16)
|
||||
return AF_INET6;
|
||||
#endif /* HAVE_INET6 */
|
||||
else
|
||||
JvFail ("unrecognized size");
|
||||
}
|
||||
|
||||
|
||||
JArray<java::net::InetAddress*> *
|
||||
java::net::InetAddress::lookup (jstring host, java::net::InetAddress* iaddr,
|
||||
jboolean all)
|
||||
{
|
||||
struct hostent *hptr = NULL;
|
||||
#if defined (HAVE_GETHOSTBYNAME_R) || defined (HAVE_GETHOSTBYADDR_R)
|
||||
struct hostent hent_r;
|
||||
#if HAVE_STRUCT_HOSTENT_DATA
|
||||
struct hostent_data fixed_buffer, *buffer_r = &fixed_buffer;
|
||||
#else
|
||||
#if defined (__GLIBC__)
|
||||
// FIXME: in glibc, gethostbyname_r returns NETDB_INTERNAL to herr and
|
||||
// ERANGE to errno if the buffer size is too small, rather than what is
|
||||
// expected here. We work around this by setting a bigger buffer size and
|
||||
// hoping that it is big enough.
|
||||
char fixed_buffer[1024];
|
||||
#else
|
||||
char fixed_buffer[200];
|
||||
#endif
|
||||
char *buffer_r = fixed_buffer;
|
||||
int size_r = sizeof (fixed_buffer);
|
||||
#endif
|
||||
#endif
|
||||
|
||||
if (host != NULL)
|
||||
{
|
||||
char *hostname;
|
||||
char buf[100];
|
||||
int len = JvGetStringUTFLength(host);
|
||||
if (len < 100)
|
||||
hostname = buf;
|
||||
else
|
||||
hostname = (char*) _Jv_AllocBytes (len+1);
|
||||
JvGetStringUTFRegion (host, 0, host->length(), hostname);
|
||||
buf[len] = '\0';
|
||||
#ifdef HAVE_GETHOSTBYNAME_R
|
||||
while (true)
|
||||
{
|
||||
int ok;
|
||||
#if HAVE_STRUCT_HOSTENT_DATA
|
||||
ok = ! gethostbyname_r (hostname, &hent_r, buffer_r);
|
||||
#else
|
||||
int herr = 0;
|
||||
#ifdef GETHOSTBYNAME_R_RETURNS_INT
|
||||
ok = ! gethostbyname_r (hostname, &hent_r, buffer_r, size_r,
|
||||
&hptr, &herr);
|
||||
#else
|
||||
hptr = gethostbyname_r (hostname, &hent_r, buffer_r, size_r, &herr);
|
||||
ok = hptr != NULL;
|
||||
#endif /* GETHOSTNAME_R_RETURNS_INT */
|
||||
if (! ok && herr == ERANGE)
|
||||
{
|
||||
size_r *= 2;
|
||||
buffer_r = (char *) _Jv_AllocBytes (size_r);
|
||||
}
|
||||
else
|
||||
#endif /* HAVE_STRUCT_HOSTENT_DATA */
|
||||
break;
|
||||
}
|
||||
#else
|
||||
// FIXME: this is insufficient if some other piece of code calls
|
||||
// this gethostbyname.
|
||||
JvSynchronize sync (java::net::InetAddress::loopbackAddress);
|
||||
hptr = gethostbyname (hostname);
|
||||
#endif /* HAVE_GETHOSTBYNAME_R */
|
||||
}
|
||||
else
|
||||
{
|
||||
jbyteArray bytes = iaddr->addr;
|
||||
char *chars = (char*) elements (bytes);
|
||||
int len = bytes->length;
|
||||
int type;
|
||||
char *val;
|
||||
if (len == 4)
|
||||
{
|
||||
val = chars;
|
||||
type = iaddr->family = AF_INET;
|
||||
}
|
||||
#ifdef HAVE_INET6
|
||||
else if (len == 16)
|
||||
{
|
||||
val = (char *) &chars;
|
||||
type = iaddr->family = AF_INET6;
|
||||
}
|
||||
#endif /* HAVE_INET6 */
|
||||
else
|
||||
JvFail ("unrecognized size");
|
||||
|
||||
#ifdef HAVE_GETHOSTBYADDR_R
|
||||
while (true)
|
||||
{
|
||||
int ok;
|
||||
#if HAVE_STRUCT_HOSTENT_DATA
|
||||
ok = ! gethostbyaddr_r (val, len, type, &hent_r, buffer_r);
|
||||
#else
|
||||
int herr = 0;
|
||||
#ifdef GETHOSTBYADDR_R_RETURNS_INT
|
||||
ok = ! gethostbyaddr_r (val, len, type, &hent_r,
|
||||
buffer_r, size_r, &hptr, &herr);
|
||||
#else
|
||||
hptr = gethostbyaddr_r (val, len, type, &hent_r,
|
||||
buffer_r, size_r, &herr);
|
||||
ok = hptr != NULL;
|
||||
#endif /* GETHOSTBYADDR_R_RETURNS_INT */
|
||||
if (! ok && herr == ERANGE)
|
||||
{
|
||||
size_r *= 2;
|
||||
buffer_r = (char *) _Jv_AllocBytes (size_r);
|
||||
}
|
||||
else
|
||||
#endif /* HAVE_STRUCT_HOSTENT_DATA */
|
||||
break;
|
||||
}
|
||||
#else /* HAVE_GETHOSTBYADDR_R */
|
||||
// FIXME: this is insufficient if some other piece of code calls
|
||||
// this gethostbyaddr.
|
||||
JvSynchronize sync (java::net::InetAddress::loopbackAddress);
|
||||
hptr = gethostbyaddr (val, len, type);
|
||||
#endif /* HAVE_GETHOSTBYADDR_R */
|
||||
}
|
||||
if (hptr != NULL)
|
||||
{
|
||||
if (!all)
|
||||
host = JvNewStringUTF (hptr->h_name);
|
||||
}
|
||||
if (hptr == NULL)
|
||||
{
|
||||
if (iaddr != NULL && iaddr->addr != NULL)
|
||||
{
|
||||
iaddr->hostName = iaddr->getHostAddress();
|
||||
return NULL;
|
||||
}
|
||||
else
|
||||
throw new java::net::UnknownHostException(host);
|
||||
}
|
||||
int count;
|
||||
if (all)
|
||||
{
|
||||
char** ptr = hptr->h_addr_list;
|
||||
count = 0;
|
||||
while (*ptr++) count++;
|
||||
}
|
||||
else
|
||||
count = 1;
|
||||
JArray<java::net::InetAddress*> *result;
|
||||
java::net::InetAddress** iaddrs;
|
||||
if (all)
|
||||
{
|
||||
result = java::net::InetAddress::allocArray (count);
|
||||
iaddrs = elements (result);
|
||||
}
|
||||
else
|
||||
{
|
||||
result = NULL;
|
||||
iaddrs = &iaddr;
|
||||
}
|
||||
|
||||
for (int i = 0; i < count; i++)
|
||||
{
|
||||
if (iaddrs[i] == NULL)
|
||||
iaddrs[i] = new java::net::InetAddress (NULL, NULL);
|
||||
if (iaddrs[i]->hostName == NULL)
|
||||
iaddrs[i]->hostName = host;
|
||||
if (iaddrs[i]->addr == NULL)
|
||||
{
|
||||
char *bytes = hptr->h_addr_list[i];
|
||||
iaddrs[i]->addr = JvNewByteArray (hptr->h_length);
|
||||
iaddrs[i]->family = getFamily (iaddrs[i]->addr);
|
||||
memcpy (elements (iaddrs[i]->addr), bytes, hptr->h_length);
|
||||
}
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
jstring
|
||||
java::net::InetAddress::getLocalHostname ()
|
||||
{
|
||||
char *chars;
|
||||
#ifdef HAVE_GETHOSTNAME
|
||||
char buffer[MAXHOSTNAMELEN];
|
||||
if (gethostname (buffer, MAXHOSTNAMELEN))
|
||||
return NULL;
|
||||
chars = buffer;
|
||||
#elif HAVE_UNAME
|
||||
struct utsname stuff;
|
||||
if (uname (&stuff) != 0)
|
||||
return NULL;
|
||||
chars = stuff.nodename;
|
||||
#else
|
||||
return NULL;
|
||||
#endif
|
||||
// It is admittedly non-optimal to convert the hostname to Unicode
|
||||
// only to convert it back in getByName, but simplicity wins. Note
|
||||
// that unless there is a SecurityManager, we only get called once
|
||||
// anyway, thanks to the InetAddress.localhost cache.
|
||||
return JvNewStringUTF (chars);
|
||||
}
|
@ -1,168 +0,0 @@
|
||||
/* Copyright (C) 2003 Free Software Foundation
|
||||
|
||||
This file is part of libgcj.
|
||||
|
||||
This software is copyrighted work licensed under the terms of the
|
||||
Libgcj License. Please consult the file "LIBGCJ_LICENSE" for
|
||||
details. */
|
||||
|
||||
#include <config.h>
|
||||
#include <platform.h>
|
||||
|
||||
#undef STRICT
|
||||
|
||||
#include <java/net/InetAddress.h>
|
||||
#include <java/net/UnknownHostException.h>
|
||||
#include <java/lang/SecurityException.h>
|
||||
|
||||
jbyteArray
|
||||
java::net::InetAddress::aton (jstring host)
|
||||
{
|
||||
JV_TEMP_UTF_STRING (hostname, host);
|
||||
char* bytes = NULL;
|
||||
int blen = 0;
|
||||
unsigned long laddr = inet_addr (hostname);
|
||||
if (laddr != INADDR_NONE)
|
||||
{
|
||||
bytes = (char*) &laddr;
|
||||
blen = 4;
|
||||
}
|
||||
if (blen == 0)
|
||||
return NULL;
|
||||
jbyteArray result = JvNewByteArray (blen);
|
||||
memcpy (elements (result), bytes, blen);
|
||||
return result;
|
||||
}
|
||||
|
||||
jint
|
||||
java::net::InetAddress::getFamily (jbyteArray bytes)
|
||||
{
|
||||
int len = bytes->length;
|
||||
if (len == 4)
|
||||
return AF_INET;
|
||||
#ifdef HAVE_INET6
|
||||
else if (len == 16)
|
||||
return AF_INET6;
|
||||
#endif /* HAVE_INET6 */
|
||||
else
|
||||
JvFail ("unrecognized size");
|
||||
}
|
||||
|
||||
|
||||
JArray<java::net::InetAddress*> *
|
||||
java::net::InetAddress::lookup (jstring host, java::net::InetAddress* iaddr,
|
||||
jboolean all)
|
||||
{
|
||||
struct hostent *hptr = NULL;
|
||||
if (host != NULL)
|
||||
{
|
||||
JV_TEMP_UTF_STRING (hostname, host);
|
||||
|
||||
// FIXME: this is insufficient if some other piece of code calls
|
||||
// this gethostbyname.
|
||||
JvSynchronize sync (java::net::InetAddress::loopbackAddress);
|
||||
hptr = gethostbyname (hostname);
|
||||
}
|
||||
else
|
||||
{
|
||||
jbyteArray bytes = iaddr->addr;
|
||||
char *chars = (char*) elements (bytes);
|
||||
int len = bytes->length;
|
||||
int type;
|
||||
char *val;
|
||||
if (len == 4)
|
||||
{
|
||||
val = chars;
|
||||
type = iaddr->family = AF_INET;
|
||||
}
|
||||
#ifdef HAVE_INET6
|
||||
else if (len == 16)
|
||||
{
|
||||
val = (char *) &chars;
|
||||
type = iaddr->family = AF_INET6;
|
||||
}
|
||||
#endif /* HAVE_INET6 */
|
||||
else
|
||||
JvFail ("unrecognized size");
|
||||
|
||||
// FIXME: this is insufficient if some other piece of code calls
|
||||
// this gethostbyaddr.
|
||||
JvSynchronize sync (java::net::InetAddress::loopbackAddress);
|
||||
hptr = gethostbyaddr (val, len, type);
|
||||
}
|
||||
if (hptr != NULL)
|
||||
{
|
||||
if (!all)
|
||||
host = JvNewStringUTF (hptr->h_name);
|
||||
java::lang::SecurityException *ex = checkConnect (host);
|
||||
if (ex != NULL)
|
||||
{
|
||||
if (iaddr == NULL || iaddr->addr == NULL)
|
||||
throw ex;
|
||||
hptr = NULL;
|
||||
}
|
||||
}
|
||||
if (hptr == NULL)
|
||||
{
|
||||
if (iaddr != NULL && iaddr->addr != NULL)
|
||||
{
|
||||
iaddr->hostName = iaddr->getHostAddress();
|
||||
return NULL;
|
||||
}
|
||||
else
|
||||
throw new java::net::UnknownHostException(host);
|
||||
}
|
||||
|
||||
int count;
|
||||
if (all)
|
||||
{
|
||||
char** ptr = hptr->h_addr_list;
|
||||
count = 0;
|
||||
while (*ptr++) count++;
|
||||
}
|
||||
else
|
||||
count = 1;
|
||||
|
||||
JArray<java::net::InetAddress*> *result;
|
||||
java::net::InetAddress** iaddrs;
|
||||
if (all)
|
||||
{
|
||||
result = java::net::InetAddress::allocArray (count);
|
||||
iaddrs = elements (result);
|
||||
}
|
||||
else
|
||||
{
|
||||
result = NULL;
|
||||
iaddrs = &iaddr;
|
||||
}
|
||||
|
||||
for (int i = 0; i < count; i++)
|
||||
{
|
||||
if (iaddrs[i] == NULL)
|
||||
iaddrs[i] = new java::net::InetAddress (NULL, NULL);
|
||||
if (iaddrs[i]->hostName == NULL)
|
||||
iaddrs[i]->hostName = host;
|
||||
if (iaddrs[i]->addr == NULL)
|
||||
{
|
||||
char *bytes = hptr->h_addr_list[i];
|
||||
iaddrs[i]->addr = JvNewByteArray (hptr->h_length);
|
||||
iaddrs[i]->family = getFamily (iaddrs[i]->addr);
|
||||
memcpy (elements (iaddrs[i]->addr), bytes, hptr->h_length);
|
||||
}
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
jstring
|
||||
java::net::InetAddress::getLocalHostname ()
|
||||
{
|
||||
char buffer[400];
|
||||
if (gethostname (buffer, sizeof(buffer)))
|
||||
return NULL;
|
||||
// It is admittedly non-optimal to convert the hostname to Unicode
|
||||
// only to convert it back in getByName, but simplicity wins. Note
|
||||
// that unless there is a SecurityManager, we only get called once
|
||||
// anyway, thanks to the InetAddress.localhost cache.
|
||||
return JvNewStringUTF (buffer);
|
||||
}
|
40
libjava/java/net/natVMInetAddressNoNet.cc
Normal file
40
libjava/java/net/natVMInetAddressNoNet.cc
Normal file
@ -0,0 +1,40 @@
|
||||
/* Copyright (C) 2003, 2006 Free Software Foundation
|
||||
|
||||
This file is part of libgcj.
|
||||
|
||||
This software is copyrighted work licensed under the terms of the
|
||||
Libgcj License. Please consult the file "LIBGCJ_LICENSE" for
|
||||
details. */
|
||||
|
||||
#include <config.h>
|
||||
#include <stddef.h>
|
||||
|
||||
jstring
|
||||
java::net::VMInetAddress::getLocalHostname ()
|
||||
{
|
||||
return NULL;
|
||||
}
|
||||
|
||||
jbyteArray
|
||||
java::net::VMInetAddress::lookupInaddrAny ()
|
||||
{
|
||||
return NULL;
|
||||
}
|
||||
|
||||
jstring
|
||||
java::net::VMInetAddress::getHostByAddr (jbyteArray addr)
|
||||
{
|
||||
return NULL;
|
||||
}
|
||||
|
||||
JArray<jbyteArray> *
|
||||
java::net::VMInetAddress::getHostByName (jstring host)
|
||||
{
|
||||
return NULL;
|
||||
}
|
||||
|
||||
jbyteArray
|
||||
java::net::VMInetAddress::aton (jstring host)
|
||||
{
|
||||
return NULL;
|
||||
}
|
289
libjava/java/net/natVMInetAddressPosix.cc
Normal file
289
libjava/java/net/natVMInetAddressPosix.cc
Normal file
@ -0,0 +1,289 @@
|
||||
/* Copyright (C) 2003, 2006 Free Software Foundation
|
||||
|
||||
This file is part of libgcj.
|
||||
|
||||
This software is copyrighted work licensed under the terms of the
|
||||
Libgcj License. Please consult the file "LIBGCJ_LICENSE" for
|
||||
details. */
|
||||
|
||||
#include <config.h>
|
||||
|
||||
#ifdef HAVE_UNISTD_H
|
||||
#include <unistd.h>
|
||||
#endif
|
||||
#include <string.h>
|
||||
#include <errno.h>
|
||||
|
||||
#include <sys/param.h>
|
||||
#include <sys/types.h>
|
||||
#ifdef HAVE_SYS_SOCKET_H
|
||||
#include <sys/socket.h>
|
||||
#endif
|
||||
#ifdef HAVE_NETINET_IN_H
|
||||
#include <netinet/in.h>
|
||||
#endif
|
||||
#ifdef HAVE_ARPA_INET_H
|
||||
#include <arpa/inet.h>
|
||||
#endif
|
||||
#ifdef HAVE_NETDB_H
|
||||
#include <netdb.h>
|
||||
#endif
|
||||
|
||||
#include <gcj/cni.h>
|
||||
#include <jvm.h>
|
||||
#include <java/net/VMInetAddress.h>
|
||||
#include <java/net/UnknownHostException.h>
|
||||
|
||||
#if defined(HAVE_UNAME) && ! defined(HAVE_GETHOSTNAME)
|
||||
#include <sys/utsname.h>
|
||||
#endif
|
||||
|
||||
#ifndef HAVE_GETHOSTNAME_DECL
|
||||
extern "C" int gethostname (char *name, int namelen);
|
||||
#endif
|
||||
|
||||
jstring
|
||||
java::net::VMInetAddress::getLocalHostname ()
|
||||
{
|
||||
char *chars;
|
||||
#ifdef HAVE_GETHOSTNAME
|
||||
char buffer[MAXHOSTNAMELEN];
|
||||
if (gethostname (buffer, MAXHOSTNAMELEN))
|
||||
return NULL;
|
||||
chars = buffer;
|
||||
#elif HAVE_UNAME
|
||||
struct utsname stuff;
|
||||
if (uname (&stuff) != 0)
|
||||
return NULL;
|
||||
chars = stuff.nodename;
|
||||
#else
|
||||
return NULL;
|
||||
#endif
|
||||
// It is admittedly non-optimal to convert the hostname to Unicode
|
||||
// only to convert it back in getByName, but simplicity wins.
|
||||
return JvNewStringUTF (chars);
|
||||
}
|
||||
|
||||
jbyteArray
|
||||
java::net::VMInetAddress::lookupInaddrAny ()
|
||||
{
|
||||
#if ! HAVE_IN_ADDR_T
|
||||
typedef jint in_addr_t;
|
||||
#endif
|
||||
in_addr_t laddr = INADDR_ANY;
|
||||
char *bytes = (char *) &laddr;
|
||||
int blen = sizeof (laddr);
|
||||
jbyteArray result = JvNewByteArray (blen);
|
||||
memcpy (elements (result), bytes, blen);
|
||||
return result;
|
||||
}
|
||||
|
||||
jstring
|
||||
java::net::VMInetAddress::getHostByAddr (jbyteArray addr)
|
||||
{
|
||||
struct hostent *hptr = NULL;
|
||||
#ifdef HAVE_GETHOSTBYADDR_R
|
||||
struct hostent hent_r;
|
||||
#if HAVE_STRUCT_HOSTENT_DATA
|
||||
struct hostent_data fixed_buffer, *buffer_r = &fixed_buffer;
|
||||
#else
|
||||
#ifdef __GLIBC__
|
||||
// FIXME: in glibc, gethostbyname_r returns NETDB_INTERNAL to herr and
|
||||
// ERANGE to errno if the buffer size is too small, rather than what is
|
||||
// expected here. We work around this by setting a bigger buffer size and
|
||||
// hoping that it is big enough.
|
||||
char fixed_buffer[1024];
|
||||
#else
|
||||
char fixed_buffer[200];
|
||||
#endif /* __GLIBC__ */
|
||||
char *buffer_r = fixed_buffer;
|
||||
int size_r = sizeof (fixed_buffer);
|
||||
#endif /* HAVE_STRUCT_HOSTENT_DATA */
|
||||
#endif /* HAVE_GETHOSTBYADDR_R */
|
||||
|
||||
char *bytes = (char*) elements (addr);
|
||||
int len = addr->length;
|
||||
int type;
|
||||
char *val;
|
||||
if (len == 4)
|
||||
{
|
||||
val = bytes;
|
||||
type = AF_INET;
|
||||
}
|
||||
#ifdef HAVE_INET6
|
||||
else if (len == 16)
|
||||
{
|
||||
val = (char *) &bytes;
|
||||
type = AF_INET6;
|
||||
}
|
||||
#endif /* HAVE_INET6 */
|
||||
else
|
||||
JvFail ("unrecognized size");
|
||||
|
||||
#ifdef HAVE_GETHOSTBYADDR_R
|
||||
while (true)
|
||||
{
|
||||
int ok;
|
||||
#if HAVE_STRUCT_HOSTENT_DATA
|
||||
ok = ! gethostbyaddr_r (val, len, type, &hent_r, buffer_r);
|
||||
#else
|
||||
int herr = 0;
|
||||
#ifdef GETHOSTBYADDR_R_RETURNS_INT
|
||||
ok = ! gethostbyaddr_r (val, len, type, &hent_r,
|
||||
buffer_r, size_r, &hptr, &herr);
|
||||
#else
|
||||
hptr = gethostbyaddr_r (val, len, type, &hent_r,
|
||||
buffer_r, size_r, &herr);
|
||||
ok = hptr != NULL;
|
||||
#endif /* GETHOSTBYADDR_R_RETURNS_INT */
|
||||
if (! ok && herr == ERANGE)
|
||||
{
|
||||
size_r *= 2;
|
||||
buffer_r = (char *) _Jv_AllocBytes (size_r);
|
||||
}
|
||||
else
|
||||
#endif /* HAVE_STRUCT_HOSTENT_DATA */
|
||||
break;
|
||||
}
|
||||
#else /* HAVE_GETHOSTBYADDR_R */
|
||||
// FIXME: this is insufficient if some other piece of code calls
|
||||
// this gethostbyaddr.
|
||||
JvSynchronize sync (&java::net::VMInetAddress::class$);
|
||||
hptr = gethostbyaddr (val, len, type);
|
||||
#endif /* HAVE_GETHOSTBYADDR_R */
|
||||
|
||||
if (hptr == NULL)
|
||||
throw new java::net::UnknownHostException ();
|
||||
|
||||
return JvNewStringUTF (hptr->h_name);
|
||||
}
|
||||
|
||||
JArray<jbyteArray> *
|
||||
java::net::VMInetAddress::getHostByName (jstring host)
|
||||
{
|
||||
struct hostent *hptr = NULL;
|
||||
#ifdef HAVE_GETHOSTBYNAME_R
|
||||
struct hostent hent_r;
|
||||
#if HAVE_STRUCT_HOSTENT_DATA
|
||||
struct hostent_data fixed_buffer, *buffer_r = &fixed_buffer;
|
||||
#else
|
||||
#ifdef __GLIBC__
|
||||
// FIXME: in glibc, gethostbyname_r returns NETDB_INTERNAL to herr and
|
||||
// ERANGE to errno if the buffer size is too small, rather than what is
|
||||
// expected here. We work around this by setting a bigger buffer size and
|
||||
// hoping that it is big enough.
|
||||
char fixed_buffer[1024];
|
||||
#else
|
||||
char fixed_buffer[200];
|
||||
#endif /* __GLIBC__ */
|
||||
char *buffer_r = fixed_buffer;
|
||||
int size_r = sizeof (fixed_buffer);
|
||||
#endif /* HAVE_STRUCT_HOSTENT_DATA */
|
||||
#endif /* HAVE_GETHOSTBYNAME_R */
|
||||
|
||||
char *hostname;
|
||||
char buf[100];
|
||||
int len = JvGetStringUTFLength(host);
|
||||
if (len < 100)
|
||||
hostname = buf;
|
||||
else
|
||||
hostname = (char *) _Jv_AllocBytes (len + 1);
|
||||
JvGetStringUTFRegion (host, 0, host->length(), hostname);
|
||||
buf[len] = '\0';
|
||||
#ifdef HAVE_GETHOSTBYNAME_R
|
||||
while (true)
|
||||
{
|
||||
int ok;
|
||||
#if HAVE_STRUCT_HOSTENT_DATA
|
||||
ok = ! gethostbyname_r (hostname, &hent_r, buffer_r);
|
||||
#else
|
||||
int herr = 0;
|
||||
#ifdef GETHOSTBYNAME_R_RETURNS_INT
|
||||
ok = ! gethostbyname_r (hostname, &hent_r, buffer_r, size_r,
|
||||
&hptr, &herr);
|
||||
#else
|
||||
hptr = gethostbyname_r (hostname, &hent_r, buffer_r, size_r, &herr);
|
||||
ok = hptr != NULL;
|
||||
#endif /* GETHOSTNAME_R_RETURNS_INT */
|
||||
if (! ok && herr == ERANGE)
|
||||
{
|
||||
size_r *= 2;
|
||||
buffer_r = (char *) _Jv_AllocBytes (size_r);
|
||||
}
|
||||
else
|
||||
#endif /* HAVE_STRUCT_HOSTENT_DATA */
|
||||
break;
|
||||
}
|
||||
#else /* HAVE_GETHOSTBYNAME_R */
|
||||
// FIXME: this is insufficient if some other piece of code calls
|
||||
// this gethostbyname.
|
||||
JvSynchronize sync (&java::net::VMInetAddress::class$);
|
||||
hptr = gethostbyname (hostname);
|
||||
#endif /* HAVE_GETHOSTBYNAME_R */
|
||||
|
||||
if (hptr == NULL)
|
||||
throw new java::net::UnknownHostException (host);
|
||||
|
||||
int count = 0;
|
||||
char ** ptr = hptr->h_addr_list;
|
||||
while (*ptr++) count++;
|
||||
|
||||
JArray<jbyteArray> *result =
|
||||
(JArray<jbyteArray> *) _Jv_NewObjectArray (
|
||||
count, _Jv_GetArrayClass(JvPrimClass(byte), NULL), NULL);
|
||||
jbyteArray* addrs = elements (result);
|
||||
|
||||
for (int i = 0; i < count; i++)
|
||||
{
|
||||
addrs[i] = JvNewByteArray (hptr->h_length);
|
||||
memcpy (elements (addrs[i]), hptr->h_addr_list[i], hptr->h_length);
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
jbyteArray
|
||||
java::net::VMInetAddress::aton (jstring host)
|
||||
{
|
||||
char *hostname;
|
||||
char buf[100];
|
||||
int len = JvGetStringUTFLength(host);
|
||||
if (len < 100)
|
||||
hostname = buf;
|
||||
else
|
||||
hostname = (char *) _Jv_AllocBytes (len+1);
|
||||
JvGetStringUTFRegion (host, 0, host->length(), hostname);
|
||||
buf[len] = '\0';
|
||||
char *bytes = NULL;
|
||||
int blen = 0;
|
||||
#ifdef HAVE_INET_ATON
|
||||
struct in_addr laddr;
|
||||
if (inet_aton (hostname, &laddr))
|
||||
{
|
||||
bytes = (char *) &laddr;
|
||||
blen = 4;
|
||||
}
|
||||
#elif defined(HAVE_INET_ADDR)
|
||||
#if ! HAVE_IN_ADDR_T
|
||||
typedef jint in_addr_t;
|
||||
#endif
|
||||
in_addr_t laddr = inet_addr (hostname);
|
||||
if (laddr != (in_addr_t)(-1))
|
||||
{
|
||||
bytes = (char *) &laddr;
|
||||
blen = 4;
|
||||
}
|
||||
#endif
|
||||
#if defined (HAVE_INET_PTON) && defined (HAVE_INET6)
|
||||
char inet6_addr[16];
|
||||
if (len != 0 && inet_pton (AF_INET6, hostname, inet6_addr) > 0)
|
||||
{
|
||||
bytes = inet6_addr;
|
||||
blen = 16;
|
||||
}
|
||||
#endif
|
||||
if (blen == 0)
|
||||
return NULL;
|
||||
jbyteArray result = JvNewByteArray (blen);
|
||||
memcpy (elements (result), bytes, blen);
|
||||
return result;
|
||||
}
|
121
libjava/java/net/natVMInetAddressWin32.cc
Normal file
121
libjava/java/net/natVMInetAddressWin32.cc
Normal file
@ -0,0 +1,121 @@
|
||||
/* Copyright (C) 2003, 2006 Free Software Foundation
|
||||
|
||||
This file is part of libgcj.
|
||||
|
||||
This software is copyrighted work licensed under the terms of the
|
||||
Libgcj License. Please consult the file "LIBGCJ_LICENSE" for
|
||||
details. */
|
||||
|
||||
#include <config.h>
|
||||
#include <platform.h>
|
||||
|
||||
#undef STRICT
|
||||
|
||||
#include <java/net/VMInetAddress.h>
|
||||
#include <java/net/UnknownHostException.h>
|
||||
|
||||
jstring
|
||||
java::net::VMInetAddress::getLocalHostname ()
|
||||
{
|
||||
char buffer[400];
|
||||
if (gethostname (buffer, sizeof(buffer)))
|
||||
return NULL;
|
||||
// It is admittedly non-optimal to convert the hostname to Unicode
|
||||
// only to convert it back in getByName, but simplicity wins.
|
||||
return JvNewStringUTF (buffer);
|
||||
}
|
||||
|
||||
jbyteArray
|
||||
java::net::VMInetAddress::lookupInaddrAny ()
|
||||
{
|
||||
unsigned long laddr = INADDR_ANY;
|
||||
char *bytes = (char *) &laddr;
|
||||
int blen = sizeof (laddr);
|
||||
jbyteArray result = JvNewByteArray (blen);
|
||||
memcpy (elements (result), bytes, blen);
|
||||
return result;
|
||||
}
|
||||
|
||||
jstring
|
||||
java::net::VMInetAddress::getHostByAddr (jbyteArray addr)
|
||||
{
|
||||
struct hostent *hptr = NULL;
|
||||
char *bytes = (char*) elements (addr);
|
||||
int len = addr->length;
|
||||
int type;
|
||||
char *val;
|
||||
if (len == 4)
|
||||
{
|
||||
val = bytes;
|
||||
type = AF_INET;
|
||||
}
|
||||
#ifdef HAVE_INET6
|
||||
else if (len == 16)
|
||||
{
|
||||
val = (char *) &bytes;
|
||||
type = AF_INET6;
|
||||
}
|
||||
#endif /* HAVE_INET6 */
|
||||
else
|
||||
JvFail ("unrecognized size");
|
||||
|
||||
// FIXME: this is insufficient if some other piece of code calls
|
||||
// this gethostbyaddr.
|
||||
JvSynchronize sync (&java::net::VMInetAddress::class$);
|
||||
hptr = gethostbyaddr (val, len, type);
|
||||
|
||||
if (hptr == NULL)
|
||||
throw new java::net::UnknownHostException ();
|
||||
|
||||
return JvNewStringUTF (hptr->h_name);
|
||||
}
|
||||
|
||||
JArray<jbyteArray> *
|
||||
java::net::VMInetAddress::getHostByName (jstring host)
|
||||
{
|
||||
struct hostent *hptr = NULL;
|
||||
JV_TEMP_UTF_STRING (hostname, host);
|
||||
|
||||
// FIXME: this is insufficient if some other piece of code calls
|
||||
// this gethostbyname.
|
||||
JvSynchronize sync (&java::net::VMInetAddress::class$);
|
||||
hptr = gethostbyname (hostname);
|
||||
|
||||
if (hptr == NULL)
|
||||
throw new java::net::UnknownHostException (host);
|
||||
|
||||
int count = 0;
|
||||
char ** ptr = hptr->h_addr_list;
|
||||
while (*ptr++) count++;
|
||||
|
||||
JArray<jbyteArray> *result =
|
||||
(JArray<jbyteArray> *) _Jv_NewObjectArray (
|
||||
count, _Jv_GetArrayClass(JvPrimClass(byte), NULL), NULL);
|
||||
jbyteArray* addrs = elements (result);
|
||||
|
||||
for (int i = 0; i < count; i++)
|
||||
{
|
||||
addrs[i] = JvNewByteArray (hptr->h_length);
|
||||
memcpy (elements (addrs[i]), hptr->h_addr_list[i], hptr->h_length);
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
jbyteArray
|
||||
java::net::VMInetAddress::aton (jstring host)
|
||||
{
|
||||
JV_TEMP_UTF_STRING (hostname, host);
|
||||
char* bytes = NULL;
|
||||
int blen = 0;
|
||||
unsigned long laddr = inet_addr (hostname);
|
||||
if (laddr != INADDR_NONE)
|
||||
{
|
||||
bytes = (char *) &laddr;
|
||||
blen = 4;
|
||||
}
|
||||
if (blen == 0)
|
||||
return NULL;
|
||||
jbyteArray result = JvNewByteArray (blen);
|
||||
memcpy (elements (result), bytes, blen);
|
||||
return result;
|
||||
}
|
@ -12,7 +12,7 @@ details. */
|
||||
#undef STRICT
|
||||
|
||||
#include <java/net/NetworkInterface.h>
|
||||
#include <java/net/Inet4Address.h>
|
||||
#include <java/net/InetAddress.h>
|
||||
#include <java/net/SocketException.h>
|
||||
#include <java/net/VMNetworkInterface.h>
|
||||
#include <java/util/Vector.h>
|
||||
@ -83,8 +83,8 @@ winsock2GetRealNetworkInterfaces (jstring* pjstrName,
|
||||
}
|
||||
|
||||
jstring if_name = _Jv_Win32NewString (szName);
|
||||
java::net::Inet4Address* address =
|
||||
new java::net::Inet4Address (baddr, JvNewStringLatin1 (""));
|
||||
java::net::InetAddress* address =
|
||||
java::net::InetAddress::getByAddress (baddr);
|
||||
pjstrName[i] = if_name;
|
||||
ppAddress[i] = address;
|
||||
}
|
||||
|
@ -5229,7 +5229,7 @@ classpath/java/net/FileNameMap.java \
|
||||
classpath/java/net/HttpURLConnection.java \
|
||||
classpath/java/net/Inet4Address.java \
|
||||
classpath/java/net/Inet6Address.java \
|
||||
java/net/InetAddress.java \
|
||||
classpath/java/net/InetAddress.java \
|
||||
classpath/java/net/InetSocketAddress.java \
|
||||
classpath/java/net/JarURLConnection.java \
|
||||
classpath/java/net/MalformedURLException.java \
|
||||
|
Loading…
Reference in New Issue
Block a user