--- a/jdk/src/solaris/native/java/net/net_util_md.c Fri Sep 17 14:35:00 2010 -0700
+++ b/jdk/src/solaris/native/java/net/net_util_md.c Fri Sep 17 14:40:38 2010 -0700
@@ -61,6 +61,7 @@
getaddrinfo_f getaddrinfo_ptr = NULL;
freeaddrinfo_f freeaddrinfo_ptr = NULL;
+gai_strerror_f gai_strerror_ptr = NULL;
getnameinfo_f getnameinfo_ptr = NULL;
/*
@@ -342,11 +343,14 @@
freeaddrinfo_ptr = (freeaddrinfo_f)
JVM_FindLibraryEntry(RTLD_DEFAULT, "freeaddrinfo");
+ gai_strerror_ptr = (gai_strerror_f)
+ JVM_FindLibraryEntry(RTLD_DEFAULT, "gai_strerror");
+
getnameinfo_ptr = (getnameinfo_f)
JVM_FindLibraryEntry(RTLD_DEFAULT, "getnameinfo");
if (freeaddrinfo_ptr == NULL || getnameinfo_ptr == NULL) {
- /* Wee need all 3 of them */
+ /* We need all 3 of them */
getaddrinfo_ptr = NULL;
}
@@ -355,6 +359,32 @@
#endif /* AF_INET6 */
}
+void ThrowUnknownHostExceptionWithGaiError(JNIEnv *env,
+ const char* hostname,
+ int gai_error)
+{
+ const char *format = "%s: %s";
+ const char *error_string =
+ (gai_strerror_ptr == NULL) ? NULL : (*gai_strerror_ptr)(gai_error);
+ if (error_string == NULL)
+ error_string = "unknown error";
+
+ int size = strlen(format) + strlen(hostname) + strlen(error_string) + 2;
+ char *buf = (char *) malloc(size);
+ if (buf) {
+ sprintf(buf, format, hostname, error_string);
+ jstring s = JNU_NewStringPlatform(env, buf);
+ if (s != NULL) {
+ jobject x = JNU_NewObjectByName(env,
+ "java/net/UnknownHostException",
+ "(Ljava/lang/String;)V", s);
+ if (x != NULL)
+ (*env)->Throw(env, x);
+ }
+ free(buf);
+ }
+}
+
void
NET_AllocSockaddr(struct sockaddr **him, int *len) {
#ifdef AF_INET6