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;
}