]> sjero.net Git - wget/blobdiff - src/init.c
[svn] Applied Christian Fraenkel's patch "custom certificate patch for wget-1.7+dev;
[wget] / src / init.c
index b1169b23d8fd8ecce1b6daa0adbac15e00680de3..321f50d4bf7d63ada9e695b2f6f898c6e989acda 100644 (file)
@@ -1,5 +1,5 @@
 /* Reading/parsing the initialization file.
-   Copyright (C) 1995, 1996, 1997, 1998 Free Software Foundation, Inc.
+   Copyright (C) 1995, 1996, 1997, 1998, 2000 Free Software Foundation, Inc.
 
 This file is part of Wget.
 
@@ -33,6 +33,14 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.  */
 #endif
 #include <errno.h>
 
+#ifdef WINDOWS
+# include <winsock.h>
+#else
+# include <sys/socket.h>
+# include <netinet/in.h>
+# include <arpa/inet.h>
+#endif
+
 #ifdef HAVE_PWD_H
 #include <pwd.h>
 #endif
@@ -52,6 +60,7 @@ extern int errno;
 #define CMD_DECLARE(func) static int func \
   PARAMS ((const char *, const char *, void *))
 
+CMD_DECLARE (cmd_address);
 CMD_DECLARE (cmd_boolean);
 CMD_DECLARE (cmd_bytes);
 CMD_DECLARE (cmd_directory_vector);
@@ -67,7 +76,6 @@ CMD_DECLARE (cmd_spec_dotstyle);
 CMD_DECLARE (cmd_spec_header);
 CMD_DECLARE (cmd_spec_htmlify);
 CMD_DECLARE (cmd_spec_mirror);
-CMD_DECLARE (cmd_spec_outputdocument);
 CMD_DECLARE (cmd_spec_recursive);
 CMD_DECLARE (cmd_spec_useragent);
 
@@ -88,6 +96,7 @@ static struct {
   { "backupconverted", &opt.backup_converted,  cmd_boolean },
   { "backups",         &opt.backups,           cmd_number },
   { "base",            &opt.base_href,         cmd_string },
+  { "bindaddress",     &opt.bind_address,      cmd_address },
   { "cache",           &opt.proxy_cache,       cmd_boolean },
   { "continue",                &opt.always_rest,       cmd_boolean },
   { "convertlinks",    &opt.convert_links,     cmd_boolean },
@@ -113,9 +122,11 @@ static struct {
   { "header",          NULL,                   cmd_spec_header },
   { "htmlextension",   &opt.html_extension,    cmd_boolean },
   { "htmlify",         NULL,                   cmd_spec_htmlify },
+  { "httpkeepalive",   &opt.http_keep_alive,   cmd_boolean },
   { "httppasswd",      &opt.http_passwd,       cmd_string },
   { "httpproxy",       &opt.http_proxy,        cmd_string },
   { "httpuser",                &opt.http_user,         cmd_string },
+  { "httpsproxy",      &opt.https_proxy,       cmd_string },
   { "ignorelength",    &opt.ignore_length,     cmd_boolean },
   { "ignoretags",      &opt.ignore_tags,       cmd_vector },
   { "includedirectories", &opt.includes,       cmd_directory_vector },
@@ -129,7 +140,7 @@ static struct {
   { "noparent",                &opt.no_parent,         cmd_boolean },
   { "noproxy",         &opt.no_proxy,          cmd_vector },
   { "numtries",                &opt.ntry,              cmd_number_inf },/* deprecated*/
-  { "outputdocument",  NULL,                   cmd_spec_outputdocument },
+  { "outputdocument",  &opt.output_document,   cmd_string },
   { "pagerequisites",  &opt.page_requisites,   cmd_boolean },
   { "passiveftp",      &opt.ftp_pasv,          cmd_lockable_boolean },
   { "passwd",          &opt.ftp_pass,          cmd_string },
@@ -150,6 +161,10 @@ static struct {
   { "simplehostcheck", &opt.simple_check,      cmd_boolean },
   { "spanhosts",       &opt.spanhost,          cmd_boolean },
   { "spider",          &opt.spider,            cmd_boolean },
+#ifdef HAVE_SSL
+  { "sslcertfile",     &opt.sslcertfile,       cmd_string },
+  { "sslcertkey",      &opt.sslcertkey,        cmd_string },
+#endif /* HAVE_SSL */
   { "timeout",         &opt.timeout,           cmd_time },
   { "timestamping",    &opt.timestamping,      cmd_boolean },
   { "tries",           &opt.ntry,              cmd_number_inf },
@@ -165,7 +180,7 @@ static struct {
 static int
 comind (const char *com)
 {
-  int min = 0, max = ARRAY_SIZE (commands);
+  int min = 0, max = ARRAY_SIZE (commands) - 1;
 
   do
     {
@@ -205,6 +220,7 @@ defaults (void)
   opt.netrc = 1;
   opt.ftp_glob = 1;
   opt.htmlify = 1;
+  opt.http_keep_alive = 1;
   opt.use_proxy = 1;
   tmp = getenv ("no_proxy");
   if (tmp)
@@ -300,7 +316,7 @@ wgetrc_file_name (void)
     return NULL;
   if (!file_exists_p (file))
     {
-      free (file);
+      xfree (file);
       return NULL;
     }
   return file;
@@ -327,21 +343,18 @@ run_wgetrc (const char *file)
     {
       char *com, *val;
       int status;
-      int length = strlen (line);
 
-      if (length && line[length - 1] == '\r')
-       line[length - 1] = '\0';
       /* Parse the line.  */
       status = parse_line (line, &com, &val);
-      free (line);
+      xfree (line);
       /* If everything is OK, set the value.  */
       if (status == 1)
        {
          if (!setval (com, val))
            fprintf (stderr, _("%s: Error in %s at line %d.\n"), exec_name,
                     file, ln);
-         free (com);
-         free (val);
+         xfree (com);
+         xfree (val);
        }
       else if (status == 0)
        fprintf (stderr, _("%s: Error in %s at line %d.\n"), exec_name,
@@ -382,7 +395,7 @@ initialize (void)
   else
 #endif
     run_wgetrc (file);
-  free (file);
+  xfree (file);
   return;
 }
 \f
@@ -402,12 +415,12 @@ parse_line (const char *line, char **com, char **val)
   const char *orig_comptr, *end;
   char *new_comptr;
 
-  /* Skip spaces.  */
-  while (*p == ' ' || *p == '\t')
+  /* Skip whitespace.  */
+  while (*p && ISSPACE (*p))
     ++p;
 
   /* Don't process empty lines.  */
-  if (!*p || *p == '\n' || *p == '#')
+  if (!*p || *p == '#')
     return -1;
 
   for (orig_comptr = p; ISALPHA (*p) || *p == '_' || *p == '-'; p++)
@@ -415,6 +428,8 @@ parse_line (const char *line, char **com, char **val)
   /* The next char should be space or '='.  */
   if (!ISSPACE (*p) && (*p != '='))
     return 0;
+  /* Here we cannot use strdupdelim() as we normally would because we
+     want to skip the `-' and `_' characters in the input string.  */
   *com = (char *)xmalloc (p - orig_comptr + 1);
   for (new_comptr = *com; orig_comptr < p; orig_comptr++)
     {
@@ -426,7 +441,7 @@ parse_line (const char *line, char **com, char **val)
   /* If the command is invalid, exit now.  */
   if (comind (*com) == -1)
     {
-      free (*com);
+      xfree (*com);
       return 0;
     }
 
@@ -435,15 +450,17 @@ parse_line (const char *line, char **com, char **val)
   /* If '=' not found, bail out.  */
   if (*p != '=')
     {
-      free (*com);
+      xfree (*com);
       return 0;
     }
   /* Skip spaces after '='.  */
   for (++p; ISSPACE (*p); p++);
-  /* Get the ending position.  */
-  for (end = p; *end && *end != '\n'; end++);
-  /* Allocate *val, and copy from line.  */
-  *val = strdupdelim (p, end);
+  /* Get the ending position for VAL by starting with the end of the
+     line and skipping whitespace.  */
+  end = line + strlen (line) - 1;
+  while (end > p && ISSPACE (*end))
+    --end;
+  *val = strdupdelim (p, end + 1);
   return 1;
 }
 
@@ -475,6 +492,28 @@ setval (const char *com, const char *val)
 
 static int myatoi PARAMS ((const char *s));
 
+/* Store the address (specified as hostname or dotted-quad IP address) from VAL
+   to CLOSURE.  COM is ignored, except for error messages.  */
+static int
+cmd_address (const char *com, const char *val, void *closure)
+{
+  struct sockaddr_in sin;
+
+  if (!store_hostaddress ((unsigned char *)&sin.sin_addr, val))
+    {
+      fprintf (stderr, _("%s: %s: Cannot convert `%s' to an IP address.\n"),
+              exec_name, com, val);
+      return 0;
+    }
+
+  sin.sin_family = AF_INET;
+  sin.sin_port = 0;
+
+  memcpy (closure, &sin, sizeof (sin));
+
+  return 1;
+}
+
 /* Store the boolean value from VAL to CLOSURE.  COM is ignored,
    except for error messages.  */
 static int
@@ -876,15 +915,6 @@ cmd_spec_mirror (const char *com, const char *val, void *closure)
   return 1;
 }
 
-static int
-cmd_spec_outputdocument (const char *com, const char *val, void *closure)
-{
-  FREE_MAYBE (opt.output_document);
-  opt.output_document = xstrdup (val);
-  opt.ntry = 1;
-  return 1;
-}
-
 static int
 cmd_spec_recursive (const char *com, const char *val, void *closure)
 {
@@ -949,6 +979,10 @@ check_user_specified_header (const char *s)
   return 1;
 }
 \f
+void cleanup_html_url PARAMS ((void));
+void downloaded_files_free PARAMS ((void));
+
+
 /* Free the memory allocated by global variables.  */
 void
 cleanup (void)
@@ -960,8 +994,10 @@ cleanup (void)
   free_netrc (netrc_list);
   if (opt.dfp)
     fclose (opt.dfp);
+  cleanup_html_url ();
+  downloaded_files_free ();
   FREE_MAYBE (opt.lfilename);
-  free (opt.dir_prefix);
+  xfree (opt.dir_prefix);
   FREE_MAYBE (opt.input_filename);
   FREE_MAYBE (opt.output_document);
   free_vec (opt.accepts);
@@ -971,9 +1007,10 @@ cleanup (void)
   free_vec (opt.domains);
   free_vec (opt.follow_tags);
   free_vec (opt.ignore_tags);
-  free (opt.ftp_acc);
-  free (opt.ftp_pass);
+  xfree (opt.ftp_acc);
+  FREE_MAYBE (opt.ftp_pass);
   FREE_MAYBE (opt.ftp_proxy);
+  FREE_MAYBE (opt.https_proxy);
   FREE_MAYBE (opt.http_proxy);
   free_vec (opt.no_proxy);
   FREE_MAYBE (opt.useragent);
@@ -981,4 +1018,8 @@ cleanup (void)
   FREE_MAYBE (opt.http_user);
   FREE_MAYBE (opt.http_passwd);
   FREE_MAYBE (opt.user_header);
+#ifdef HAVE_SSL
+  FREE_MAYBE (opt.sslcertkey);
+  FREE_MAYBE (opt.sslcertfile);
+#endif /* HAVE_SSL */
 }