You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@tomcat.apache.org by mt...@apache.org on 2013/10/07 11:24:32 UTC
svn commit: r1529803 - in /tomcat/jk/trunk/native/common: jk_connect.c
jk_global.h
Author: mturk
Date: Mon Oct 7 09:24:32 2013
New Revision: 1529803
URL: http://svn.apache.org/r1529803
Log:
Use getaddrinfo instead gethostbyname for both IPv4 and IPv6
Modified:
tomcat/jk/trunk/native/common/jk_connect.c
tomcat/jk/trunk/native/common/jk_global.h
Modified: tomcat/jk/trunk/native/common/jk_connect.c
URL: http://svn.apache.org/viewvc/tomcat/jk/trunk/native/common/jk_connect.c?rev=1529803&r1=1529802&r2=1529803&view=diff
==============================================================================
--- tomcat/jk/trunk/native/common/jk_connect.c (original)
+++ tomcat/jk/trunk/native/common/jk_connect.c Mon Oct 7 09:24:32 2013
@@ -409,11 +409,76 @@ int jk_resolve(const char *host, int por
#else /* HAVE_APR */
/* Without APR go the classic way.
*/
-
- struct hostent *hoste;
+#if defined(HAVE_GETADDRINFO)
/* TODO:
- * Check for numeric IPV6 addresses
+ * 1. Check for numeric IPV6 addresses
+ * 2. Do we need to set service name for getaddrinfo?
*/
+ struct addrinfo hints, *ai_list, *ai = NULL;
+ int error;
+
+ memset(&hints, 0, sizeof(hints));
+ hints.ai_socktype = SOCK_STREAM;
+#if JK_HAVE_IPV6
+ if (prefer_ipv6)
+ hints.ai_family = JK_INET6;
+ else
+#endif
+ hints.ai_family = JK_INET;
+ error = getaddrinfo(host, NULL, &hints, &ai_list);
+#if JK_HAVE_IPV6
+ /* XXX:
+ * Is the check for EAI_FAMILY/WSAEAFNOSUPPORT correct
+ * way to retry the IPv4 address?
+ */
+ if (error == EAI_FAMILY && prefer_ipv6) {
+ hints.ai_family = JK_INET;
+ error = getaddrinfo(host, NULL, &hints, &ai_list);
+ }
+#endif
+ if (error) {
+ JK_TRACE_EXIT(l);
+ errno = error;
+ return JK_FALSE;
+ }
+#if JK_HAVE_IPV6
+ if (prefer_ipv6) {
+ ai = ai_list;
+ while (ai) {
+ if (ai->ai_family == AF_INET6) {
+ family = JK_INET6;
+ break;
+ }
+ else {
+ ai = ai->ai_next;
+ }
+ }
+ }
+#endif
+ if (ai == NULL) {
+ ai = ai_list;
+ while (ai) {
+ if (ai->ai_family == AF_INET) {
+ family = JK_INET;
+ break;
+ }
+ else {
+ ai = ai->ai_next;
+ }
+ }
+ }
+ freeaddrinfo(ai_list);
+ if (ai == NULL) {
+ /* No address found
+ * XXX: Use better error code?
+ */
+ JK_TRACE_EXIT(l);
+ errno = ENOENT;
+ return JK_FALSE;
+ }
+ memcpy(&(saddr->sa), ai->ai_addr, ai->ai_addrlen);
+#else /* HAVE_GETADDRINFO */
+ struct hostent *hoste;
/* XXX : WARNING : We should really use gethostbyname_r in multi-threaded env */
/* Fortunatly when APR is available, ie under Apache 2.0, we use it */
@@ -428,7 +493,7 @@ int jk_resolve(const char *host, int por
}
iaddr = *((struct in_addr *)hoste->h_addr_list[0]);
memcpy(&(saddr->sa.sin.sin_addr), &iaddr, sizeof(struct in_addr));
-
+#endif /* HAVE_GETADDRINFO */
#endif /* HAVE_APR */
}
@@ -823,7 +888,7 @@ int jk_shutdown_socket(jk_sock_t sd, jk_
rd += rp;
if (rp < sizeof(dummy)) {
if (timeout > MS_TO_LINGER_LAST) {
- /* Try one last time with a short timeout
+ /* Try one last time with a short timeout
*/
timeout = MS_TO_LINGER_LAST;
continue;
Modified: tomcat/jk/trunk/native/common/jk_global.h
URL: http://svn.apache.org/viewvc/tomcat/jk/trunk/native/common/jk_global.h?rev=1529803&r1=1529802&r2=1529803&view=diff
==============================================================================
--- tomcat/jk/trunk/native/common/jk_global.h (original)
+++ tomcat/jk/trunk/native/common/jk_global.h Mon Oct 7 09:24:32 2013
@@ -347,6 +347,7 @@ extern "C"
#define HAVE_SNPRINTF
#define HAVE_SOCKADDR_STORAGE
#define HAVE_AF_INET6
+#define HAVE_GETADDRINFO
#ifdef HAVE_APR
#define snprintf apr_snprintf
#define vsnprintf apr_vsnprintf
---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscribe@tomcat.apache.org
For additional commands, e-mail: dev-help@tomcat.apache.org