X-Git-Url: http://sjero.net/git/?p=wget;a=blobdiff_plain;f=src%2Fconnect.c;h=1e4a44bae3d8d98e12b6efaffc195feb7e650ac0;hp=e12c049a11002e5a432f1758e1db7befe4ddf3ba;hb=HEAD;hpb=4a685764a845d5c74a76fcb49a4671f055b8d5f4 diff --git a/src/connect.c b/src/connect.c index e12c049a..1e4a44ba 100644 --- a/src/connect.c +++ b/src/connect.c @@ -53,9 +53,7 @@ as that of the covered work. */ #include #include -#ifdef HAVE_SYS_TIME_H -# include -#endif +#include #include "utils.h" #include "host.h" #include "connect.h" @@ -275,7 +273,7 @@ connect_to_ip (const ip_address *ip, int port, const char *print) const char *txt_addr = print_address (ip); if (0 != strcmp (print, txt_addr)) { - char *str = NULL, *name; + char *str = NULL, *name; if (opt.enable_iri && (name = idn_decode ((char *) print)) != NULL) { @@ -289,11 +287,18 @@ connect_to_ip (const ip_address *ip, int port, const char *print) logprintf (LOG_VERBOSE, _("Connecting to %s|%s|:%d... "), str ? str : escnonprint_uri (print), txt_addr, port); - if (str) - xfree (str); + if (str) + xfree (str); } else - logprintf (LOG_VERBOSE, _("Connecting to %s:%d... "), txt_addr, port); + { + if (ip->family == AF_INET) + logprintf (LOG_VERBOSE, _("Connecting to %s:%d... "), txt_addr, port); +#ifdef ENABLE_IPV6 + else if (ip->family == AF_INET6) + logprintf (LOG_VERBOSE, _("Connecting to [%s]:%d... "), txt_addr, port); +#endif + } } /* Store the sockaddr info to SA. */ @@ -554,6 +559,7 @@ socket_ip_address (int sock, ip_address *ip, int endpoint) if (ret < 0) return false; + memset(ip, 0, sizeof(ip_address)); ip->family = sockaddr->sa_family; switch (sockaddr->sa_family) { @@ -581,6 +587,36 @@ socket_ip_address (int sock, ip_address *ip, int endpoint) } } +/* Get the socket family of connection on FD and store + Return family type on success, -1 otherwise. + + If ENDPOINT is ENDPOINT_LOCAL, it returns the sock family of the local + (client) side of the socket. Else if ENDPOINT is ENDPOINT_PEER, it + returns the sock family of the remote (peer's) side of the socket. */ + +int +socket_family (int sock, int endpoint) +{ + struct sockaddr_storage storage; + struct sockaddr *sockaddr = (struct sockaddr *) &storage; + socklen_t addrlen = sizeof (storage); + int ret; + + memset (sockaddr, 0, addrlen); + + if (endpoint == ENDPOINT_LOCAL) + ret = getsockname (sock, sockaddr, &addrlen); + else if (endpoint == ENDPOINT_PEER) + ret = getpeername (sock, sockaddr, &addrlen); + else + abort (); + + if (ret < 0) + return -1; + + return sockaddr->sa_family; +} + /* Return true if the error from the connect code can be considered retryable. Wget normally retries after errors, but the exception are the "unsupported protocol" type errors (possible on IPv4/IPv6