mirror of git://gcc.gnu.org/git/gcc.git
				
				
				
			
		
			
				
	
	
		
			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;
 | |
| }
 |