From 938257c6a120f2b727aa0ecc8492e1c145a9cf0c Mon Sep 17 00:00:00 2001 From: =?utf8?q?Zden=C4=9Bk=20Salvet?= Date: Fri, 19 Mar 2010 11:41:03 +0000 Subject: [PATCH] Workaround c-ares's problems with IPv4 mapped addresses. --- org.glite.lb.server/src/bkserverd.c | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/org.glite.lb.server/src/bkserverd.c b/org.glite.lb.server/src/bkserverd.c index 5e60f2d..d071741 100644 --- a/org.glite.lb.server/src/bkserverd.c +++ b/org.glite.lb.server/src/bkserverd.c @@ -1811,6 +1811,7 @@ static int asyn_gethostbyaddr(char **name, char **service, const struct sockaddr struct timeval start_time,check_time; int flags = 0; int err = NETDB_INTERNAL; + struct sockaddr_in v4; /* start timer */ gettimeofday(&start_time,0); @@ -1819,6 +1820,14 @@ static int asyn_gethostbyaddr(char **name, char **service, const struct sockaddr if ( ares_init(&channel) != ARES_SUCCESS ) return(NETDB_INTERNAL); memset((void *) &ar, 0, sizeof(ar)); + if (addr->sa_family == AF_INET6 && IN6_IS_ADDR_V4MAPPED(&((struct sockaddr_in6 *)addr)->sin6_addr)) { + v4.sin_family = AF_INET; + v4.sin_port = ((struct sockaddr_in6 *)addr)->sin6_port; + v4.sin_addr.s_addr = ((struct sockaddr_in6 *)addr)->sin6_addr.in6_u.u6_addr32[3]; + addr = (struct sockaddr *) &v4; + len = sizeof(v4); + } + /* query DNS server asynchronously */ if (name) flags |= ARES_NI_LOOKUPHOST | ( numeric? ARES_NI_NUMERICHOST : 0); if (service) flags |= ARES_NI_LOOKUPSERVICE | ( numeric? ARES_NI_NUMERICSERV : 0); -- 1.8.2.3