]> sjero.net Git - wget/blobdiff - src/connect.c
[svn] Gettext-ize previously missed messages.
[wget] / src / connect.c
index 10f984061a94827e4ef202f8e70f76b1a4ffba24..24dd1faae943341ae3534042585798a8e2c9bc1c 100644 (file)
@@ -171,7 +171,6 @@ sockaddr_size (const struct sockaddr *sa)
 #endif
     default:
       abort ();
-      return 0;                        /* so the compiler shuts up. */
     }
 }
 \f
@@ -283,6 +282,18 @@ connect_to_ip (const ip_address *ip, int port, const char *print)
   if (sock < 0)
     goto err;
 
+#if defined(ENABLE_IPV6) && defined(IPV6_V6ONLY)
+  if (opt.ipv6_only) {
+    int on = 1;
+    /* In case of error, we will go on anyway... */
+    int err = setsockopt (sock, IPPROTO_IPV6, IPV6_V6ONLY, &on, sizeof (on));
+#ifdef ENABLE_DEBUG
+    if (err < 0) 
+      DEBUGP (("Failed setting IPV6_V6ONLY: %s", strerror (errno)));
+#endif
+  }
+#endif
+
   /* For very small rate limits, set the buffer size (and hence,
      hopefully, the kernel's TCP window size) to the per-second limit.
      That way we should never have to sleep for more than 1s between
@@ -333,7 +344,7 @@ connect_to_ip (const ip_address *ip, int port, const char *print)
     if (sock >= 0)
       fd_close (sock);
     if (print)
-      logprintf (LOG_VERBOSE, "failed: %s.\n", strerror (errno));
+      logprintf (LOG_VERBOSE, _("failed: %s.\n"), strerror (errno));
     errno = save_errno;
     return -1;
   }
@@ -548,8 +559,6 @@ socket_ip_address (int sock, ip_address *ip, int endpoint)
     default:
       abort ();
     }
-
-  return 0;
 }
 
 /* Return non-zero if the error from the connect code can be
@@ -585,8 +594,16 @@ retryable_socket_connect_error (int err)
       )
     return 0;
 
-  if (err == ECONNREFUSED && !opt.retry_connrefused)
-    return 0;
+  if (!opt.retry_connrefused)
+    if (err == ECONNREFUSED
+#ifdef ENETUNREACH
+       || err == ENETUNREACH   /* network is unreachable */
+#endif
+#ifdef EHOSTUNREACH
+       || err == EHOSTUNREACH  /* host is unreachable */
+#endif
+       )
+      return 0;
 
   return 1;
 }
@@ -810,6 +827,17 @@ fd_register_transport (int fd, fd_reader_t reader, fd_writer_t writer,
   ++transport_map_modified_tick;
 }
 
+/* Return context of the transport registered with
+   fd_register_transport.  This assumes fd_register_transport was
+   previously called on FD.  */
+
+void *
+fd_transport_context (int fd)
+{
+  struct transport_info *info = hash_table_get (transport_map, (void *) fd);
+  return info->ctx;
+}
+
 /* When fd_read/fd_write are called multiple times in a loop, they should
    remember the INFO pointer instead of fetching it every time.  It is
    not enough to compare FD to LAST_FD because FD might have been