]> sjero.net Git - wget/commitdiff
[svn] Fix some IPv6-related problems.
authorhniksic <devnull@localhost>
Thu, 24 Jan 2002 06:19:35 +0000 (22:19 -0800)
committerhniksic <devnull@localhost>
Thu, 24 Jan 2002 06:19:35 +0000 (22:19 -0800)
Submitted in <sxsg04w6zl6.fsf@florida.arsdigita.de>.

src/ChangeLog
src/host.c

index 75445b27b5699cc7897d5230cc3af5539d7ad7c4..115dba6bd68fd87f1ac1aa0f1d48a0873de37138 100644 (file)
@@ -1,3 +1,11 @@
+2002-01-24  Hrvoje Niksic  <hniksic@arsdigita.com>
+
+       * host.c (lookup_host): Use sizeof(ip4_address) to calculate the
+       offset.
+       (address_list_new): Use map_ipv4_to_ip.
+       (wget_sockaddr_set_address): Convert ADDR to IPv4 before using it
+       in IPv4 context.
+
 2002-01-24  Hrvoje Niksic  <hniksic@arsdigita.com>
 
        * source: Integrated IPv6 support by Thomas Lussnig.
index e9df830d68585b351e078495826a5a458a3279cd..df9655fe015b9e9e3e12b9dc29c326b5a6373b88 100644 (file)
@@ -205,7 +205,7 @@ address_list_new (char **h_addr_list)
   al->refcount  = 1;
 
   for (i = 0; i < count; i++)
-    memcpy (al->addresses + i, h_addr_list[i], sizeof (ip_address));
+    map_ipv4_to_ip ((ip4_address *)h_addr_list[i], al->addresses + i);
 
   return al;
 }
@@ -267,12 +267,16 @@ wget_sockaddr_set_address (wget_sockaddr *sa,
 {
   if (ip_family == AF_INET) 
     {
+      ip4_address addr4;
+      if (!map_ip_to_ipv4 (addr, &addr4))
+       /* should the callers have prevented this? */
+       abort ();
       sa->sin.sin_family = ip_family;
       sa->sin.sin_port = htons (port);
       if (addr == NULL) 
-       memset ((unsigned char*)&sa->sin.sin_addr, 0,    sizeof(ip_address));
+       memset (&sa->sin.sin_addr, 0,      sizeof(ip4_address));
       else      
-       memcpy ((unsigned char*)&sa->sin.sin_addr, addr, sizeof(ip_address));
+       memcpy (&sa->sin.sin_addr, &addr4, sizeof(ip4_address));
       return;
     }
 #ifdef INET6
@@ -281,9 +285,9 @@ wget_sockaddr_set_address (wget_sockaddr *sa,
       sa->sin6.sin6_family = ip_family;
       sa->sin6.sin6_port = htons (port);
       if (addr == NULL) 
-       memset (&sa->sin6.sin6_addr, 0   , sizeof(ip_address));
+       memset (&sa->sin6.sin6_addr, 0   , 16);
       else          
-       memcpy (&sa->sin6.sin6_addr, addr, sizeof(ip_address));
+       memcpy (&sa->sin6.sin6_addr, addr, 16);
       return;
     }
 #endif  
@@ -521,7 +525,7 @@ lookup_host (const char *host, int silent)
         we copy the correct four bytes.  */
       int offset = 0;
 #ifdef WORDS_BIGENDIAN
-      offset = sizeof (unsigned long) - sizeof (ip_address);
+      offset = sizeof (unsigned long) - sizeof (ip4_address);
 #endif
       map_ipv4_to_ip ((ip4_address *)((char *)&addr_ipv4 + offset), &addr);
       return address_list_new_one (&addr);
@@ -548,7 +552,10 @@ lookup_host (const char *host, int silent)
     int err;
 
     memset (&hints, 0, sizeof (hints));
-    hints.ai_family   = PF_UNSPEC;
+    if (ip_default_family == AF_INET)
+      hints.ai_family   = AF_INET;
+    else
+      hints.ai_family   = PF_UNSPEC;
     hints.ai_socktype = SOCK_STREAM;
     err = getaddrinfo (host, NULL, &hints, &ai);