7ada996f71680cb0f7b1555a01a6e16814a57a7f
galt
  Sun Aug 4 04:30:55 2019 -0700
Making TCP client connect more robust by trying each IP address returned by getaddrinfo() until one connects, or all have failed.

diff --git src/lib/internet.c src/lib/internet.c
index dcd4e14..190178b 100644
--- src/lib/internet.c
+++ src/lib/internet.c
@@ -530,31 +530,31 @@
     struct cidr *cidrOne = internetParseOneSubnetCidr(words[i]);
     slAddHead(&list, cidrOne);
     }
 slReverse(&list);
 return list;
 }
 
 socklen_t getSockSize6n4(struct sockaddr_storage *sai)
 /* figure out the size of the structure from the socket type */
 {
 if (sai->ss_family == AF_INET6)   //ipv6
     return sizeof (struct sockaddr_in6);
 else if (sai->ss_family == AF_INET)  // ipv4
    return sizeof (struct sockaddr_in);
 else
-   errAbort("unknown ss_family %d in getSockSize", sai->ss_family);
+   errAbort("unknown ss_family %d in getSockSize6n4", sai->ss_family);
 return -1;  // make the compiler happy.
 }
 
 void trimIpv4MappingPrefix(char *ipStr)
 /* trim off the "::ffff:" ipv4-mapped prefix of the ipv6 address */
 {
 if (!ipStr)
     errAbort("unexpected NULL ipStr in trimIpv4-mappingPrefix");
 if (startsWith(IPV4MAPPED_PREFIX, ipStr)) // strip off ipv6 ipv4-mapping
     {
     int size = strlen(ipStr);	    
     int prefixSize = strlen(IPV4MAPPED_PREFIX);
     memmove(ipStr, ipStr + prefixSize, size - prefixSize + 1); // dest and src can overlap.
     }
 }
@@ -568,46 +568,46 @@
     if (inet_ntop(AF_INET6, &sai6->sin6_addr, ipStr, ipStrSize) < 0)
         {
         errAbort("ntop failed on ip\n");
         }
     trimIpv4MappingPrefix(ipStr);
     }
 else if (sai->ss_family == AF_INET)  // ipv4
     {
     struct sockaddr_in *sai4 = (struct sockaddr_in *)sai;
     if (inet_ntop(AF_INET, &sai4->sin_addr, ipStr, ipStrSize) < 0)
         {
         errAbort("ntop failed on ip\n");
         }
     }
 else
-   errAbort("unknown sai->sa_family=%d in getSockSize", sai->ss_family);
+   errAbort("unknown sai->sa_family=%d in getAddrAsString6n4", sai->ss_family);
 }
 
 
 void getAddrAndPortAsString6n4(struct sockaddr_storage *sai, char *ipStr, int ipStrSize, char *portStr, int portStrSize)
 /* convert ip and port to strings based on the socket type */
 {
 if (sai->ss_family == AF_INET6)   //ipv6
     {
     struct sockaddr_in6 *sai6 = (struct sockaddr_in6 *)sai;
     int s = getnameinfo((struct sockaddr *) sai6, getSockSize6n4(sai),
                                ipStr, ipStrSize,
                                portStr, portStrSize, NI_NUMERICSERV | NI_NUMERICHOST);
     if (s != 0)
        errAbort("getnameinfo: %s\n", gai_strerror(s));
     trimIpv4MappingPrefix(ipStr);
     }
 else if (sai->ss_family == AF_INET)  // ipv4
     {
     struct sockaddr_in *sai4 = (struct sockaddr_in *)sai;
     int s = getnameinfo((struct sockaddr *) sai4, getSockSize6n4(sai),
                                ipStr, ipStrSize,
                                portStr, portStrSize, NI_NUMERICSERV | NI_NUMERICHOST);
     if (s != 0)
        errAbort("getnameinfo: %s\n", gai_strerror(s));
     }
 else
-   errAbort("unknown sai->sa_family=%d in getSockSize", sai->ss_family);
+   errAbort("unknown sai->sa_family=%d in getAddrAndPortAsString6n4", sai->ss_family);
 }