c3f322d803
* java/net/InetAddress.java (lookup): New method that doesnt lookup "0.0.0.0". (ImplLookup): Renamed from lookup. * java/net/natInetAddressNoNet.cc (ImplLookup): Renamed from lookup. * java/net/natInetAddressPosix.cc (ImplLookup): Renamed from lookup. * java/net/natInetAddressWin32.cc (ImplLookup): Renamed from lookup. From-SVN: r74026
170 lines
4.0 KiB
C++
170 lines
4.0 KiB
C++
/* 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::implLookup (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::localhostAddress);
|
|
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::localhostAddress);
|
|
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);
|
|
}
|