rt_gccstream/libjava/java/net/natVMInetAddressWin32.cc

122 lines
2.9 KiB
C++

/* 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;
}