]> sjero.net Git - wget/blobdiff - src/host.c
[svn] Implemented breadth-first retrieval.
[wget] / src / host.c
index 5d5ae211812d4078c7446eaa506d1811da70e1e4..4fb1197b40eeafc9c62f7a90a13d2a9bf364a333 100644 (file)
@@ -1,27 +1,26 @@
 /* Dealing with host names.
    Copyright (C) 1995, 1996, 1997, 2000 Free Software Foundation, Inc.
 
-This file is part of Wget.
+This file is part of GNU Wget.
 
-This program is free software; you can redistribute it and/or modify
+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
 (at your option) any later version.
 
-This program is distributed in the hope that it will be useful,
+GNU Wget is distributed in the hope that it will be useful,
 but WITHOUT ANY WARRANTY; without even the implied warranty of
 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 this program; if not, write to the Free Software
+along with Wget; if not, write to the Free Software
 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.  */
 
 #include <config.h>
 
 #include <stdio.h>
 #include <stdlib.h>
-#include <ctype.h>
 #ifdef HAVE_STRING_H
 # include <string.h>
 #else
@@ -35,10 +34,16 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.  */
 #else
 # include <sys/socket.h>
 # include <netinet/in.h>
+#ifndef __BEOS__
 # include <arpa/inet.h>
+#endif
 # include <netdb.h>
 #endif /* WINDOWS */
 
+#ifndef NO_ADDRESS
+#define NO_ADDRESS NO_DATA
+#endif
+
 #ifdef HAVE_SYS_UTSNAME_H
 # include <sys/utsname.h>
 #endif
@@ -55,8 +60,14 @@ extern int errno;
 #endif
 
 /* Mapping between all known hosts to their addresses (n.n.n.n). */
+
+/* #### We should map to *lists* of IP addresses. */
+
 struct hash_table *host_name_address_map;
 
+/* The following two tables are obsolete, since we no longer do host
+   canonicalization.  */
+
 /* Mapping between all known addresses (n.n.n.n) to their hosts.  This
    is the inverse of host_name_address_map.  These two tables share
    the strdup'ed strings. */
@@ -65,18 +76,6 @@ struct hash_table *host_address_name_map;
 /* Mapping between auxilliary (slave) and master host names. */
 struct hash_table *host_slave_master_map;
 
-/* Utility function: like xstrdup(), but also lowercases S.  */
-
-static char *
-xstrdup_lower (const char *s)
-{
-  char *copy = xstrdup (s);
-  char *p = copy;
-  for (; *p; p++)
-    *p = TOLOWER (*p);
-  return copy;
-}
-
 /* The same as gethostbyname, but supports internet addresses of the
    form `N.N.N.N'.  On some systems gethostbyname() knows how to do
    this automatically.  */
@@ -211,120 +210,10 @@ store_hostaddress (unsigned char *where, const char *hostname)
   return 1;
 }
 
-/* Determine the "real" name of HOST, as perceived by Wget.  If HOST
-   is referenced by more than one name, "real" name is considered to
-   be the first one encountered in the past.  */
-char *
-realhost (const char *host)
-{
-  struct in_addr in;
-  struct hostent *hptr;
-  char *master_name;
-
-  DEBUGP (("Checking for %s in host_name_address_map.\n", host));
-  if (hash_table_exists (host_name_address_map, host))
-    {
-      DEBUGP (("Found; %s was already used, by that name.\n", host));
-      return xstrdup_lower (host);
-    }
-
-  DEBUGP (("Checking for %s in host_slave_master_map.\n", host));
-  master_name = hash_table_get (host_slave_master_map, host);
-  if (master_name)
-    {
-    has_master:
-      DEBUGP (("Found; %s was already used, by the name %s.\n",
-              host, master_name));
-      return xstrdup (master_name);
-    }
-
-  DEBUGP (("First time I hear about %s by that name; looking it up.\n",
-          host));
-  hptr = ngethostbyname (host);
-  if (hptr)
-    {
-      char *inet_s;
-      /* Originally, we copied to in.s_addr, but it appears to be
-        missing on some systems.  */
-      memcpy (&in, *hptr->h_addr_list, sizeof (in));
-      inet_s = inet_ntoa (in);
-
-      add_host_to_cache (host, inet_s);
-
-      /* add_host_to_cache() can establish a slave-master mapping. */
-      DEBUGP (("Checking again for %s in host_slave_master_map.\n", host));
-      master_name = hash_table_get (host_slave_master_map, host);
-      if (master_name)
-       goto has_master;
-    }
-
-  return xstrdup_lower (host);
-}
-
-/* Compare two hostnames (out of URL-s if the arguments are URL-s),
-   taking care of aliases.  It uses realhost() to determine a unique
-   hostname for each of two hosts.  If simple_check is non-zero, only
-   strcmp() is used for comparison.  */
-int
-same_host (const char *u1, const char *u2)
-{
-  const char *s;
-  char *p1, *p2;
-  char *real1, *real2;
-
-  /* Skip protocol, if present.  */
-  u1 += skip_url (u1);
-  u2 += skip_url (u2);
-  u1 += skip_proto (u1);
-  u2 += skip_proto (u2);
-
-  /* Skip username ans password, if present.  */
-  u1 += skip_uname (u1);
-  u2 += skip_uname (u2);
-
-  for (s = u1; *u1 && *u1 != '/' && *u1 != ':'; u1++);
-  p1 = strdupdelim (s, u1);
-  for (s = u2; *u2 && *u2 != '/' && *u2 != ':'; u2++);
-  p2 = strdupdelim (s, u2);
-  DEBUGP (("Comparing hosts %s and %s...\n", p1, p2));
-  if (strcasecmp (p1, p2) == 0)
-    {
-      xfree (p1);
-      xfree (p2);
-      DEBUGP (("They are quite alike.\n"));
-      return 1;
-    }
-  else if (opt.simple_check)
-    {
-      xfree (p1);
-      xfree (p2);
-      DEBUGP (("Since checking is simple, I'd say they are not the same.\n"));
-      return 0;
-    }
-  real1 = realhost (p1);
-  real2 = realhost (p2);
-  xfree (p1);
-  xfree (p2);
-  if (strcasecmp (real1, real2) == 0)
-    {
-      DEBUGP (("They are alike, after realhost()->%s.\n", real1));
-      xfree (real1);
-      xfree (real2);
-      return 1;
-    }
-  else
-    {
-      DEBUGP (("They are not the same (%s, %s).\n", real1, real2));
-      xfree (real1);
-      xfree (real2);
-      return 0;
-    }
-}
-
 /* Determine whether a URL is acceptable to be followed, according to
    a list of domains to accept.  */
 int
-accept_domain (struct urlinfo *u)
+accept_domain (struct url *u)
 {
   assert (u->host != NULL);
   if (opt.domains)
@@ -363,130 +252,6 @@ sufmatch (const char **list, const char *what)
   return 0;
 }
 
-/* Return email address of the form username@FQDN suitable for
-   anonymous FTP passwords.  This process is error-prone, and the
-   escape hatch is the MY_HOST preprocessor constant, which can be
-   used to hard-code either your hostname or FQDN at compile-time.
-
-   If the FQDN cannot be determined, a warning is printed, and the
-   function returns a short `username@' form, accepted by most
-   anonymous servers.
-
-   The returned string is generated by malloc() and should be freed
-   using free().
-
-   If not even the username cannot be divined, it means things are
-   seriously fucked up, and Wget exits.  */
-char *
-ftp_getaddress (void)
-{
-  static char *address;
-
-  /* Do the drill only the first time, as it won't change.  */
-  if (!address)
-    {
-      char userid[32];         /* 9 should be enough for Unix, but
-                                  I'd rather be on the safe side.  */
-      char *host, *fqdn;
-
-      if (!pwd_cuserid (userid))
-       {
-         logprintf (LOG_ALWAYS, _("%s: Cannot determine user-id.\n"),
-                    exec_name);
-         exit (1);
-       }
-#ifdef MY_HOST
-      STRDUP_ALLOCA (host, MY_HOST);
-#else /* not MY_HOST */
-#ifdef HAVE_UNAME
-      {
-       struct utsname ubuf;
-       if (uname (&ubuf) < 0)
-         {
-           logprintf (LOG_ALWAYS, _("%s: Warning: uname failed: %s\n"),
-                      exec_name, strerror (errno));
-           fqdn = "";
-           goto giveup;
-         }
-       STRDUP_ALLOCA (host, ubuf.nodename);
-      }
-#else /* not HAVE_UNAME */
-#ifdef HAVE_GETHOSTNAME
-      host = alloca (256);
-      if (gethostname (host, 256) < 0)
-       {
-         logprintf (LOG_ALWAYS, _("%s: Warning: gethostname failed\n"),
-                    exec_name);
-         fqdn = "";
-         goto giveup;
-       }
-#else /* not HAVE_GETHOSTNAME */
- #error Cannot determine host name.
-#endif /* not HAVE_GETHOSTNAME */
-#endif /* not HAVE_UNAME */
-#endif /* not MY_HOST */
-      /* If the address we got so far contains a period, don't bother
-         anymore.  */
-      if (strchr (host, '.'))
-       fqdn = host;
-      else
-       {
-         /* #### I've seen the following scheme fail on at least one
-            system!  Do we care?  */
-         char *tmpstore;
-         /* According to Richard Stevens, the correct way to find the
-            FQDN is to (1) find the host name, (2) find its IP
-            address using gethostbyname(), and (3) get the FQDN using
-            gethostbyaddr().  So that's what we'll do.  Step one has
-            been done above.  */
-         /* (2) */
-         struct hostent *hp = gethostbyname (host);
-         if (!hp || !hp->h_addr_list)
-           {
-             logprintf (LOG_ALWAYS, _("\
-%s: Warning: cannot determine local IP address.\n"),
-                        exec_name);
-             fqdn = "";
-             goto giveup;
-           }
-         /* Copy the argument, so the call to gethostbyaddr doesn't
-            clobber it -- just in case.  */
-         tmpstore = (char *)alloca (hp->h_length);
-         memcpy (tmpstore, *hp->h_addr_list, hp->h_length);
-         /* (3) */
-         hp = gethostbyaddr (tmpstore, hp->h_length, hp->h_addrtype);
-         if (!hp || !hp->h_name)
-           {
-             logprintf (LOG_ALWAYS, _("\
-%s: Warning: cannot reverse-lookup local IP address.\n"),
-                        exec_name);
-             fqdn = "";
-             goto giveup;
-           }
-         if (!strchr (hp->h_name, '.'))
-           {
-#if 0
-             /* This gets ticked pretty often.  Karl Berry reports
-                 that there can be valid reasons for the local host
-                 name not to be an FQDN, so I've decided to remove the
-                 annoying warning.  */
-             logprintf (LOG_ALWAYS, _("\
-%s: Warning: reverse-lookup of local address did not yield FQDN!\n"),
-                      exec_name);
-#endif
-             fqdn = "";
-             goto giveup;
-           }
-         /* Once we're here, hp->h_name contains the correct FQDN.  */
-         STRDUP_ALLOCA (fqdn, hp->h_name);
-       }
-    giveup:
-      address = (char *)xmalloc (strlen (userid) + 1 + strlen (fqdn) + 1);
-      sprintf (address, "%s@%s", userid, fqdn);
-    }
-  return address;
-}
-
 /* Print error messages for host errors.  */
 char *
 herrmsg (int error)
@@ -504,7 +269,7 @@ herrmsg (int error)
 }
 
 void
-clean_hosts (void)
+host_cleanup (void)
 {
   /* host_name_address_map and host_address_name_map share the
      strings.  Because of that, calling free_keys_and_values once