From cf9498a89fd346d3e9989cb6480ebc495ef40345 Mon Sep 17 00:00:00 2001 From: gary Date: Fri, 3 Nov 2006 10:16:04 +0000 Subject: 2006-11-03 Gary Benson * 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. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@118451 138bc75d-0d04-0410-961f-82ee72b054a4 --- libjava/java/net/natVMInetAddressWin32.cc | 121 ++++++++++++++++++++++++++++++ 1 file changed, 121 insertions(+) create mode 100644 libjava/java/net/natVMInetAddressWin32.cc (limited to 'libjava/java/net/natVMInetAddressWin32.cc') diff --git a/libjava/java/net/natVMInetAddressWin32.cc b/libjava/java/net/natVMInetAddressWin32.cc new file mode 100644 index 00000000000..259480faa96 --- /dev/null +++ b/libjava/java/net/natVMInetAddressWin32.cc @@ -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 +#include + +#undef STRICT + +#include +#include + +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 * +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 *result = + (JArray *) _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; +} -- cgit v1.2.3