mirror of git://gcc.gnu.org/git/gcc.git
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>
|
2006-11-02 Keith Seitz <keiths@redhat.com>
|
||||||
|
|
||||||
* gnu/classpath/jdwp/natVMMethod.cc (getLineTable): Implement.
|
* gnu/classpath/jdwp/natVMMethod.cc (getLineTable): Implement.
|
||||||
|
|
|
||||||
|
|
@ -858,7 +858,7 @@ java/lang/reflect/natConstructor.cc \
|
||||||
java/lang/reflect/natField.cc \
|
java/lang/reflect/natField.cc \
|
||||||
java/lang/reflect/natMethod.cc \
|
java/lang/reflect/natMethod.cc \
|
||||||
java/net/natVMNetworkInterface.cc \
|
java/net/natVMNetworkInterface.cc \
|
||||||
java/net/natInetAddress.cc \
|
java/net/natVMInetAddress.cc \
|
||||||
java/net/natURLClassLoader.cc \
|
java/net/natURLClassLoader.cc \
|
||||||
java/nio/channels/natVMChannels.cc \
|
java/nio/channels/natVMChannels.cc \
|
||||||
java/nio/natDirectByteBufferImpl.cc \
|
java/nio/natDirectByteBufferImpl.cc \
|
||||||
|
|
|
||||||
|
|
@ -95,7 +95,7 @@ CONFIG_HEADER = $(top_builddir)/include/config.h \
|
||||||
$(top_builddir)/gcj/libgcj-config.h
|
$(top_builddir)/gcj/libgcj-config.h
|
||||||
CONFIG_CLEAN_FILES = libgcj.pc libgcj.spec libgcj-test.spec \
|
CONFIG_CLEAN_FILES = libgcj.pc libgcj.spec libgcj-test.spec \
|
||||||
scripts/jar java/io/natFile.cc java/lang/ConcreteProcess.java \
|
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 \
|
java/net/natVMNetworkInterface.cc \
|
||||||
gnu/java/net/natPlainSocketImpl.cc \
|
gnu/java/net/natPlainSocketImpl.cc \
|
||||||
gnu/java/net/natPlainDatagramSocketImpl.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/ref/natReference.cc java/lang/reflect/natArray.cc \
|
||||||
java/lang/reflect/natConstructor.cc \
|
java/lang/reflect/natConstructor.cc \
|
||||||
java/lang/reflect/natField.cc java/lang/reflect/natMethod.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/net/natURLClassLoader.cc \
|
||||||
java/nio/channels/natVMChannels.cc \
|
java/nio/channels/natVMChannels.cc \
|
||||||
java/nio/natDirectByteBufferImpl.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/ref/natReference.lo java/lang/reflect/natArray.lo \
|
||||||
java/lang/reflect/natConstructor.lo \
|
java/lang/reflect/natConstructor.lo \
|
||||||
java/lang/reflect/natField.lo java/lang/reflect/natMethod.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/net/natURLClassLoader.lo \
|
||||||
java/nio/channels/natVMChannels.lo \
|
java/nio/channels/natVMChannels.lo \
|
||||||
java/nio/natDirectByteBufferImpl.lo \
|
java/nio/natDirectByteBufferImpl.lo \
|
||||||
|
|
@ -4130,7 +4130,7 @@ classpath/java/net/FileNameMap.java \
|
||||||
classpath/java/net/HttpURLConnection.java \
|
classpath/java/net/HttpURLConnection.java \
|
||||||
classpath/java/net/Inet4Address.java \
|
classpath/java/net/Inet4Address.java \
|
||||||
classpath/java/net/Inet6Address.java \
|
classpath/java/net/Inet6Address.java \
|
||||||
java/net/InetAddress.java \
|
classpath/java/net/InetAddress.java \
|
||||||
classpath/java/net/InetSocketAddress.java \
|
classpath/java/net/InetSocketAddress.java \
|
||||||
classpath/java/net/JarURLConnection.java \
|
classpath/java/net/JarURLConnection.java \
|
||||||
classpath/java/net/MalformedURLException.java \
|
classpath/java/net/MalformedURLException.java \
|
||||||
|
|
@ -7431,7 +7431,7 @@ java/lang/reflect/natConstructor.cc \
|
||||||
java/lang/reflect/natField.cc \
|
java/lang/reflect/natField.cc \
|
||||||
java/lang/reflect/natMethod.cc \
|
java/lang/reflect/natMethod.cc \
|
||||||
java/net/natVMNetworkInterface.cc \
|
java/net/natVMNetworkInterface.cc \
|
||||||
java/net/natInetAddress.cc \
|
java/net/natVMInetAddress.cc \
|
||||||
java/net/natURLClassLoader.cc \
|
java/net/natURLClassLoader.cc \
|
||||||
java/nio/channels/natVMChannels.cc \
|
java/nio/channels/natVMChannels.cc \
|
||||||
java/nio/natDirectByteBufferImpl.cc \
|
java/nio/natDirectByteBufferImpl.cc \
|
||||||
|
|
@ -7929,7 +7929,7 @@ java/net/$(DEPDIR)/$(am__dirstamp):
|
||||||
@: > java/net/$(DEPDIR)/$(am__dirstamp)
|
@: > java/net/$(DEPDIR)/$(am__dirstamp)
|
||||||
java/net/natVMNetworkInterface.lo: java/net/$(am__dirstamp) \
|
java/net/natVMNetworkInterface.lo: java/net/$(am__dirstamp) \
|
||||||
java/net/$(DEPDIR)/$(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/$(DEPDIR)/$(am__dirstamp)
|
||||||
java/net/natURLClassLoader.lo: java/net/$(am__dirstamp) \
|
java/net/natURLClassLoader.lo: java/net/$(am__dirstamp) \
|
||||||
java/net/$(DEPDIR)/$(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/natField.lo
|
||||||
-rm -f java/lang/reflect/natMethod.$(OBJEXT)
|
-rm -f java/lang/reflect/natMethod.$(OBJEXT)
|
||||||
-rm -f java/lang/reflect/natMethod.lo
|
-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.$(OBJEXT)
|
||||||
-rm -f java/net/natURLClassLoader.lo
|
-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.$(OBJEXT)
|
||||||
-rm -f java/net/natVMNetworkInterface.lo
|
-rm -f java/net/natVMNetworkInterface.lo
|
||||||
-rm -f java/nio/channels/natVMChannels.$(OBJEXT)
|
-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)/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)/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/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)/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/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/$(DEPDIR)/natDirectByteBufferImpl.Plo@am__quote@
|
||||||
@AMDEP_TRUE@@am__include@ @am__quote@java/nio/channels/$(DEPDIR)/natVMChannels.Plo@am__quote@
|
@AMDEP_TRUE@@am__include@ @am__quote@java/nio/channels/$(DEPDIR)/natVMChannels.Plo@am__quote@
|
||||||
|
|
|
||||||
|
|
@ -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"
|
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
|
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"
|
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/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/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/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" ;;
|
"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/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" ;;
|
"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/ConcreteProcess.java:java/lang/${PLATFORM}Process.java)
|
||||||
AC_CONFIG_LINKS(java/lang/natConcreteProcess.cc:java/lang/nat${PLATFORM}Process.cc)
|
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
|
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)
|
AC_CONFIG_LINKS(java/net/natVMNetworkInterface.cc:java/net/natVMNetworkInterface${PLATFORMNET}.cc)
|
||||||
|
|
||||||
# Likewise for natPlainSocketImpl.cc and natPlainDatagramSocketImpl.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.
|
This file is part of libgcj.
|
||||||
|
|
||||||
|
|
@ -238,7 +238,7 @@ gnu::java::net::PlainDatagramSocketImpl::peekData(::java::net::DatagramPacket *p
|
||||||
else
|
else
|
||||||
throw new ::java::net::SocketException (JvNewStringUTF ("invalid family"));
|
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->setPort (rport);
|
||||||
p->length = (jint) retlen;
|
p->length = (jint) retlen;
|
||||||
return rport;
|
return rport;
|
||||||
|
|
@ -360,7 +360,7 @@ gnu::java::net::PlainDatagramSocketImpl::receive (::java::net::DatagramPacket *p
|
||||||
else
|
else
|
||||||
throw new ::java::net::SocketException (JvNewStringUTF ("invalid family"));
|
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->setPort (rport);
|
||||||
p->length = (jint) retlen;
|
p->length = (jint) retlen;
|
||||||
return;
|
return;
|
||||||
|
|
@ -656,7 +656,7 @@ gnu::java::net::PlainDatagramSocketImpl::getOption (jint optID)
|
||||||
else
|
else
|
||||||
throw new ::java::net::SocketException (
|
throw new ::java::net::SocketException (
|
||||||
JvNewStringUTF ("invalid family"));
|
JvNewStringUTF ("invalid family"));
|
||||||
localAddress = new ::java::net::InetAddress (laddr, NULL);
|
localAddress = ::java::net::InetAddress::getByAddress (laddr);
|
||||||
}
|
}
|
||||||
return localAddress;
|
return localAddress;
|
||||||
break;
|
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.
|
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->native_fd = (jint) hSocket;
|
||||||
s->localport = localport;
|
s->localport = localport;
|
||||||
s->address = new ::java::net::InetAddress (raddr, NULL);
|
s->address = ::java::net::InetAddress::getByAddress (raddr);
|
||||||
s->port = rport;
|
s->port = rport;
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
|
@ -735,7 +735,7 @@ gnu::java::net::PlainSocketImpl::getOption (jint optID)
|
||||||
else
|
else
|
||||||
throw new ::java::net::SocketException
|
throw new ::java::net::SocketException
|
||||||
(JvNewStringUTF ("invalid family"));
|
(JvNewStringUTF ("invalid family"));
|
||||||
localAddress = new ::java::net::InetAddress (laddr, NULL);
|
localAddress = ::java::net::InetAddress::getByAddress (laddr);
|
||||||
}
|
}
|
||||||
|
|
||||||
return localAddress;
|
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.
|
* @return The local hostname.
|
||||||
*/
|
*/
|
||||||
public static String getLocalHostname()
|
public static native String getLocalHostname();
|
||||||
{
|
|
||||||
return InetAddress.getLocalHostname();
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns the value of the special address INADDR_ANY
|
* Returns the value of the special address INADDR_ANY
|
||||||
*/
|
*/
|
||||||
public static byte[] lookupInaddrAny() throws UnknownHostException
|
public static native byte[] lookupInaddrAny() throws UnknownHostException;
|
||||||
{
|
|
||||||
return new byte[] {0, 0, 0, 0};
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* This method returns the hostname for a given IP address. It will
|
* 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
|
* @exception UnknownHostException If the reverse lookup fails
|
||||||
*/
|
*/
|
||||||
public static String getHostByAddr(byte[] ip) throws UnknownHostException
|
public static native String getHostByAddr(byte[] ip)
|
||||||
{
|
throws UnknownHostException;
|
||||||
InetAddress addr = InetAddress.getByAddress(ip);
|
|
||||||
InetAddress.lookup(null, addr, false);
|
|
||||||
return addr.getHostName();
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns a list of all IP addresses for a given hostname. Will throw
|
* Returns a list of all IP addresses for a given hostname. Will throw
|
||||||
* an UnknownHostException if the hostname cannot be resolved.
|
* an UnknownHostException if the hostname cannot be resolved.
|
||||||
*/
|
*/
|
||||||
public static byte[][] getHostByName(String hostname)
|
public static native byte[][] getHostByName(String hostname)
|
||||||
throws UnknownHostException
|
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;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Return the IP address represented by a literal address.
|
* 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
|
* @return The IP address as a byte array
|
||||||
*/
|
*/
|
||||||
public static byte[] aton(String address)
|
public static native byte[] aton(String address);
|
||||||
{
|
|
||||||
return InetAddress.aton(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);
|
|
||||||
}
|
|
||||||
|
|
@ -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;
|
||||||
|
}
|
||||||
|
|
@ -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;
|
||||||
|
}
|
||||||
|
|
@ -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
|
#undef STRICT
|
||||||
|
|
||||||
#include <java/net/NetworkInterface.h>
|
#include <java/net/NetworkInterface.h>
|
||||||
#include <java/net/Inet4Address.h>
|
#include <java/net/InetAddress.h>
|
||||||
#include <java/net/SocketException.h>
|
#include <java/net/SocketException.h>
|
||||||
#include <java/net/VMNetworkInterface.h>
|
#include <java/net/VMNetworkInterface.h>
|
||||||
#include <java/util/Vector.h>
|
#include <java/util/Vector.h>
|
||||||
|
|
@ -83,8 +83,8 @@ winsock2GetRealNetworkInterfaces (jstring* pjstrName,
|
||||||
}
|
}
|
||||||
|
|
||||||
jstring if_name = _Jv_Win32NewString (szName);
|
jstring if_name = _Jv_Win32NewString (szName);
|
||||||
java::net::Inet4Address* address =
|
java::net::InetAddress* address =
|
||||||
new java::net::Inet4Address (baddr, JvNewStringLatin1 (""));
|
java::net::InetAddress::getByAddress (baddr);
|
||||||
pjstrName[i] = if_name;
|
pjstrName[i] = if_name;
|
||||||
ppAddress[i] = address;
|
ppAddress[i] = address;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -5229,7 +5229,7 @@ classpath/java/net/FileNameMap.java \
|
||||||
classpath/java/net/HttpURLConnection.java \
|
classpath/java/net/HttpURLConnection.java \
|
||||||
classpath/java/net/Inet4Address.java \
|
classpath/java/net/Inet4Address.java \
|
||||||
classpath/java/net/Inet6Address.java \
|
classpath/java/net/Inet6Address.java \
|
||||||
java/net/InetAddress.java \
|
classpath/java/net/InetAddress.java \
|
||||||
classpath/java/net/InetSocketAddress.java \
|
classpath/java/net/InetSocketAddress.java \
|
||||||
classpath/java/net/JarURLConnection.java \
|
classpath/java/net/JarURLConnection.java \
|
||||||
classpath/java/net/MalformedURLException.java \
|
classpath/java/net/MalformedURLException.java \
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue