diff -r -u wget-1.9.1/src/connect.c wget-1.9.1-patch1/src/connect.c
--- wget-1.9.1/src/connect.c	2003-11-01 23:08:22.000000000 +0900
+++ wget-1.9.1-patch1/src/connect.c	2005-02-01 13:52:46.328125000 +0900
@@ -170,7 +170,7 @@
     }
 
   /* Make an internet socket, stream type.  */
-  sock = socket (ip_default_family, SOCK_STREAM, 0);
+  sock = socket (sa.sa.sa_family, SOCK_STREAM, 0);
   if (sock < 0)
     goto out;
 
@@ -197,7 +197,7 @@
       /* Bind the client side to the requested address. */
       wget_sockaddr bsa;
       wget_sockaddr_set_address (&bsa, ip_default_family, 0, &bind_address);
-      if (bind (sock, &bsa.sa, sockaddr_len ()))
+      if (bind (sock, &bsa.sa, sockaddr_len_sa (&bsa)))
 	{
 	  CLOSE (sock);
 	  sock = -1;
@@ -206,7 +206,7 @@
     }
 
   /* Connect the socket to the remote host.  */
-  if (connect_with_timeout (sock, &sa.sa, sockaddr_len (),
+  if (connect_with_timeout (sock, &sa.sa, sockaddr_len_sa (&sa),
 			    opt.connect_timeout) < 0)
     {
       CLOSE (sock);
@@ -318,7 +318,7 @@
   resolve_bind_address ();
   wget_sockaddr_set_address (&srv, ip_default_family, htons (*port),
 			     bind_address_resolved ? &bind_address : NULL);
-  if (bind (msock, &srv.sa, sockaddr_len ()) < 0)
+  if (bind (msock, &srv.sa, sockaddr_len_sa (&srv)) < 0)
     {
       CLOSE (msock);
       msock = -1;
@@ -327,7 +327,7 @@
   DEBUGP (("Master socket fd %d bound.\n", msock));
   if (!*port)
     {
-      socklen_t sa_len = sockaddr_len ();
+      socklen_t sa_len = sockaddr_len_sa (&srv);
       if (getsockname (msock, &srv.sa, &sa_len) < 0)
 	{
 	  CLOSE (msock);
diff -r -u wget-1.9.1/src/host.c wget-1.9.1-patch1/src/host.c
--- wget-1.9.1/src/host.c	2003-10-26 10:38:25.000000000 +0900
+++ wget-1.9.1-patch1/src/host.c	2005-02-01 13:41:58.656250000 +0900
@@ -60,6 +60,10 @@
 #define NO_ADDRESS NO_DATA
 #endif
 
+#if EAI_SYSTEM + 0 == 0
+#define EAI_SYSTEM -11
+#endif
+
 #ifdef HAVE_SYS_UTSNAME_H
 # include <sys/utsname.h>
 #endif
@@ -300,8 +304,20 @@
 #ifdef ENABLE_IPV6
   if (ip_family == AF_INET6) 
     {
+	  ip4_address addr4;
+	  if (map_ip_to_ipv4 (addr, &addr4))
+	  {
+	  	 /* avoid using v4-mapped address */
+         sa->sin.sin_family = AF_INET;
+         sa->sin.sin_port = htons (port);
+	     memcpy (&sa->sin.sin_addr, &addr4, sizeof(ip4_address));
+	     return;
+	  }
+
       sa->sin6.sin6_family = ip_family;
       sa->sin6.sin6_port = htons (port);
+      sa->sin6.sin6_flowinfo = 0;
+      sa->sin6.sin6_scope_id = 0;
       if (addr == NULL) 
 	memset (&sa->sin6.sin6_addr, 0   , 16);
       else	     
@@ -436,6 +452,31 @@
 }
 
 /**
+  * sockaddr_len_sa
+  *
+  * Same as sock_addr_len, but takes an argument to check the length.
+  *
+  * Input:
+  * -		Pointer to the wget_sockaddr structure
+  *
+  * Output:
+  * socklen_t	structure length for socket options
+  */
+socklen_t
+sockaddr_len_sa (wget_sockaddr *sa) 
+{
+  if (sa->sa.sa_family == AF_INET) 
+    return sizeof (struct sockaddr_in);
+#ifdef ENABLE_IPV6
+  if (sa->sa.sa_family == AF_INET6) 
+    return sizeof (struct sockaddr_in6);
+#endif
+  abort();
+  /* do not complain about return nothing */
+  return 0;
+}
+
+/**
   * Map an IPv4 adress to the internal adress format.
   */
 void 
diff -r -u wget-1.9.1/src/host.h wget-1.9.1-patch1/src/host.h
--- wget-1.9.1/src/host.h	2003-10-11 10:39:07.000000000 +0900
+++ wget-1.9.1-patch1/src/host.h	2005-02-01 13:35:06.671875000 +0900
@@ -98,6 +98,7 @@
 void *wget_sockaddr_get_addr PARAMS((wget_sockaddr *));
 unsigned short wget_sockaddr_get_port PARAMS((const wget_sockaddr *));
 socklen_t sockaddr_len PARAMS(());
+socklen_t sockaddr_len_sa PARAMS((wget_sockaddr *));
 void map_ipv4_to_ip PARAMS((ip4_address *, ip_address *));
 int  map_ip_to_ipv4 PARAMS((ip_address *, ip4_address *));
  
