]> sjero.net Git - wget/blobdiff - src/init.c
[svn] Commit IPv6 support by Thomas Lussnig.
[wget] / src / init.c
index 38918f4643a7b0ee4a66b796150d2093bc5753f1..20bbc6a29ccb06f8de6e00210ecdc508eec7daab 100644 (file)
@@ -54,6 +54,7 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.  */
 #include "recur.h"
 #include "netrc.h"
 #include "cookies.h"           /* for cookies_cleanup */
+#include "progress.h"
 
 #ifndef errno
 extern int errno;
@@ -78,6 +79,7 @@ CMD_DECLARE (cmd_number);
 CMD_DECLARE (cmd_number_inf);
 CMD_DECLARE (cmd_string);
 CMD_DECLARE (cmd_file);
+CMD_DECLARE (cmd_directory);
 CMD_DECLARE (cmd_time);
 CMD_DECLARE (cmd_vector);
 
@@ -85,7 +87,7 @@ CMD_DECLARE (cmd_spec_dirstruct);
 CMD_DECLARE (cmd_spec_header);
 CMD_DECLARE (cmd_spec_htmlify);
 CMD_DECLARE (cmd_spec_mirror);
-/*CMD_DECLARE (cmd_spec_progress);*/
+CMD_DECLARE (cmd_spec_progress);
 CMD_DECLARE (cmd_spec_recursive);
 CMD_DECLARE (cmd_spec_useragent);
 
@@ -116,12 +118,13 @@ static struct {
   { "debug",           &opt.debug,             cmd_boolean },
 #endif
   { "deleteafter",     &opt.delete_after,      cmd_boolean },
-  { "dirprefix",       &opt.dir_prefix,        cmd_file },
+  { "dirprefix",       &opt.dir_prefix,        cmd_directory },
   { "dirstruct",       NULL,                   cmd_spec_dirstruct },
   { "domains",         &opt.domains,           cmd_vector },
   { "dotbytes",                &opt.dot_bytes,         cmd_bytes },
   { "dotsinline",      &opt.dots_in_line,      cmd_number },
   { "dotspacing",      &opt.dot_spacing,       cmd_number },
+  { "dotstyle",                &opt.dot_style,         cmd_string },
   { "excludedirectories", &opt.excludes,       cmd_directory_vector },
   { "excludedomains",  &opt.exclude_domains,   cmd_vector },
   { "followftp",       &opt.follow_ftp,        cmd_boolean },
@@ -142,6 +145,7 @@ static struct {
   { "includedirectories", &opt.includes,       cmd_directory_vector },
   { "input",           &opt.input_filename,    cmd_file },
   { "killlonger",      &opt.kill_longer,       cmd_boolean },
+  { "limitrate",       &opt.limit_rate,        cmd_bytes },
   { "loadcookies",     &opt.cookies_input,     cmd_file },
   { "logfile",         &opt.lfilename,         cmd_file },
   { "login",           &opt.ftp_acc,           cmd_string },
@@ -155,7 +159,7 @@ static struct {
   { "pagerequisites",  &opt.page_requisites,   cmd_boolean },
   { "passiveftp",      &opt.ftp_pasv,          cmd_lockable_boolean },
   { "passwd",          &opt.ftp_pass,          cmd_string },
-  { "progress",                &opt.progress_type,     cmd_string },
+  { "progress",                &opt.progress_type,     cmd_spec_progress },
   { "proxypasswd",     &opt.proxy_passwd,      cmd_string },
   { "proxyuser",       &opt.proxy_user,        cmd_string },
   { "quiet",           &opt.quiet,             cmd_boolean },
@@ -177,6 +181,7 @@ static struct {
 #ifdef HAVE_SSL
   { "sslcertfile",     &opt.sslcertfile,       cmd_file },
   { "sslcertkey",      &opt.sslcertkey,        cmd_file },
+  { "egdfile",         &opt.sslegdsock,        cmd_file },
 #endif /* HAVE_SSL */
   { "timeout",         &opt.timeout,           cmd_time },
   { "timestamping",    &opt.timestamping,      cmd_boolean },
@@ -297,7 +302,7 @@ wgetrc_file_name (void)
     {
       if (!file_exists_p (env))
        {
-         fprintf (stderr, "%s: %s: %s.\n", exec_name, file, strerror (errno));
+         fprintf (stderr, "%s: %s: %s.\n", exec_name, env, strerror (errno));
          exit (1);
        }
       return xstrdup (env);
@@ -522,10 +527,10 @@ static int
 cmd_address (const char *com, const char *val, void *closure)
 {
   struct address_list *al;
-  struct sockaddr_in sin;
-  struct sockaddr_in **target = (struct sockaddr_in **)closure;
+  wget_sockaddr sa;
+  wget_sockaddr **target = (wget_sockaddr **)closure;
 
-  memset (&sin, '\0', sizeof (sin));
+  memset (&sa, '\0', sizeof (sa));
 
   al = lookup_host (val, 1);
   if (!al)
@@ -534,16 +539,15 @@ cmd_address (const char *com, const char *val, void *closure)
               exec_name, com, val);
       return 0;
     }
-  address_list_copy_one (al, 0, (unsigned char *)&sin.sin_addr);
+  sa.sa.sa_family = ip_default_family;
+  wget_sockaddr_set_port (&sa, 0);
+  address_list_copy_one (al, 0, wget_sockaddr_get_addr (&sa));
   address_list_release (al);
 
-  sin.sin_family = AF_INET;
-  sin.sin_port = 0;
-
   FREE_MAYBE (*target);
 
-  *target = xmalloc (sizeof (sin));
-  memcpy (*target, &sin, sizeof (sin));
+  *target = xmalloc (sizeof (sa));
+  memcpy (*target, &sa, sizeof (sa));
 
   return 1;
 }
@@ -667,7 +671,14 @@ cmd_file (const char *com, const char *val, void *closure)
   char **pstring = (char **)closure;
 
   FREE_MAYBE (*pstring);
-  if (!enable_tilde_expansion || !(*val == '~' && *(val + 1) == '/'))
+
+  /* #### If VAL is empty, perhaps should set *CLOSURE to NULL.  */
+
+  if (!enable_tilde_expansion || !(*val == '~' && (*(val + 1) == '/'
+#ifdef WINDOWS
+         || *(val + 1) == '\\'
+#endif
+         )))
     {
     noexpand:
       *pstring = xstrdup (val);
@@ -681,12 +692,21 @@ cmd_file (const char *com, const char *val, void *closure)
        goto noexpand;
 
       homelen = strlen (home);
-      while (homelen && home[homelen - 1] == '/')
+      while (homelen && (home[homelen - 1] == '/'
+#ifdef WINDOWS
+           || home[homelen - 1] == '\\'
+#endif
+           ))
        home[--homelen] = '\0';
 
       /* Skip the leading "~/". */
+#ifdef WINDOWS
+      for (++val; *val == '/' || *val == '\\'; val++)
+       ;
+#else
       for (++val; *val == '/'; val++)
        ;
+#endif
 
       result = xmalloc (homelen + 1 + strlen (val));
       memcpy (result, home, homelen);
@@ -695,6 +715,35 @@ cmd_file (const char *com, const char *val, void *closure)
 
       *pstring = result;
     }
+#ifdef WINDOWS
+  /* Convert "\" to "/". */
+  {
+    char *s;
+    for (s = *pstring; *s; s++)
+      if (*s == '\\')
+       *s = '/';
+  }
+#endif
+  return 1;
+}
+
+/* Like cmd_file, but strips trailing '/' characters.  */
+static int
+cmd_directory (const char *com, const char *val, void *closure)
+{
+  char *s, *t;
+
+  /* Call cmd_file() for tilde expansion and separator
+     canonicalization (backslash -> slash under Windows).  These
+     things should perhaps be in a separate function.  */
+  if (!cmd_file (com, val, closure))
+    return 0;
+
+  s = *(char **)closure;
+  t = s + strlen (s);
+  while (t > s && *--t == '/')
+    *t = '\0';
+
   return 1;
 }
 
@@ -934,7 +983,6 @@ cmd_spec_mirror (const char *com, const char *val, void *closure)
   return 1;
 }
 
-#if 0
 static int
 cmd_spec_progress (const char *com, const char *val, void *closure)
 {
@@ -944,10 +992,13 @@ cmd_spec_progress (const char *com, const char *val, void *closure)
               exec_name, com, val);
       return 0;
     }
-  set_progress_implementation (val);
+  FREE_MAYBE (opt.progress_type);
+
+  /* Don't call set_progress_implementation here.  It will be called
+     in main() when it becomes clear what the log output is.  */
+  opt.progress_type = xstrdup (val);
   return 1;
 }
-#endif
 
 static int
 cmd_spec_recursive (const char *com, const char *val, void *closure)