]> sjero.net Git - wget/blobdiff - src/main.c
[svn] Rewrite parsing and handling of URLs.
[wget] / src / main.c
index 250ac8873c3b9bdd8b7dba82ea20a2599716ef62..4eed7df9e1fcff4e4c81cfe12e6d76ce005c44d0 100644 (file)
@@ -1,20 +1,21 @@
 /* Command line parsing.
-   Copyright (C) 1995, 1996, 1997, 1998, 2000 Free Software Foundation, Inc.
+   Copyright (C) 1995, 1996, 1997, 1998, 2000, 2001
+   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>
@@ -44,11 +45,15 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.  */
 
 #include "wget.h"
 #include "utils.h"
-#include "getopt.h"
 #include "init.h"
 #include "retr.h"
 #include "recur.h"
 #include "host.h"
+#include "cookies.h"
+#include "url.h"
+
+/* On GNU system this will include system-wide getopt.h. */
+#include "getopt.h"
 
 #ifndef PATH_SEPARATOR
 # define PATH_SEPARATOR '/'
@@ -101,7 +106,6 @@ i18n_initialize (void)
 
 /* It's kosher to declare these here because their interface _has_ to
    be void foo(void).  */
-void url_init PARAMS ((void));
 void host_init PARAMS ((void));
 
 /* This just calls the various initialization functions from the
@@ -109,7 +113,6 @@ void host_init PARAMS ((void));
 static void
 private_initialize (void)
 {
-  url_init ();
   host_init ();
 }
 \f
@@ -193,6 +196,10 @@ HTTP options:\n\
        --referer=URL         include `Referer: URL\' header in HTTP request.\n\
   -s,  --save-headers        save the HTTP headers to file.\n\
   -U,  --user-agent=AGENT    identify as AGENT instead of Wget/VERSION.\n\
+       --no-http-keep-alive  disable HTTP keep-alive (persistent connections).\n\
+       --cookies=off         don't use cookies.\n\
+       --load-cookies=FILE   load cookies from FILE before session.\n\
+       --save-cookies=FILE   save cookies to FILE after session.\n\
 \n"), stdout);
   fputs (_("\
 FTP options:\n\
@@ -236,19 +243,17 @@ main (int argc, char *const *argv)
 {
   char **url, **t;
   int i, c, nurl, status, append_to_log;
-  int wr = 0;
 
   static struct option long_options[] =
   {
     /* Options without arguments: */
     { "background", no_argument, NULL, 'b' },
+    { "backup-converted", no_argument, NULL, 'K' },
     { "continue", no_argument, NULL, 'c' },
     { "convert-links", no_argument, NULL, 'k' },
-    { "backup-converted", no_argument, NULL, 'K' },
     { "debug", no_argument, NULL, 'd' },
     { "delete-after", no_argument, NULL, 136 },
     { "dont-remove-listing", no_argument, NULL, 149 },
-    { "email-address", no_argument, NULL, 154 }, /* undocumented (debug) */
     { "follow-ftp", no_argument, NULL, 142 },
     { "force-directories", no_argument, NULL, 'x' },
     { "force-hier", no_argument, NULL, 'x' }, /* obsolete */
@@ -285,6 +290,7 @@ main (int argc, char *const *argv)
     { "base", required_argument, NULL, 'B' },
     { "bind-address", required_argument, NULL, 155 },
     { "cache", required_argument, NULL, 'C' },
+    { "cookies", required_argument, NULL, 160 },
     { "cut-dirs", required_argument, NULL, 145 },
     { "directory-prefix", required_argument, NULL, 'P' },
     { "domains", required_argument, NULL, 'D' },
@@ -302,6 +308,7 @@ main (int argc, char *const *argv)
     { "include-directories", required_argument, NULL, 'I' },
     { "input-file", required_argument, NULL, 'i' },
     { "level", required_argument, NULL, 'l' },
+    { "load-cookies", required_argument, NULL, 161 },
     { "no", required_argument, NULL, 'n' },
     { "output-document", required_argument, NULL, 'O' },
     { "output-file", required_argument, NULL, 'o' },
@@ -310,6 +317,7 @@ main (int argc, char *const *argv)
     { "proxy-user", required_argument, NULL, 143 },
     { "quota", required_argument, NULL, 'Q' },
     { "reject", required_argument, NULL, 'R' },
+    { "save-cookies", required_argument, NULL, 162 },
     { "timeout", required_argument, NULL, 'T' },
     { "tries", required_argument, NULL, 't' },
     { "user-agent", required_argument, NULL, 'U' },
@@ -347,7 +355,7 @@ main (int argc, char *const *argv)
       that the options with required arguments must be followed by a ':'.
       -- Dan Harkless <wget@harkless.org>] */
   while ((c = getopt_long (argc, argv, "\
-hpVqvdkKsxmNWrHSLcFbEY:G:g:T:U:O:l:n:i:o:a:t:D:A:R:P:B:e:Q:X:I:w:",
+hpVqvdkKsxmNWrHSLcFbEY:G:g:T:U:O:l:n:i:o:a:t:D:A:R:P:B:e:Q:X:I:w:C:",
                           long_options, (int *)0)) != EOF)
     {
       switch (c)
@@ -395,11 +403,6 @@ hpVqvdkKsxmNWrHSLcFbEY:G:g:T:U:O:l:n:i:o:a:t:D:A:R:P:B:e:Q:X:I:w:",
        case 150:
          setval ("simplehostcheck", "on");
          break;
-       case 154:
-         /* For debugging purposes.  */
-         printf ("%s\n", ftp_getaddress ());
-         exit (0);
-         break;
        case 155:
          setval ("bindaddress", optarg);
          break;
@@ -469,7 +472,8 @@ hpVqvdkKsxmNWrHSLcFbEY:G:g:T:U:O:l:n:i:o:a:t:D:A:R:P:B:e:Q:X:I:w:",
        case 'V':
          printf ("GNU Wget %s\n\n", version_string);
          printf ("%s", _("\
-Copyright (C) 1995, 1996, 1997, 1998, 2000 Free Software Foundation, Inc.\n\
+Copyright (C) 1995, 1996, 1997, 1998, 2000, 2001 Free Software Foundation, Inc.\n"));
+         printf ("%s", _("\
 This program is distributed in the hope that it will be useful,\n\
 but WITHOUT ANY WARRANTY; without even the implied warranty of\n\
 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n\
@@ -514,11 +518,19 @@ GNU General Public License for more details.\n"));
          break;
        case 152:
          setval ("waitretry", optarg);
-         wr = 1;
          break;
        case 153:
          setval ("followtags", optarg);
          break;
+       case 160:
+         setval ("cookies", optarg);
+         break;
+       case 161:
+         setval ("loadcookies", optarg);
+         break;
+       case 162:
+         setval ("savecookies", optarg);
+         break;
        case 157:
          setval ("referer", optarg);
          break;
@@ -680,18 +692,6 @@ GNU General Public License for more details.\n"));
   if (opt.verbose == -1)
     opt.verbose = !opt.quiet;
 
-  /* Retain compatibility with previous scripts.
-     if wait has been set, but waitretry has not, give it the wait value.
-     A simple check on the values is not enough, I could have set
-     wait to n>0 and waitretry to 0 - HEH */
-  if (opt.wait && !wr)
-    {
-      char  opt_wait_str[256];  /* bigger than needed buf to prevent overflow */
-
-      sprintf(opt_wait_str, "%ld", opt.wait);
-      setval ("waitretry", opt_wait_str);
-    }
-    
   /* Sanity checks.  */
   if (opt.verbose && opt.quiet)
     {
@@ -727,9 +727,14 @@ Can't timestamp and not clobber old files at the same time.\n"));
   /* Fill in the arguments.  */
   for (i = 0; i < nurl; i++, optind++)
     {
-      char *irix4_cc_needs_this;
-      STRDUP_ALLOCA (irix4_cc_needs_this, argv[optind]);
-      url[i] = irix4_cc_needs_this;
+      char *rewritten = rewrite_shorthand_url (argv[optind]);
+      if (rewritten)
+       {
+         printf ("Converted %s to %s\n", argv[optind], rewritten);
+         url[i] = rewritten;
+       }
+      else
+       url[i] = xstrdup (argv[optind]);
     }
   url[i] = NULL;
 
@@ -744,6 +749,7 @@ Can't timestamp and not clobber old files at the same time.\n"));
 
   DEBUGP (("DEBUG output created by Wget %s on %s.\n\n", version_string,
           OS_TYPE));
+
   /* Open the output filename if necessary.  */
   if (opt.output_document)
     {
@@ -752,7 +758,7 @@ Can't timestamp and not clobber old files at the same time.\n"));
       else
        {
          struct stat st;
-         opt.dfp = fopen (opt.output_document, "wb");
+         opt.dfp = fopen (opt.output_document, opt.always_rest ? "ab" : "wb");
          if (opt.dfp == NULL)
            {
              perror (opt.output_document);
@@ -831,12 +837,20 @@ Can't timestamp and not clobber old files at the same time.\n"));
                   _("Download quota (%s bytes) EXCEEDED!\n"),
                   legible (opt.quota));
     }
+
+  if (opt.cookies_output)
+    save_cookies (opt.cookies_output);
+
   if (opt.convert_links && !opt.delete_after)
     {
       convert_all_links ();
     }
+
   log_close ();
+  for (i = 0; i < nurl; i++)
+    xfree (url[i]);
   cleanup ();
+
 #ifdef DEBUG_MALLOC
   print_malloc_debug_stats ();
 #endif