122 lines
2.9 KiB
C++
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;
|
||
|
}
|