--- PayloadTCPSocket.cpp.orig	2008-02-13 15:34:06.000000000 +0100
+++ PayloadTCPSocket.cpp	2008-02-13 18:44:18.000000000 +0100
@@ -7,6 +7,7 @@
 typedef int socklen_t;
 #define ErrNo WSAGetLastError()
 #else // UNIX
+#include <sys/types.h>
 #include <sys/socket.h>
 #include <netdb.h>
 #include <netinet/in.h>
@@ -18,45 +19,43 @@
 namespace Arc {
 
 int PayloadTCPSocket::connect_socket(const char* hostname,int port) {
-  struct hostent* host = NULL;
-  struct hostent  hostbuf;
-  int    errcode = 0;
-#ifndef HAVE_GETHOSTBYNAME_R
-  /* According to the developer manual the Darwin's version of gethostbyname
-     is thread-safe */
-  host = gethostbyname(hostname);
-  if (host == NULL) {
-#else
-  #if defined(_AIX)
-  struct hostent_data buf[BUFSIZ];
-  if((errcode=gethostbyname_r(hostname,
-                                  (host=&hostbuf),buf)) != 0) {
-  #else
-  char   buf[BUFSIZ];
-  if((gethostbyname_r(hostname,&hostbuf,buf,sizeof(buf),
-                                        &host,&errcode) != 0) ||
-     (host == NULL)) {
-  #endif
-#endif
-    logger.msg(WARNING, "Failed to resolve %s", hostname);
-    return -1;
-  };
-  if( (host->h_length < (int)sizeof(struct in_addr)) ||
-      (host->h_addr_list[0] == NULL) ) {
-    logger.msg(WARNING, "Failed to resolve %s", hostname);
+  struct addrinfo gaihints, *gaires, *gaires0;
+  ssize_t l;
+  int s;
+  char hbuf[NI_MAXHOST], sbuf[NI_MAXSERV];
+  int    gaierror = 0;
+
+  memset(&gaihints, 0, sizeof(gaihints));
+  gaihints.ai_socktype = SOCK_STREAM;
+  snprintf(sbuf, NI_MAXSERV, "%d",port);
+  gaierror = getaddrinfo(hostname, sbuf, &gaihints, &gaires0);
+  if (gaierror) {
+    logger.msg(WARNING, "Failed to resolve %s: %s", hostname, gai_strerror(gaierror));
     return -1;
+  }
+  /* try all the sockaddrs until connection goes successful */
+  for (gaires = gaires0; gaires; gaires = gaires->ai_next) {
+     gaierror = getnameinfo(gaires->ai_addr, gaires->ai_addrlen, hbuf,
+                    sizeof(hbuf), sbuf, sizeof(sbuf),
+                    NI_NUMERICHOST | NI_NUMERICSERV);
+     if (gaierror) {
+        logger.msg(WARNING, "Failed to getnameinfo() %s: %s", hostname, gai_strerror(gaierror));
+                        continue;
+      }
+      logger.msg(INFO, "trying %s port %s\n", hbuf, sbuf);
+
+      s = socket(gaires->ai_family, gaires->ai_socktype, gaires->ai_protocol);
+      if (s < 0)
+         continue;
+      if (connect(s, gaires->ai_addr, gaires->ai_addrlen) < 0) {
+         close(s);
+         s = -1;
+         logger.msg(WARNING, "Failed to connect to %s:%i", hostname, port);
+         continue;
+      }
+
   };
-  struct sockaddr_in addr;
-  memset(&addr,0,sizeof(addr));
-  addr.sin_family=AF_INET;
-  addr.sin_port=htons(port);
-  memcpy(&addr.sin_addr,host->h_addr_list[0],sizeof(struct in_addr));
-  int s = ::socket(PF_INET,SOCK_STREAM,IPPROTO_TCP);
-  if(s==-1) return -1;
-  if(::connect(s,(struct sockaddr *)&addr,sizeof(addr))==-1) {
-    logger.msg(WARNING, "Failed to connect to %s:%i", hostname, port);
-    close(s); return -1;
-  };
+  freeaddrinfo(gaires0);
   return s;
 }
 
