X-Git-Url: http://sjero.net/git/?p=wget;a=blobdiff_plain;f=src%2Fhost.c;h=11de5944352d91d6b805b8bc00ad832ee8097ca3;hp=0f577e723dca5ff7a9d1e8f965e079f2db6e2e32;hb=4d7c5e087b2bc82c9f503dff003916d1047903ce;hpb=c1fb83c53b27ffd1635fda24702f2a115d939511 diff --git a/src/host.c b/src/host.c index 0f577e72..11de5944 100644 --- a/src/host.c +++ b/src/host.c @@ -1,11 +1,11 @@ /* Host name resolution and matching. - Copyright (C) 1995, 1996, 1997, 2000, 2001 Free Software Foundation, Inc. + Copyright (C) 1996-2006 Free Software Foundation, Inc. This file is part of GNU Wget. GNU Wget is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by -the Free Software Foundation; either version 2 of the License, or +the Free Software Foundation; either version 3 of the License, or (at your option) any later version. GNU Wget is distributed in the hope that it will be useful, @@ -14,8 +14,7 @@ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License -along with Wget; if not, write to the Free Software -Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. +along with Wget. If not, see . In addition, as a special exception, the Free Software Foundation gives permission to link the code of its release of Wget with the @@ -29,10 +28,6 @@ so, delete this exception statement from your version. */ #include -#ifndef WINDOWS -#include -#endif - #include #include #include @@ -57,7 +52,6 @@ so, delete this exception statement from your version. */ #include "host.h" #include "url.h" #include "hash.h" -#include "connect.h" /* for socket_has_inet6 */ #ifndef NO_ADDRESS # define NO_ADDRESS NO_DATA @@ -103,30 +97,27 @@ bool address_list_contains (const struct address_list *al, const ip_address *ip) { int i; - switch (ip->type) + switch (ip->family) { - case IPV4_ADDRESS: + case AF_INET: for (i = 0; i < al->count; i++) { ip_address *cur = al->addresses + i; - if (cur->type == IPV4_ADDRESS - && (ADDRESS_IPV4_IN_ADDR (cur).s_addr - == - ADDRESS_IPV4_IN_ADDR (ip).s_addr)) + if (cur->family == AF_INET + && (cur->data.d4.s_addr == ip->data.d4.s_addr)) return true; } return false; #ifdef ENABLE_IPV6 - case IPV6_ADDRESS: + case AF_INET6: for (i = 0; i < al->count; i++) { ip_address *cur = al->addresses + i; - if (cur->type == IPV6_ADDRESS + if (cur->family == AF_INET6 #ifdef HAVE_SOCKADDR_IN6_SCOPE_ID - && ADDRESS_IPV6_SCOPE (cur) == ADDRESS_IPV6_SCOPE (ip) + && cur->ipv6_scope == ip->ipv6_scope #endif - && IN6_ARE_ADDR_EQUAL (&ADDRESS_IPV6_IN6_ADDR (cur), - &ADDRESS_IPV6_IN6_ADDR (ip))) + && IN6_ARE_ADDR_EQUAL (&cur->data.d6, &ip->data.d6)) return true; } return false; @@ -204,10 +195,10 @@ address_list_from_addrinfo (const struct addrinfo *ai) { const struct sockaddr_in6 *sin6 = (const struct sockaddr_in6 *)ptr->ai_addr; - ip->type = IPV6_ADDRESS; - ADDRESS_IPV6_IN6_ADDR (ip) = sin6->sin6_addr; + ip->family = AF_INET6; + ip->data.d6 = sin6->sin6_addr; #ifdef HAVE_SOCKADDR_IN6_SCOPE_ID - ADDRESS_IPV6_SCOPE (ip) = sin6->sin6_scope_id; + ip->ipv6_scope = sin6->sin6_scope_id; #endif ++ip; } @@ -215,17 +206,17 @@ address_list_from_addrinfo (const struct addrinfo *ai) { const struct sockaddr_in *sin = (const struct sockaddr_in *)ptr->ai_addr; - ip->type = IPV4_ADDRESS; - ADDRESS_IPV4_IN_ADDR (ip) = sin->sin_addr; + ip->family = AF_INET; + ip->data.d4 = sin->sin_addr; ++ip; } assert (ip - al->addresses == cnt); return al; } -#define IS_IPV4(addr) (((const ip_address *) addr)->type == IPV4_ADDRESS) +#define IS_IPV4(addr) (((const ip_address *) addr)->family == AF_INET) -/* Compare two IP addresses by type, giving preference to the IPv4 +/* Compare two IP addresses by family, giving preference to the IPv4 address (sorting it first). In other words, return -1 if ADDR1 is IPv4 and ADDR2 is IPv6, +1 if ADDR1 is IPv6 and ADDR2 is IPv4, and 0 otherwise. @@ -239,7 +230,7 @@ cmp_prefer_ipv4 (const void *addr1, const void *addr2) return !IS_IPV4 (addr1) - !IS_IPV4 (addr2); } -#define IS_IPV6(addr) (((const ip_address *) addr)->type == IPV6_ADDRESS) +#define IS_IPV6(addr) (((const ip_address *) addr)->family == AF_INET6) /* Like the above, but give preference to the IPv6 address. */ @@ -272,8 +263,8 @@ address_list_from_ipv4_addresses (char **vec) for (i = 0; i < count; i++) { ip_address *ip = &al->addresses[i]; - ip->type = IPV4_ADDRESS; - memcpy (ADDRESS_IPV4_DATA (ip), vec[i], 4); + ip->family = AF_INET; + memcpy (IP_INADDR_DATA (ip), vec[i], 4); } return al; @@ -411,26 +402,18 @@ getaddrinfo_with_timeout (const char *node, const char *service, const char * print_address (const ip_address *addr) { - switch (addr->type) - { - case IPV4_ADDRESS: - return inet_ntoa (ADDRESS_IPV4_IN_ADDR (addr)); #ifdef ENABLE_IPV6 - case IPV6_ADDRESS: - { - static char buf[64]; - if (!inet_ntop (AF_INET6, &ADDRESS_IPV6_IN6_ADDR (addr), - buf, sizeof (buf))) - snprintf (buf, sizeof buf, "", strerror (errno)); - buf[sizeof (buf) - 1] = '\0'; - return buf; - } + static char buf[64]; + if (!inet_ntop (addr->family, IP_INADDR_DATA (addr), buf, sizeof buf)) + snprintf (buf, sizeof buf, "", strerror (errno)); + return buf; +#else + return inet_ntoa (addr->data.d4); #endif - } - abort (); } -/* The following two functions were adapted from glibc. */ +/* The following two functions were adapted from glibc's + implementation of inet_pton, written by Paul Vixie. */ static bool is_valid_ipv4_address (const char *str, const char *end) @@ -873,26 +856,22 @@ sufmatch (const char **list, const char *what) return false; } -static int -host_cleanup_mapper (void *key, void *value, void *arg_ignored) -{ - struct address_list *al; - - xfree (key); /* host */ - - al = (struct address_list *)value; - assert (al->refcount == 1); - address_list_delete (al); - - return 0; -} - void host_cleanup (void) { if (host_name_addresses_map) { - hash_table_map (host_name_addresses_map, host_cleanup_mapper, NULL); + hash_table_iterator iter; + for (hash_table_iterate (host_name_addresses_map, &iter); + hash_table_iter_next (&iter); + ) + { + char *host = iter.key; + struct address_list *al = iter.value; + xfree (host); + assert (al->refcount == 1); + address_list_delete (al); + } hash_table_destroy (host_name_addresses_map); host_name_addresses_map = NULL; }