* http.c (connect_server): Try all A records for names with multiple
authorDavid Shaw <dshaw@jabberwocky.com>
Tue, 24 Sep 2002 21:06:20 +0000 (21:06 +0000)
committerDavid Shaw <dshaw@jabberwocky.com>
Tue, 24 Sep 2002 21:06:20 +0000 (21:06 +0000)
addresses until one answers (not MINGW32).

util/ChangeLog
util/http.c

index 1b87ec0..be623cf 100644 (file)
@@ -1,3 +1,8 @@
+2002-09-24  David Shaw  <dshaw@jabberwocky.com>
+
+       * http.c (connect_server): Try all A records for names with
+       multiple addresses until one answers (not MINGW32).
+
 2002-09-16  Werner Koch  <wk@gnupg.org>
 
        * w32reg.c (read_w32_registry_string): Fallback to HLM.
index 23556b7..7f356bc 100644 (file)
@@ -756,6 +756,7 @@ connect_server( const char *server, ushort port )
 #else
     struct sockaddr_in addr;
     struct hostent *host;
+    int i=0;
 
     addr.sin_family = AF_INET;
     addr.sin_port = htons(port);
@@ -763,16 +764,28 @@ connect_server( const char *server, ushort port )
     if( !host )
         return -1;
 
-    addr.sin_addr = *(struct in_addr*)host->h_addr;
-
     sd = socket(AF_INET, SOCK_STREAM, 0);
     if( sd == -1 )
        return -1;
 
-    if( connect( sd, (struct sockaddr *)&addr, sizeof addr) == -1 ) {
+    /* Try all A records until one responds. TODO: do this on the
+       MINGW32 side as well. */
+    do
+      {
+       addr.sin_addr = *(struct in_addr*)host->h_addr_list[i];
+       if(connect( sd, (struct sockaddr *)&addr, sizeof addr) == 0)
+         break;
+
+       i++;
+      }
+    while(addr.sin_addr.s_addr!=0);
+
+    if(addr.sin_addr.s_addr==0)
+      {
        sock_close(sd);
        return -1;
-    }
+      }
+
 #endif
     return sd;
 }