From: Sasikantha Babu Date: Sun, 8 Jan 2012 23:03:23 +0000 (+0100) Subject: Properly format IPv6 addresses. X-Git-Tag: v1.14~64 X-Git-Url: http://sjero.net/git/?p=wget;a=commitdiff_plain;h=5e1badae1e595b378f039f4a6b09f6e44767a37a Properly format IPv6 addresses. --- diff --git a/src/ChangeLog b/src/ChangeLog index 8db453b0..e58decb5 100644 --- a/src/ChangeLog +++ b/src/ChangeLog @@ -1,3 +1,8 @@ +2012-01-09 Sasikantha Babu (tiny change) + * connect.c (connect_to_ip): properly formatted ipv6 address display. + (socket_family): New function - returns socket family type. + * http.c (gethttp): properly formatted ipv6 address display. + 2011-11-09 Gijs van Tulder * warc.c: Call gzdopen() with wb9 instead of wb+9, which fails on diff --git a/src/connect.c b/src/connect.c index 6008c3c2..34b40abc 100644 --- a/src/connect.c +++ b/src/connect.c @@ -298,7 +298,12 @@ connect_to_ip (const ip_address *ip, int port, const char *print) 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); + else if (ip->family == AF_INET6) + logprintf (LOG_VERBOSE, _("Connecting to [%s]:%d... "), txt_addr, port); + } } /* Store the sockaddr info to SA. */ @@ -586,6 +591,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 diff --git a/src/connect.h b/src/connect.h index 20bb2439..bb3f26a7 100644 --- a/src/connect.h +++ b/src/connect.h @@ -51,6 +51,7 @@ enum { ENDPOINT_PEER }; bool socket_ip_address (int, ip_address *, int); +int socket_family (int sock, int endpoint); bool retryable_socket_connect_error (int); diff --git a/src/http.c b/src/http.c index 6a2ffe86..69789fcd 100644 --- a/src/http.c +++ b/src/http.c @@ -1951,11 +1951,17 @@ gethttp (struct url *u, struct http_stat *hs, int *dt, struct url *proxy, #endif &host_lookup_failed)) { + int family = socket_family (pconn.socket, ENDPOINT_PEER); sock = pconn.socket; using_ssl = pconn.ssl; - logprintf (LOG_VERBOSE, _("Reusing existing connection to %s:%d.\n"), - quotearg_style (escape_quoting_style, pconn.host), - pconn.port); + if (family == AF_INET6) + logprintf (LOG_VERBOSE, _("Reusing existing connection to [%s]:%d.\n"), + quotearg_style (escape_quoting_style, pconn.host), + pconn.port); + else + logprintf (LOG_VERBOSE, _("Reusing existing connection to %s:%d.\n"), + quotearg_style (escape_quoting_style, pconn.host), + pconn.port); DEBUGP (("Reusing fd %d.\n", sock)); if (pconn.authorized) /* If the connection is already authorized, the "Basic"