]> sjero.net Git - wget/blobdiff - src/main.c
[svn] Improvements/fixes to HTTP Content-Disposition header support.
[wget] / src / main.c
index ec8ed32576aeb125d766f6a149cd16f19ad86ede..1f3fb25a2172f90de209b9dc31e6807482611766 100644 (file)
@@ -1,5 +1,5 @@
 /* Command line parsing.
-   Copyright (C) 2003, 2004, 2005 Free Software Foundation, Inc.
+   Copyright (C) 1996-2005 Free Software Foundation, Inc.
 
 This file is part of GNU Wget.
 
@@ -14,8 +14,8 @@ 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, write to the Free Software Foundation, Inc.,
+51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
 
 In addition, as a special exception, the Free Software Foundation
 gives permission to link the code of its release of Wget with the
@@ -36,7 +36,7 @@ so, delete this exception statement from your version.  */
 #endif /* HAVE_UNISTD_H */
 #include <string.h>
 #include <signal.h>
-#if defined(HAVE_NLS) && defined(HAVE_LOCALE_H)
+#ifdef HAVE_NLS
 # include <locale.h>
 #endif
 #include <assert.h>
@@ -51,6 +51,7 @@ so, delete this exception statement from your version.  */
 #include "url.h"
 #include "progress.h"          /* for progress_handle_sigwinch */
 #include "convert.h"
+#include "http.h"              /* for save_cookies */
 
 /* On GNU system this will include system-wide getopt.h. */
 #include "getopt.h"
@@ -61,12 +62,11 @@ so, delete this exception statement from your version.  */
 
 struct options opt;
 
-extern LARGE_INT total_downloaded_bytes;
 extern char *version_string;
 
-extern struct cookie_jar *wget_cookie_jar;
-
+#if defined(SIGHUP) || defined(SIGUSR1)
 static void redirect_output_signal (int);
+#endif
 
 const char *exec_name;
 \f
@@ -80,20 +80,7 @@ i18n_initialize (void)
   /* HAVE_NLS implies existence of functions invoked here.  */
 #ifdef HAVE_NLS
   /* Set the current locale.  */
-  /* Where possible, sets only LC_MESSAGES and LC_CTYPE.  Other
-     categories, such as numeric, time, or collation, break code that
-     parses data received from the network and relies on C-locale
-     behavior of libc functions.  For example, Solaris strptime fails
-     to recognize English month names in non-English locales, which
-     breaks http_atotm.  Some implementations of fnmatch perform
-     unwanted case folding in non-C locales.  ctype macros, while they
-     were used, provided another example against LC_ALL.  */
-#if defined(LC_MESSAGES) && defined(LC_CTYPE)
-  setlocale (LC_MESSAGES, "");
-  setlocale (LC_CTYPE, "");    /* safe because we use safe-ctype */
-#else
   setlocale (LC_ALL, "");
-#endif
   /* Set the text message domain.  */
   bindtextdomain ("wget", LOCALEDIR);
   textdomain ("wget");
@@ -137,7 +124,7 @@ struct cmdline_option {
   int argtype;                 /* for non-standard options */
 };
 
-struct cmdline_option option_data[] =
+static struct cmdline_option option_data[] =
   {
     { "accept", 'A', OPT_VALUE, "accept", -1 },
     { "append-output", 'a', OPT__APPEND_OUTPUT, NULL, required_argument },
@@ -156,6 +143,7 @@ struct cmdline_option option_data[] =
     { "connect-timeout", 0, OPT_VALUE, "connecttimeout", -1 },
     { "continue", 'c', OPT_BOOLEAN, "continue", -1 },
     { "convert-links", 'k', OPT_BOOLEAN, "convertlinks", -1 },
+    { "content-disposition", 0, OPT_BOOLEAN, "contentdisposition", -1 },
     { "cookies", 0, OPT_BOOLEAN, "cookies", -1 },
     { "cut-dirs", 0, OPT_VALUE, "cutdirs", -1 },
     { WHEN_DEBUG ("debug"), 'd', OPT_BOOLEAN, "debug", -1 },
@@ -187,6 +175,7 @@ struct cmdline_option option_data[] =
     { "http-passwd", 0, OPT_VALUE, "httppassword", -1 }, /* deprecated */
     { "http-password", 0, OPT_VALUE, "httppassword", -1 },
     { "http-user", 0, OPT_VALUE, "httpuser", -1 },
+    { "ignore-case", 0, OPT_BOOLEAN, "ignorecase", -1 },
     { "ignore-length", 0, OPT_BOOLEAN, "ignorelength", -1 },
     { "ignore-tags", 0, OPT_VALUE, "ignoretags", -1 },
     { "include-directories", 'I', OPT_VALUE, "includedirectories", -1 },
@@ -459,6 +448,8 @@ Download:\n"),
        --no-dns-cache            disable caching DNS lookups.\n"),
     N_("\
        --restrict-file-names=OS  restrict chars in file names to ones OS allows.\n"),
+    N_("\
+       --ignore-case             ignore case when matching files/directories.\n"),
 #ifdef ENABLE_IPV6
     N_("\
   -4,  --inet4-only              connect only to IPv4 addresses.\n"),
@@ -528,6 +519,8 @@ HTTP options:\n"),
        --post-data=STRING      use the POST method; send STRING as the data.\n"),
     N_("\
        --post-file=FILE        use the POST method; send contents of FILE.\n"),
+    N_("\
+       --no-content-disposition  don't honor Content-Disposition header.\n"),
     "\n",
 
 #ifdef HAVE_SSL
@@ -588,7 +581,7 @@ Recursive download:\n"),
     N_("\
   -K,  --backup-converted   before converting file X, back up as X.orig.\n"),
     N_("\
-  -m,  --mirror             shortcut option equivalent to -r -N -l inf -nr.\n"),
+  -m,  --mirror             shortcut for -N -r -l inf --no-remove-listing.\n"),
     N_("\
   -p,  --page-requisites    get all images, etc. needed to display HTML page.\n"),
     N_("\
@@ -638,6 +631,32 @@ Recursive accept/reject:\n"),
   exit (0);
 }
 
+/* Return a human-readable printed representation of INTERVAL,
+   measured in seconds.  */
+
+static char *
+secs_to_human_time (double interval)
+{
+  static char buf[32];
+  int secs = (int) (interval + 0.5);
+  int hours, mins, days;
+
+  days = secs / 86400, secs %= 86400;
+  hours = secs / 3600, secs %= 3600;
+  mins = secs / 60, secs %= 60;
+
+  if (days)
+    sprintf (buf, "%dd %dh %dm %ds", days, hours, mins, secs);
+  else if (hours)
+    sprintf (buf, "%dh %dm %ds", hours, mins, secs);
+  else if (mins)
+    sprintf (buf, "%dm %ds", mins, secs);
+  else
+    sprintf (buf, "%ss", print_decimal (interval));
+
+  return buf;
+}
+
 static void
 print_version (void)
 {
@@ -654,6 +673,7 @@ GNU General Public License for more details.\n"), stdout);
   exit (0);
 }
 \f
+#ifndef TESTING
 int
 main (int argc, char *const *argv)
 {
@@ -876,14 +896,11 @@ Can't timestamp and not clobber old files at the same time.\n"));
   /* Open the output filename if necessary.  */
   if (opt.output_document)
     {
-      extern FILE *output_stream;
-      extern bool output_stream_regular;
-
       if (HYPHENP (opt.output_document))
        output_stream = stdout;
       else
        {
-         struct_stat st;
+         struct_fstat st;
          output_stream = fopen (opt.output_document,
                                 opt.always_rest ? "ab" : "wb");
          if (output_stream == NULL)
@@ -955,19 +972,24 @@ Can't timestamp and not clobber old files at the same time.\n"));
                   opt.input_filename);
     }
   /* Print the downloaded sum.  */
-  if (opt.recursive || opt.page_requisites
-      || nurl > 1
-      || (opt.input_filename && total_downloaded_bytes != 0))
+  if ((opt.recursive || opt.page_requisites
+       || nurl > 1
+       || (opt.input_filename && total_downloaded_bytes != 0))
+      &&
+      total_downloaded_bytes != 0)
     {
       logprintf (LOG_NOTQUIET,
-                _("\nFINISHED --%s--\nDownloaded: %s bytes in %d files\n"),
-                time_str (NULL), with_thousand_seps_large (total_downloaded_bytes),
-                opt.numurls);
+                _("FINISHED --%s--\nDownloaded: %d files, %s in %s (%s)\n"),
+                time_str (NULL),
+                opt.numurls,
+                human_readable (total_downloaded_bytes),
+                secs_to_human_time (total_download_time),
+                retr_rate (total_downloaded_bytes, total_download_time));
       /* Print quota warning, if exceeded.  */
       if (opt.quota && total_downloaded_bytes > opt.quota)
        logprintf (LOG_NOTQUIET,
-                  _("Download quota (%s bytes) EXCEEDED!\n"),
-                  with_thousand_seps_large (opt.quota));
+                  _("Download quota of %s EXCEEDED!\n"),
+                  human_readable (opt.quota));
     }
 
   if (opt.cookies_output)
@@ -989,8 +1011,18 @@ Can't timestamp and not clobber old files at the same time.\n"));
   else
     return 1;
 }
+#endif /* TESTING */
 \f
 #if defined(SIGHUP) || defined(SIGUSR1)
+
+/* So the signal_name check doesn't blow when only one is available. */
+#ifndef SIGHUP
+# define SIGHUP -1
+#endif
+#ifndef SIGUSR1
+# define SIGUSR1 -1
+#endif
+
 /* Hangup signal handler.  When wget receives SIGHUP or SIGUSR1, it
    will proceed operation as usual, trying to write into a log file.
    If that is impossible, the output will be turned off.  */