X-Git-Url: http://sjero.net/git/?p=wget;a=blobdiff_plain;f=src%2Fhost.c;h=86bf83b3dfe04ccb6abcfeaa7ea5656248691ae0;hp=fdb35b1cad2bc92c5fa935eb2f7f5fbdfcbea493;hb=HEAD;hpb=2e2ac6ad2fc90eaf46ae5fee0bc4f61dd97b4284 diff --git a/src/host.c b/src/host.c index fdb35b1c..86bf83b3 100644 --- a/src/host.c +++ b/src/host.c @@ -1,6 +1,7 @@ /* Host name resolution and matching. - Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, - 2004, 2005, 2006, 2007, 2008 Free Software Foundation, Inc. + Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, + 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012 Free Software Foundation, + Inc. This file is part of GNU Wget. @@ -36,14 +37,21 @@ as that of the covered work. */ #include #ifndef WINDOWS +# include # include # include # ifndef __BEOS__ # include # endif -# include +# ifdef __VMS +# include "vms_ip.h" +# else /* def __VMS */ +# include +# endif /* def __VMS [else] */ # define SET_H_ERRNO(err) ((void)(h_errno = (err))) #else /* WINDOWS */ +# include +# include # define SET_H_ERRNO(err) WSASetLastError (err) #endif /* WINDOWS */ @@ -58,6 +66,11 @@ as that of the covered work. */ # define NO_ADDRESS NO_DATA #endif +#if !HAVE_DECL_H_ERRNO && !defined(WINDOWS) +extern int h_errno; +#endif + + /* Lists of IP addresses that result from running DNS queries. See lookup_host for details. */ @@ -192,7 +205,7 @@ address_list_from_addrinfo (const struct addrinfo *ai) ip = al->addresses; for (ptr = ai; ptr != NULL; ptr = ptr->ai_next) - if (ptr->ai_family == AF_INET6) + if (ptr->ai_family == AF_INET6) { const struct sockaddr_in6 *sin6 = (const struct sockaddr_in6 *)ptr->ai_addr; @@ -202,7 +215,7 @@ address_list_from_addrinfo (const struct addrinfo *ai) ip->ipv6_scope = sin6->sin6_scope_id; #endif ++ip; - } + } else if (ptr->ai_family == AF_INET) { const struct sockaddr_in *sin = @@ -335,7 +348,7 @@ gethostbyname_with_timeout (const char *host_name, double timeout) } /* Print error messages for host errors. */ -static char * +static const char * host_errstr (int error) { /* Can't use switch since some of these constants can be equal, @@ -452,7 +465,7 @@ is_valid_ipv4_address (const char *str, const char *end) } if (octets < 4) return false; - + return true; } @@ -477,7 +490,7 @@ is_valid_ipv6_address (const char *str, const char *end) if (str == end) return false; - + /* Leading :: requires some special handling. */ if (*str == ':') { @@ -534,20 +547,20 @@ is_valid_ipv6_address (const char *str, const char *end) saw_xdigit = false; break; } - + return false; } if (saw_xdigit) { - if (tp > ns_in6addrsz - ns_int16sz) + if (tp > ns_in6addrsz - ns_int16sz) return false; tp += ns_int16sz; } if (colonp != NULL) { - if (tp == ns_in6addrsz) + if (tp == ns_in6addrsz) return false; tp = ns_in6addrsz; } @@ -712,8 +725,24 @@ lookup_host (const char *host, int flags) /* No luck with the cache; resolve HOST. */ if (!silent && !numeric_address) - logprintf (LOG_VERBOSE, _("Resolving %s... "), - quotearg_style (escape_quoting_style, host)); + { + char *str = NULL, *name; + + if (opt.enable_iri && (name = idn_decode ((char *) host)) != NULL) + { + int len = strlen (host) + strlen (name) + 4; + str = xmalloc (len); + snprintf (str, len, "%s (%s)", name, host); + str[len-1] = '\0'; + xfree (name); + } + + logprintf (LOG_VERBOSE, _("Resolving %s... "), + quotearg_style (escape_quoting_style, str ? str : host)); + + if (str) + xfree (str); + } #ifdef ENABLE_IPV6 { @@ -793,11 +822,15 @@ lookup_host (const char *host, int flags) #endif /* not ENABLE_IPV6 */ /* Print the addresses determined by DNS lookup, but no more than - three. */ + three if show_all_dns_entries is not specified. */ if (!silent && !numeric_address) { int i; - int printmax = al->count <= 3 ? al->count : 3; + int printmax = al->count; + + if (!opt.show_all_dns_entries && printmax > 3) + printmax = 3; + for (i = 0; i < printmax; i++) { logputs (LOG_VERBOSE, print_address (al->addresses + i)); @@ -848,6 +881,9 @@ sufmatch (const char **list, const char *what) lw = strlen (what); for (i = 0; list[i]; i++) { + if (list[i][0] == '\0') + continue; + for (j = strlen (list[i]), k = lw; j >= 0 && k >= 0; j--, k--) if (c_tolower (list[i][j]) != c_tolower (what[k])) break; @@ -878,3 +914,18 @@ host_cleanup (void) host_name_addresses_map = NULL; } } + +bool +is_valid_ip_address (const char *name) +{ + const char *endp; + + endp = name + strlen(name); + if (is_valid_ipv4_address (name, endp)) + return true; +#ifdef ENABLE_IPV6 + if (is_valid_ipv6_address (name, endp)) + return true; +#endif + return false; +}