]> sjero.net Git - wget/blobdiff - src/main.c
[svn] Introduce non-strict comment parsing.
[wget] / src / main.c
index 765ee737d9f161ce1b944aa154036adac826d471..35c5f3b63db8e16e7c1fad224e81d090aee38991 100644 (file)
@@ -1,5 +1,5 @@
 /* Command line parsing.
 /* Command line parsing.
-   Copyright (C) 1995, 1996, 1997, 1998, 2000, 2001
+   Copyright (C) 1995, 1996, 1997, 1998, 2000, 2001, 2002
    Free Software Foundation, Inc.
 
 This file is part of GNU Wget.
    Free Software Foundation, Inc.
 
 This file is part of GNU Wget.
@@ -16,7 +16,17 @@ 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
 
 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.  */
+Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+
+In addition, as a special exception, the Free Software Foundation
+gives permission to link the code of its release of Wget with the
+OpenSSL project's "OpenSSL" library (or with modified versions of it
+that use the same license as the "OpenSSL" library), and distribute
+the linked executables.  You must obey the GNU General Public License
+in all respects for all of the code used other than "OpenSSL".  If you
+modify this file, you may extend this exception to your version of the
+file, but you are not obligated to do so.  If you do not wish to do
+so, delete this exception statement from your version.  */
 
 #include <config.h>
 
 
 #include <config.h>
 
@@ -41,8 +51,6 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.  */
 #endif /* HAVE_NLS */
 #include <errno.h>
 
 #endif /* HAVE_NLS */
 #include <errno.h>
 
-#define OPTIONS_DEFINED_HERE   /* for options.h */
-
 #include "wget.h"
 #include "utils.h"
 #include "init.h"
 #include "wget.h"
 #include "utils.h"
 #include "init.h"
@@ -72,10 +80,12 @@ extern int errno;
 
 struct options opt;
 
 
 struct options opt;
 
+extern struct cookie_jar *wget_cookie_jar;
+
 /* From log.c.  */
 void log_init PARAMS ((const char *, int));
 void log_close PARAMS ((void));
 /* From log.c.  */
 void log_init PARAMS ((const char *, int));
 void log_close PARAMS ((void));
-void redirect_output PARAMS ((const char *));
+void log_request_redirect_output PARAMS ((const char *));
 
 static RETSIGTYPE redirect_output_signal PARAMS ((int));
 
 
 static RETSIGTYPE redirect_output_signal PARAMS ((int));
 
@@ -148,14 +158,11 @@ Logging and input file:\n\
   -i,  --input-file=FILE      download URLs found in FILE.\n\
   -F,  --force-html           treat input file as HTML.\n\
   -B,  --base=URL             prepends URL to relative links in -F -i file.\n\
   -i,  --input-file=FILE      download URLs found in FILE.\n\
   -F,  --force-html           treat input file as HTML.\n\
   -B,  --base=URL             prepends URL to relative links in -F -i file.\n\
-       --sslcertfile=FILE     optional client certificate.\n\
-       --sslcertkey=KEYFILE   optional keyfile for this certificate.\n\
-       --egd-file=FILE        file name of the EGD socket.\n\
-\n"), stdout);
+\n"),stdout);
   fputs (_("\
 Download:\n\
   fputs (_("\
 Download:\n\
-       --bind-address=ADDRESS   bind to ADDRESS (hostname or IP) on local host.\n\
   -t,  --tries=NUMBER           set number of retries to NUMBER (0 unlimits).\n\
   -t,  --tries=NUMBER           set number of retries to NUMBER (0 unlimits).\n\
+       --retry-connrefused      retry even if connection is refused.\n\
   -O   --output-document=FILE   write documents to FILE.\n\
   -nc, --no-clobber             don\'t clobber existing files or use .# suffixes.\n\
   -c,  --continue               resume getting a partially-downloaded file.\n\
   -O   --output-document=FILE   write documents to FILE.\n\
   -nc, --no-clobber             don\'t clobber existing files or use .# suffixes.\n\
   -c,  --continue               resume getting a partially-downloaded file.\n\
@@ -169,11 +176,14 @@ Download:\n\
        --random-wait            wait from 0...2*WAIT secs between retrievals.\n\
   -Y,  --proxy=on/off           turn proxy on or off.\n\
   -Q,  --quota=NUMBER           set retrieval quota to NUMBER.\n\
        --random-wait            wait from 0...2*WAIT secs between retrievals.\n\
   -Y,  --proxy=on/off           turn proxy on or off.\n\
   -Q,  --quota=NUMBER           set retrieval quota to NUMBER.\n\
+       --bind-address=ADDRESS   bind to ADDRESS (hostname or IP) on local host.\n\
        --limit-rate=RATE        limit download rate to RATE.\n\
        --limit-rate=RATE        limit download rate to RATE.\n\
+       --dns-cache=off          disable caching DNS lookups.\n\
+       --restrict-file-names=OS restrict chars in file names to ones OS allows.\n\
 \n"), stdout);
   fputs (_("\
 Directories:\n\
 \n"), stdout);
   fputs (_("\
 Directories:\n\
-  -nd  --no-directories            don\'t create directories.\n\
+  -nd, --no-directories            don\'t create directories.\n\
   -x,  --force-directories         force creation of directories.\n\
   -nH, --no-host-directories       don\'t create host directories.\n\
   -P,  --directory-prefix=PREFIX   save files to PREFIX/...\n\
   -x,  --force-directories         force creation of directories.\n\
   -nH, --no-host-directories       don\'t create host directories.\n\
   -P,  --directory-prefix=PREFIX   save files to PREFIX/...\n\
@@ -196,7 +206,23 @@ HTTP options:\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\
        --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\
+       --post-data=STRING    use the POST method; send STRING as the data.\n\
+       --post-file=FILE      use the POST method; send contents of FILE.\n\
 \n"), stdout);
 \n"), stdout);
+#ifdef HAVE_SSL
+  fputs (_("\
+HTTPS (SSL) options:\n\
+       --sslcertfile=FILE     optional client certificate.\n\
+       --sslcertkey=KEYFILE   optional keyfile for this certificate.\n\
+       --egd-file=FILE        file name of the EGD socket.\n\
+       --sslcadir=DIR         dir where hash list of CA's are stured.\n\
+       --sslcafile=FILE       file with bundle of CA's\n\
+       --sslcerttype=0/1      Client-Cert type 0=PEM (default) / 1=ASN1 (DER)\n\
+       --sslcheckcert=0/1     Check the server cert agenst given CA\n\
+       --sslprotocol=0-3      choose SSL protocol; 0=automatic,\n\
+                              1=SSLv2 2=SSLv3 3=TLSv1\n\
+\n"), stdout);
+#endif
   fputs (_("\
 FTP options:\n\
   -nr, --dont-remove-listing   don\'t remove `.listing\' files.\n\
   fputs (_("\
 FTP options:\n\
   -nr, --dont-remove-listing   don\'t remove `.listing\' files.\n\
@@ -206,13 +232,14 @@ FTP options:\n\
 \n"), stdout);
   fputs (_("\
 Recursive retrieval:\n\
 \n"), stdout);
   fputs (_("\
 Recursive retrieval:\n\
-  -r,  --recursive          recursive web-suck -- use with care!\n\
+  -r,  --recursive          recursive download.\n\
   -l,  --level=NUMBER       maximum recursion depth (inf or 0 for infinite).\n\
        --delete-after       delete files locally after downloading them.\n\
   -k,  --convert-links      convert non-relative links to relative.\n\
   -K,  --backup-converted   before converting file X, back up as X.orig.\n\
   -m,  --mirror             shortcut option equivalent to -r -N -l inf -nr.\n\
   -p,  --page-requisites    get all images, etc. needed to display HTML page.\n\
   -l,  --level=NUMBER       maximum recursion depth (inf or 0 for infinite).\n\
        --delete-after       delete files locally after downloading them.\n\
   -k,  --convert-links      convert non-relative links to relative.\n\
   -K,  --backup-converted   before converting file X, back up as X.orig.\n\
   -m,  --mirror             shortcut option equivalent to -r -N -l inf -nr.\n\
   -p,  --page-requisites    get all images, etc. needed to display HTML page.\n\
+       --strict-comments    turn on strict (SGML) handling of HTML comments.\n\
 \n"), stdout);
   fputs (_("\
 Recursive accept/reject:\n\
 \n"), stdout);
   fputs (_("\
 Recursive accept/reject:\n\
@@ -271,10 +298,12 @@ main (int argc, char *const *argv)
     { "recursive", no_argument, NULL, 'r' },
     { "relative", no_argument, NULL, 'L' },
     { "retr-symlinks", no_argument, NULL, 137 },
     { "recursive", no_argument, NULL, 'r' },
     { "relative", no_argument, NULL, 'L' },
     { "retr-symlinks", no_argument, NULL, 137 },
+    { "retry-connrefused", no_argument, NULL, 174 },
     { "save-headers", no_argument, NULL, 's' },
     { "server-response", no_argument, NULL, 'S' },
     { "span-hosts", no_argument, NULL, 'H' },
     { "spider", no_argument, NULL, 132 },
     { "save-headers", no_argument, NULL, 's' },
     { "server-response", no_argument, NULL, 'S' },
     { "span-hosts", no_argument, NULL, 'H' },
     { "spider", no_argument, NULL, 132 },
+    { "strict-comments", no_argument, NULL, 177 },
     { "timestamping", no_argument, NULL, 'N' },
     { "verbose", no_argument, NULL, 'v' },
     { "version", no_argument, NULL, 'V' },
     { "timestamping", no_argument, NULL, 'N' },
     { "verbose", no_argument, NULL, 'v' },
     { "version", no_argument, NULL, 'V' },
@@ -289,6 +318,7 @@ main (int argc, char *const *argv)
     { "cookies", required_argument, NULL, 160 },
     { "cut-dirs", required_argument, NULL, 145 },
     { "directory-prefix", required_argument, NULL, 'P' },
     { "cookies", required_argument, NULL, 160 },
     { "cut-dirs", required_argument, NULL, 145 },
     { "directory-prefix", required_argument, NULL, 'P' },
+    { "dns-cache", required_argument, NULL, 175 },
     { "domains", required_argument, NULL, 'D' },
     { "dot-style", required_argument, NULL, 134 },
     { "execute", required_argument, NULL, 'e' },
     { "domains", required_argument, NULL, 'D' },
     { "dot-style", required_argument, NULL, 134 },
     { "execute", required_argument, NULL, 'e' },
@@ -309,12 +339,15 @@ main (int argc, char *const *argv)
     { "no", required_argument, NULL, 'n' },
     { "output-document", required_argument, NULL, 'O' },
     { "output-file", required_argument, NULL, 'o' },
     { "no", required_argument, NULL, 'n' },
     { "output-document", required_argument, NULL, 'O' },
     { "output-file", required_argument, NULL, 'o' },
+    { "post-data", required_argument, NULL, 167 },
+    { "post-file", required_argument, NULL, 168 },
     { "progress", required_argument, NULL, 163 },
     { "proxy", required_argument, NULL, 'Y' },
     { "proxy-passwd", required_argument, NULL, 144 },
     { "proxy-user", required_argument, NULL, 143 },
     { "quota", required_argument, NULL, 'Q' },
     { "reject", required_argument, NULL, 'R' },
     { "progress", required_argument, NULL, 163 },
     { "proxy", required_argument, NULL, 'Y' },
     { "proxy-passwd", required_argument, NULL, 144 },
     { "proxy-user", required_argument, NULL, 143 },
     { "quota", required_argument, NULL, 'Q' },
     { "reject", required_argument, NULL, 'R' },
+    { "restrict-file-names", required_argument, NULL, 176 },
     { "save-cookies", required_argument, NULL, 162 },
     { "timeout", required_argument, NULL, 'T' },
     { "tries", required_argument, NULL, 't' },
     { "save-cookies", required_argument, NULL, 162 },
     { "timeout", required_argument, NULL, 'T' },
     { "tries", required_argument, NULL, 't' },
@@ -325,6 +358,11 @@ main (int argc, char *const *argv)
     { "sslcertfile", required_argument, NULL, 158 },
     { "sslcertkey", required_argument, NULL, 159 },
     { "egd-file", required_argument, NULL, 166 },
     { "sslcertfile", required_argument, NULL, 158 },
     { "sslcertkey", required_argument, NULL, 159 },
     { "egd-file", required_argument, NULL, 166 },
+    { "sslcadir",         required_argument, NULL, 169},
+    { "sslcafile",        required_argument, NULL, 170},
+    { "sslcerttype",      required_argument, NULL, 171},
+    { "sslcheckcert",     required_argument, NULL, 172},
+    { "sslprotocol",      required_argument, NULL, 173},
 #endif /* HAVE_SSL */
     { "wait", required_argument, NULL, 'w' },
     { "waitretry", required_argument, NULL, 152 },
 #endif /* HAVE_SSL */
     { "wait", required_argument, NULL, 'w' },
     { "waitretry", required_argument, NULL, 152 },
@@ -485,6 +523,12 @@ GNU General Public License for more details.\n"));
        case 'x':
          setval ("dirstruct", "on");
          break;
        case 'x':
          setval ("dirstruct", "on");
          break;
+       case 174:
+         setval ("retryconnrefused", "on");
+         break;
+       case 177:
+         setval ("strictcomments", "on");
+         break;
 
          /* Options accepting an argument: */
        case 129:
 
          /* Options accepting an argument: */
        case 129:
@@ -548,7 +592,34 @@ GNU General Public License for more details.\n"));
        case 166:
          setval ("egdfile", optarg);
          break;
        case 166:
          setval ("egdfile", optarg);
          break;
+       case 169:
+         setval ("sslcadir", optarg);
+         break;
+       case 170:
+         setval ("sslcafile", optarg);
+         break;
+       case 171:
+         setval ("sslcerttype", optarg);
+         break;
+       case 172:
+         setval ("sslcheckcert", optarg);
+         break;
+       case 173:
+         setval ("sslprotocol", optarg);
+         break;
 #endif /* HAVE_SSL */
 #endif /* HAVE_SSL */
+       case 167:
+         setval ("postdata", optarg);
+         break;
+       case 168:
+         setval ("postfile", optarg);
+         break;
+       case 175:
+         setval ("dnscache", optarg);
+         break;
+       case 176:
+         setval ("restrictfilenames", optarg);
+         break;
        case 'A':
          setval ("accept", optarg);
          break;
        case 'A':
          setval ("accept", optarg);
          break;
@@ -679,11 +750,6 @@ GNU General Public License for more details.\n"));
        }
     }
 
        }
     }
 
-  /* Initialize progress.  Have to do this after the options are
-     processed so we know where the log file is.  */
-  if (opt.verbose)
-    set_progress_implementation (opt.progress_type);
-
   /* All user options have now been processed, so it's now safe to do
      interoption dependency checks. */
 
   /* All user options have now been processed, so it's now safe to do
      interoption dependency checks. */
 
@@ -731,6 +797,11 @@ Can't timestamp and not clobber old files at the same time.\n"));
   if (opt.background)
     fork_to_background ();
 
   if (opt.background)
     fork_to_background ();
 
+  /* Initialize progress.  Have to do this after the options are
+     processed so we know where the log file is.  */
+  if (opt.verbose)
+    set_progress_implementation (opt.progress_type);
+
   /* Allocate basic pointer.  */
   url = ALLOCA_ARRAY (char *, nurl + 1);
   /* Fill in the arguments.  */
   /* Allocate basic pointer.  */
   url = ALLOCA_ARRAY (char *, nurl + 1);
   /* Fill in the arguments.  */
@@ -852,8 +923,8 @@ Can't timestamp and not clobber old files at the same time.\n"));
                   legible (opt.quota));
     }
 
                   legible (opt.quota));
     }
 
-  if (opt.cookies_output)
-    save_cookies (opt.cookies_output);
+  if (opt.cookies_output && wget_cookie_jar)
+    cookie_jar_save (wget_cookie_jar, opt.cookies_output);
 
   if (opt.convert_links && !opt.delete_after)
     {
 
   if (opt.convert_links && !opt.delete_after)
     {
@@ -886,15 +957,11 @@ Can't timestamp and not clobber old files at the same time.\n"));
 static RETSIGTYPE
 redirect_output_signal (int sig)
 {
 static RETSIGTYPE
 redirect_output_signal (int sig)
 {
-  char tmp[100];
-  signal (sig, redirect_output_signal);
-  /* Please note that the double `%' in `%%s' is intentional, because
-     redirect_output passes tmp through printf.  */
-  sprintf (tmp, _("%s received, redirecting output to `%%s'.\n"),
-          (sig == SIGHUP ? "SIGHUP" :
-           (sig == SIGUSR1 ? "SIGUSR1" :
-            "WTF?!")));
-  redirect_output (tmp);
+  char *signal_name = (sig == SIGHUP ? "SIGHUP" :
+                      (sig == SIGUSR1 ? "SIGUSR1" :
+                       "WTF?!"));
+  log_request_redirect_output (signal_name);
   progress_schedule_redirect ();
   progress_schedule_redirect ();
+  signal (sig, redirect_output_signal);
 }
 #endif /* HAVE_SIGNAL */
 }
 #endif /* HAVE_SIGNAL */