/* 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 #include #undef STRICT #include #include #include 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::lookup (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::loopbackAddress); 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::loopbackAddress); 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 *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); }