~ubuntu-branches/ubuntu/precise/wget/precise-proposed

« back to all changes in this revision

Viewing changes to src/main.c

  • Committer: Bazaar Package Importer
  • Author(s): Noèl Köthe
  • Date: 2005-06-26 16:46:25 UTC
  • mfrom: (1.1.1 upstream) (2.1.1 sarge)
  • Revision ID: james.westby@ubuntu.com-20050626164625-jjcde8hyztx7xq7o
Tags: 1.10-2
* wget-fix_error--save-headers patch from upstream
  (closes: Bug#314728)
* don't pattern-match server redirects patch from upstream
  (closes: Bug#163243)
* correct de.po typos
  (closes: Bug#313883)
* wget-E_html_behind_file_counting fix problem with adding the
  numbers after the html extension
* updated Standards-Version: to 3.6.2

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
1
/* Command line parsing.
2
 
   Copyright (C) 1995, 1996, 1997, 1998, 2000, 2001, 2002
3
 
   Free Software Foundation, Inc.
 
2
   Copyright (C) 2003, 2004, 2005 Free Software Foundation, Inc.
4
3
 
5
4
This file is part of GNU Wget.
6
5
 
49
48
# include <locale.h>
50
49
#endif /* HAVE_LOCALE_H */
51
50
#endif /* HAVE_NLS */
 
51
#include <assert.h>
 
52
 
52
53
#include <errno.h>
53
54
#ifndef errno
54
55
extern int errno;
60
61
#include "retr.h"
61
62
#include "recur.h"
62
63
#include "host.h"
63
 
#include "cookies.h"
64
64
#include "url.h"
65
65
#include "progress.h"           /* for progress_handle_sigwinch */
66
66
#include "convert.h"
67
67
 
68
 
#ifdef HAVE_SSL
69
 
# include "gen_sslfunc.h"
70
 
#endif
71
 
 
72
68
/* On GNU system this will include system-wide getopt.h. */
73
69
#include "getopt.h"
74
70
 
83
79
 
84
80
extern struct cookie_jar *wget_cookie_jar;
85
81
 
86
 
/* From log.c.  */
87
 
void log_init PARAMS ((const char *, int));
88
 
void log_close PARAMS ((void));
89
 
void log_request_redirect_output PARAMS ((const char *));
90
 
 
91
82
static RETSIGTYPE redirect_output_signal PARAMS ((int));
92
83
 
93
84
const char *exec_name;
94
85
 
95
 
/* Initialize I18N.  The initialization amounts to invoking
96
 
   setlocale(), bindtextdomain() and textdomain().
97
 
   Does nothing if NLS is disabled or missing.  */
 
86
/* Initialize I18N/L10N.  That amounts to invoking setlocale, and
 
87
   setting up gettext's message catalog using bindtextdomain and
 
88
   textdomain.  Does nothing if NLS is disabled or missing.  */
 
89
 
98
90
static void
99
91
i18n_initialize (void)
100
92
{
101
 
  /* If HAVE_NLS is defined, assume the existence of the three
102
 
     functions invoked here.  */
 
93
  /* HAVE_NLS implies existence of functions invoked here.  */
103
94
#ifdef HAVE_NLS
104
95
  /* Set the current locale.  */
105
 
  /* Here we use LC_MESSAGES instead of LC_ALL, for two reasons.
106
 
     First, message catalogs are all of I18N Wget uses anyway.
107
 
     Second, setting LC_ALL has a dangerous potential of messing
108
 
     things up.  For example, when in a foreign locale, Solaris
109
 
     strptime() fails to handle international dates correctly, which
110
 
     makes http_atotm() malfunction.  */
111
 
#ifdef LC_MESSAGES
 
96
  /* Where possible, sets only LC_MESSAGES and LC_CTYPE.  Other
 
97
     categories, such as numeric, time, or collation, break code that
 
98
     parses data received from the network and relies on C-locale
 
99
     behavior of libc functions.  For example, Solaris strptime fails
 
100
     to recognize English month names in non-English locales, which
 
101
     breaks http_atotm.  Some implementations of fnmatch perform
 
102
     unwanted case folding in non-C locales.  ctype macros, while they
 
103
     were used, provided another example against LC_ALL.  */
 
104
#if defined(LC_MESSAGES) && defined(LC_CTYPE)
112
105
  setlocale (LC_MESSAGES, "");
113
 
  setlocale (LC_CTYPE, "");
 
106
  setlocale (LC_CTYPE, "");     /* safe because we use safe-ctype */
114
107
#else
115
108
  setlocale (LC_ALL, "");
116
109
#endif
120
113
#endif /* HAVE_NLS */
121
114
}
122
115
 
 
116
/* Definition of command-line options. */
 
117
 
 
118
static void print_help PARAMS ((void));
 
119
static void print_version PARAMS ((void));
 
120
 
 
121
#ifdef HAVE_SSL
 
122
# define IF_SSL(x) x
 
123
#else
 
124
# define IF_SSL(x) NULL
 
125
#endif
 
126
 
 
127
#ifdef ENABLE_DEBUG
 
128
# define IF_DEBUG(x) x
 
129
#else
 
130
# define IF_DEBUG(x) NULL
 
131
#endif
 
132
 
 
133
struct cmdline_option {
 
134
  const char *long_name;
 
135
  char short_name;
 
136
  enum {
 
137
    OPT_VALUE,
 
138
    OPT_BOOLEAN,
 
139
    OPT_FUNCALL,
 
140
    /* Non-standard options that have to be handled specially in
 
141
       main().  */
 
142
    OPT__APPEND_OUTPUT,
 
143
    OPT__CLOBBER,
 
144
    OPT__DONT_REMOVE_LISTING,
 
145
    OPT__EXECUTE,
 
146
    OPT__NO,
 
147
    OPT__PARENT,
 
148
  } type;
 
149
  const void *data;             /* for standard options */
 
150
  int argtype;                  /* for non-standard options */
 
151
};
 
152
 
 
153
struct cmdline_option option_data[] =
 
154
  {
 
155
    { "accept", 'A', OPT_VALUE, "accept", -1 },
 
156
    { "append-output", 'a', OPT__APPEND_OUTPUT, NULL, required_argument },
 
157
    { "background", 'b', OPT_BOOLEAN, "background", -1 },
 
158
    { "backup-converted", 'K', OPT_BOOLEAN, "backupconverted", -1 },
 
159
    { "backups", 0, OPT_BOOLEAN, "backups", -1 },
 
160
    { "base", 'B', OPT_VALUE, "base", -1 },
 
161
    { "bind-address", 0, OPT_VALUE, "bindaddress", -1 },
 
162
    { IF_SSL ("ca-certificate"), 0, OPT_VALUE, "cacertificate", -1 },
 
163
    { IF_SSL ("ca-directory"), 0, OPT_VALUE, "cadirectory", -1 },
 
164
    { "cache", 0, OPT_BOOLEAN, "cache", -1 },
 
165
    { IF_SSL ("certificate"), 0, OPT_VALUE, "certificate", -1 },
 
166
    { IF_SSL ("certificate-type"), 0, OPT_VALUE, "certificatetype", -1 },
 
167
    { IF_SSL ("check-certificate"), 0, OPT_BOOLEAN, "checkcertificate", -1 },
 
168
    { "clobber", 0, OPT__CLOBBER, NULL, optional_argument },
 
169
    { "connect-timeout", 0, OPT_VALUE, "connecttimeout", -1 },
 
170
    { "continue", 'c', OPT_BOOLEAN, "continue", -1 },
 
171
    { "convert-links", 'k', OPT_BOOLEAN, "convertlinks", -1 },
 
172
    { "cookies", 0, OPT_BOOLEAN, "cookies", -1 },
 
173
    { "cut-dirs", 0, OPT_VALUE, "cutdirs", -1 },
 
174
    { IF_DEBUG ("debug"), 'd', OPT_BOOLEAN, "debug", -1 },
 
175
    { "delete-after", 0, OPT_BOOLEAN, "deleteafter", -1 },
 
176
    { "directories", 0, OPT_BOOLEAN, "dirstruct", -1 },
 
177
    { "directory-prefix", 'P', OPT_VALUE, "dirprefix", -1 },
 
178
    { "dns-cache", 0, OPT_BOOLEAN, "dnscache", -1 },
 
179
    { "dns-timeout", 0, OPT_VALUE, "dnstimeout", -1 },
 
180
    { "domains", 'D', OPT_VALUE, "domains", -1 },
 
181
    { "dont-remove-listing", 0, OPT__DONT_REMOVE_LISTING, NULL, no_argument },
 
182
    { "dot-style", 0, OPT_VALUE, "dotstyle", -1 },
 
183
    { "egd-file", 0, OPT_VALUE, "egdfile", -1 },
 
184
    { "exclude-directories", 'X', OPT_VALUE, "excludedirectories", -1 },
 
185
    { "exclude-domains", 0, OPT_VALUE, "excludedomains", -1 },
 
186
    { "execute", 'e', OPT__EXECUTE, NULL, required_argument },
 
187
    { "follow-ftp", 0, OPT_BOOLEAN, "followftp", -1 },
 
188
    { "follow-tags", 0, OPT_VALUE, "followtags", -1 },
 
189
    { "force-directories", 'x', OPT_BOOLEAN, "dirstruct", -1 },
 
190
    { "force-html", 'F', OPT_BOOLEAN, "forcehtml", -1 },
 
191
    { "ftp-password", 0, OPT_VALUE, "ftppassword", -1 },
 
192
    { "ftp-user", 0, OPT_VALUE, "ftpuser", -1 },
 
193
    { "glob", 0, OPT_BOOLEAN, "glob", -1 },
 
194
    { "header", 0, OPT_VALUE, "header", -1 },
 
195
    { "help", 'h', OPT_FUNCALL, (void *)print_help, no_argument },
 
196
    { "host-directories", 0, OPT_BOOLEAN, "addhostdir", -1 },
 
197
    { "html-extension", 'E', OPT_BOOLEAN, "htmlextension", -1 },
 
198
    { "htmlify", 0, OPT_BOOLEAN, "htmlify", -1 },
 
199
    { "http-keep-alive", 0, OPT_BOOLEAN, "httpkeepalive", -1 },
 
200
    { "http-passwd", 0, OPT_VALUE, "httppassword", -1 }, /* deprecated */
 
201
    { "http-password", 0, OPT_VALUE, "httppassword", -1 },
 
202
    { "http-user", 0, OPT_VALUE, "httpuser", -1 },
 
203
    { "ignore-length", 0, OPT_BOOLEAN, "ignorelength", -1 },
 
204
    { "ignore-tags", 0, OPT_VALUE, "ignoretags", -1 },
 
205
    { "include-directories", 'I', OPT_VALUE, "includedirectories", -1 },
 
206
#ifdef ENABLE_IPV6
 
207
    { "inet4-only", '4', OPT_BOOLEAN, "inet4only", -1 },
 
208
    { "inet6-only", '6', OPT_BOOLEAN, "inet6only", -1 },
 
209
#endif
 
210
    { "input-file", 'i', OPT_VALUE, "input", -1 },
 
211
    { "keep-session-cookies", 0, OPT_BOOLEAN, "keepsessioncookies", -1 },
 
212
    { "level", 'l', OPT_VALUE, "reclevel", -1 },
 
213
    { "limit-rate", 0, OPT_VALUE, "limitrate", -1 },
 
214
    { "load-cookies", 0, OPT_VALUE, "loadcookies", -1 },
 
215
    { "mirror", 'm', OPT_BOOLEAN, "mirror", -1 },
 
216
    { "no", 'n', OPT__NO, NULL, required_argument },
 
217
    { "no-clobber", 0, OPT_BOOLEAN, "noclobber", -1 },
 
218
    { "no-parent", 0, OPT_BOOLEAN, "noparent", -1 },
 
219
    { "output-document", 'O', OPT_VALUE, "outputdocument", -1 },
 
220
    { "output-file", 'o', OPT_VALUE, "logfile", -1 },
 
221
    { "page-requisites", 'p', OPT_BOOLEAN, "pagerequisites", -1 },
 
222
    { "parent", 0, OPT__PARENT, NULL, optional_argument },
 
223
    { "passive-ftp", 0, OPT_BOOLEAN, "passiveftp", -1 },
 
224
    { "password", 0, OPT_VALUE, "password", -1 },
 
225
    { "post-data", 0, OPT_VALUE, "postdata", -1 },
 
226
    { "post-file", 0, OPT_VALUE, "postfile", -1 },
 
227
    { "prefer-family", 0, OPT_VALUE, "preferfamily", -1 },
 
228
    { "preserve-permissions", 0, OPT_BOOLEAN, "preservepermissions", -1 },
 
229
    { IF_SSL ("private-key"), 0, OPT_VALUE, "privatekey", -1 },
 
230
    { IF_SSL ("private-key-type"), 0, OPT_VALUE, "privatekeytype", -1 },
 
231
    { "progress", 0, OPT_VALUE, "progress", -1 },
 
232
    { "protocol-directories", 0, OPT_BOOLEAN, "protocoldirectories", -1 },
 
233
    { "proxy", 0, OPT_BOOLEAN, "useproxy", -1 },
 
234
    { "proxy__compat", 'Y', OPT_VALUE, "useproxy", -1 }, /* back-compatible */
 
235
    { "proxy-passwd", 0, OPT_VALUE, "proxypassword", -1 }, /* deprecated */
 
236
    { "proxy-password", 0, OPT_VALUE, "proxypassword", -1 },
 
237
    { "proxy-user", 0, OPT_VALUE, "proxyuser", -1 },
 
238
    { "quiet", 'q', OPT_BOOLEAN, "quiet", -1 },
 
239
    { "quota", 'Q', OPT_VALUE, "quota", -1 },
 
240
    { "random-file", 0, OPT_VALUE, "randomfile", -1 },
 
241
    { "random-wait", 0, OPT_BOOLEAN, "randomwait", -1 },
 
242
    { "read-timeout", 0, OPT_VALUE, "readtimeout", -1 },
 
243
    { "recursive", 'r', OPT_BOOLEAN, "recursive", -1 },
 
244
    { "referer", 0, OPT_VALUE, "referer", -1 },
 
245
    { "reject", 'R', OPT_VALUE, "reject", -1 },
 
246
    { "relative", 'L', OPT_BOOLEAN, "relativeonly", -1 },
 
247
    { "remove-listing", 0, OPT_BOOLEAN, "removelisting", -1 },
 
248
    { "restrict-file-names", 0, OPT_BOOLEAN, "restrictfilenames", -1 },
 
249
    { "retr-symlinks", 0, OPT_BOOLEAN, "retrsymlinks", -1 },
 
250
    { "retry-connrefused", 0, OPT_BOOLEAN, "retryconnrefused", -1 },
 
251
    { "save-cookies", 0, OPT_VALUE, "savecookies", -1 },
 
252
    { "save-headers", 0, OPT_BOOLEAN, "saveheaders", -1 },
 
253
    { IF_SSL ("secure-protocol"), 0, OPT_VALUE, "secureprotocol", -1 },
 
254
    { "server-response", 'S', OPT_BOOLEAN, "serverresponse", -1 },
 
255
    { "span-hosts", 'H', OPT_BOOLEAN, "spanhosts", -1 },
 
256
    { "spider", 0, OPT_BOOLEAN, "spider", -1 },
 
257
    { "strict-comments", 0, OPT_BOOLEAN, "strictcomments", -1 },
 
258
    { "timeout", 'T', OPT_VALUE, "timeout", -1 },
 
259
    { "timestamping", 'N', OPT_BOOLEAN, "timestamping", -1 },
 
260
    { "tries", 't', OPT_VALUE, "tries", -1 },
 
261
    { "user", 0, OPT_VALUE, "user", -1 },
 
262
    { "user-agent", 'U', OPT_VALUE, "useragent", -1 },
 
263
    { "verbose", 'v', OPT_BOOLEAN, "verbose", -1 },
 
264
    { "verbose", 0, OPT_BOOLEAN, "verbose", -1 },
 
265
    { "version", 'V', OPT_FUNCALL, (void *) print_version, no_argument },
 
266
    { "wait", 'w', OPT_VALUE, "wait", -1 },
 
267
    { "waitretry", 0, OPT_VALUE, "waitretry", -1 },
 
268
  };
 
269
 
 
270
#undef IF_DEBUG
 
271
#undef IF_SSL
 
272
 
 
273
/* Return a string that contains S with "no-" prepended.  The string
 
274
   is NUL-terminated and allocated off static storage at Wget
 
275
   startup.  */
 
276
 
 
277
static char *
 
278
no_prefix (const char *s)
 
279
{
 
280
  static char buffer[1024];
 
281
  static char *p = buffer;
 
282
 
 
283
  char *cp = p;
 
284
  int size = 3 + strlen (s) + 1;  /* "no-STRING\0" */
 
285
  if (p + size >= buffer + sizeof (buffer))
 
286
    abort ();
 
287
 
 
288
  cp[0] = 'n', cp[1] = 'o', cp[2] = '-';
 
289
  strcpy (cp + 3, s);
 
290
  p += size;
 
291
  return cp;
 
292
}
 
293
 
 
294
/* The arguments that that main passes to getopt_long. */
 
295
static struct option long_options[2 * countof (option_data) + 1];
 
296
static char short_options[128];
 
297
 
 
298
/* Mapping between short option chars and option_data indices. */
 
299
static unsigned char optmap[96];
 
300
 
 
301
/* Marker for `--no-FOO' values in long_options.  */
 
302
#define BOOLEAN_NEG_MARKER 1024
 
303
 
 
304
/* Initialize the long_options array used by getopt_long from the data
 
305
   in option_data.  */
 
306
 
 
307
static void
 
308
init_switches (void)
 
309
{
 
310
  char *p = short_options;
 
311
  int i, o = 0;
 
312
  for (i = 0; i < countof (option_data); i++)
 
313
    {
 
314
      struct cmdline_option *opt = &option_data[i];
 
315
      struct option *longopt;
 
316
 
 
317
      if (!opt->long_name)
 
318
        /* The option is disabled. */
 
319
        continue;
 
320
 
 
321
      longopt = &long_options[o++];
 
322
      longopt->name = opt->long_name;
 
323
      longopt->val = i;
 
324
      if (opt->short_name)
 
325
        {
 
326
          *p++ = opt->short_name;
 
327
          optmap[opt->short_name - 32] = longopt - long_options;
 
328
        }
 
329
      switch (opt->type)
 
330
        {
 
331
        case OPT_VALUE:
 
332
          longopt->has_arg = required_argument;
 
333
          if (opt->short_name)
 
334
            *p++ = ':';
 
335
          break;
 
336
        case OPT_BOOLEAN:
 
337
          /* Specify an optional argument for long options, so that
 
338
             --option=off works the same as --no-option, for
 
339
             compatibility with pre-1.10 Wget.  However, don't specify
 
340
             optional arguments short-option booleans because they
 
341
             prevent combining of short options.  */
 
342
          longopt->has_arg = optional_argument;
 
343
          /* For Boolean options, add the "--no-FOO" variant, which is
 
344
             identical to "--foo", except it has opposite meaning and
 
345
             it doesn't allow an argument.  */
 
346
          longopt = &long_options[o++];
 
347
          longopt->name = no_prefix (opt->long_name);
 
348
          longopt->has_arg = no_argument;
 
349
          /* Mask the value so we'll be able to recognize that we're
 
350
             dealing with the false value.  */
 
351
          longopt->val = i | BOOLEAN_NEG_MARKER;
 
352
          break;
 
353
        default:
 
354
          assert (opt->argtype != -1);
 
355
          longopt->has_arg = opt->argtype;
 
356
          if (opt->short_name)
 
357
            {
 
358
              if (longopt->has_arg == required_argument)
 
359
                *p++ = ':';
 
360
              /* Don't handle optional_argument */
 
361
            }
 
362
        }
 
363
    }
 
364
  /* Terminate short_options. */
 
365
  *p = '\0';
 
366
  /* No need for xzero(long_options[o]) because its storage is static
 
367
     and it will be zeroed by default.  */
 
368
  assert (o <= countof (long_options));
 
369
}
 
370
 
123
371
/* Print the usage message.  */
124
372
static void
125
373
print_usage (void)
132
380
static void
133
381
print_help (void)
134
382
{
 
383
  /* We split the help text this way to ease translation of individual
 
384
     entries.  */
 
385
  static const char *help[] = {
 
386
    "\n",
 
387
    N_("\
 
388
Mandatory arguments to long options are mandatory for short options too.\n\n"),
 
389
    N_("\
 
390
Startup:\n"),
 
391
    N_("\
 
392
  -V,  --version           display the version of Wget and exit.\n"),
 
393
    N_("\
 
394
  -h,  --help              print this help.\n"),
 
395
    N_("\
 
396
  -b,  --background        go to background after startup.\n"),
 
397
    N_("\
 
398
  -e,  --execute=COMMAND   execute a `.wgetrc'-style command.\n"),
 
399
    "\n",
 
400
 
 
401
    N_("\
 
402
Logging and input file:\n"),
 
403
    N_("\
 
404
  -o,  --output-file=FILE    log messages to FILE.\n"),
 
405
    N_("\
 
406
  -a,  --append-output=FILE  append messages to FILE.\n"),
 
407
#ifdef ENABLE_DEBUG
 
408
    N_("\
 
409
  -d,  --debug               print lots of debugging information.\n"),
 
410
#endif
 
411
    N_("\
 
412
  -q,  --quiet               quiet (no output).\n"),
 
413
    N_("\
 
414
  -v,  --verbose             be verbose (this is the default).\n"),
 
415
    N_("\
 
416
  -nv, --no-verbose          turn off verboseness, without being quiet.\n"),
 
417
    N_("\
 
418
  -i,  --input-file=FILE     download URLs found in FILE.\n"),
 
419
    N_("\
 
420
  -F,  --force-html          treat input file as HTML.\n"),
 
421
    N_("\
 
422
  -B,  --base=URL            prepends URL to relative links in -F -i file.\n"),
 
423
    "\n",
 
424
 
 
425
    N_("\
 
426
Download:\n"),
 
427
    N_("\
 
428
  -t,  --tries=NUMBER            set number of retries to NUMBER (0 unlimits).\n"),
 
429
    N_("\
 
430
       --retry-connrefused       retry even if connection is refused.\n"),
 
431
    N_("\
 
432
  -O,  --output-document=FILE    write documents to FILE.\n"),
 
433
    N_("\
 
434
  -nc, --no-clobber              skip downloads that would download to\n\
 
435
                                 existing files.\n"),
 
436
    N_("\
 
437
  -c,  --continue                resume getting a partially-downloaded file.\n"),
 
438
    N_("\
 
439
       --progress=TYPE           select progress gauge type.\n"),
 
440
    N_("\
 
441
  -N,  --timestamping            don't re-retrieve files unless newer than\n\
 
442
                                 local.\n"),
 
443
    N_("\
 
444
  -S,  --server-response         print server response.\n"),
 
445
    N_("\
 
446
       --spider                  don't download anything.\n"),
 
447
    N_("\
 
448
  -T,  --timeout=SECONDS         set all timeout values to SECONDS.\n"),
 
449
    N_("\
 
450
       --dns-timeout=SECS        set the DNS lookup timeout to SECS.\n"),
 
451
    N_("\
 
452
       --connect-timeout=SECS    set the connect timeout to SECS.\n"),
 
453
    N_("\
 
454
       --read-timeout=SECS       set the read timeout to SECS.\n"),
 
455
    N_("\
 
456
  -w,  --wait=SECONDS            wait SECONDS between retrievals.\n"),
 
457
    N_("\
 
458
       --waitretry=SECONDS       wait 1..SECONDS between retries of a retrieval.\n"),
 
459
    N_("\
 
460
       --random-wait             wait from 0...2*WAIT secs between retrievals.\n"),
 
461
    N_("\
 
462
  -Y,  --proxy                   explicitly turn on proxy.\n"),
 
463
    N_("\
 
464
       --no-proxy                explicitly turn off proxy.\n"),
 
465
    N_("\
 
466
  -Q,  --quota=NUMBER            set retrieval quota to NUMBER.\n"),
 
467
    N_("\
 
468
       --bind-address=ADDRESS    bind to ADDRESS (hostname or IP) on local host.\n"),
 
469
    N_("\
 
470
       --limit-rate=RATE         limit download rate to RATE.\n"),
 
471
    N_("\
 
472
       --no-dns-cache            disable caching DNS lookups.\n"),
 
473
    N_("\
 
474
       --restrict-file-names=OS  restrict chars in file names to ones OS allows.\n"),
 
475
#ifdef ENABLE_IPV6
 
476
    N_("\
 
477
  -4,  --inet4-only              connect only to IPv4 addresses.\n"),
 
478
    N_("\
 
479
  -6,  --inet6-only              connect only to IPv6 addresses.\n"),
 
480
    N_("\
 
481
       --prefer-family=FAMILY    connect first to addresses of specified family,\n\
 
482
                                 one of IPv6, IPv4, or none.\n"),
 
483
#endif
 
484
    N_("\
 
485
       --user=USER               set both ftp and http user to USER.\n"),
 
486
    N_("\
 
487
       --password=PASS           set both ftp and http password to PASS.\n"),
 
488
    "\n",
 
489
 
 
490
    N_("\
 
491
Directories:\n"),
 
492
    N_("\
 
493
  -nd, --no-directories           don't create directories.\n"),
 
494
    N_("\
 
495
  -x,  --force-directories        force creation of directories.\n"),
 
496
    N_("\
 
497
  -nH, --no-host-directories      don't create host directories.\n"),
 
498
    N_("\
 
499
       --protocol-directories     use protocol name in directories.\n"),
 
500
    N_("\
 
501
  -P,  --directory-prefix=PREFIX  save files to PREFIX/...\n"),
 
502
    N_("\
 
503
       --cut-dirs=NUMBER          ignore NUMBER remote directory components.\n"),
 
504
    "\n",
 
505
 
 
506
    N_("\
 
507
HTTP options:\n"),
 
508
    N_("\
 
509
       --http-user=USER        set http user to USER.\n"),
 
510
    N_("\
 
511
       --http-password=PASS    set http password to PASS.\n"),
 
512
    N_("\
 
513
       --no-cache              disallow server-cached data.\n"),
 
514
    N_("\
 
515
  -E,  --html-extension        save HTML documents with `.html' extension.\n"),
 
516
    N_("\
 
517
       --ignore-length         ignore `Content-Length' header field.\n"),
 
518
    N_("\
 
519
       --header=STRING         insert STRING among the headers.\n"),
 
520
    N_("\
 
521
       --proxy-user=USER       set USER as proxy username.\n"),
 
522
    N_("\
 
523
       --proxy-password=PASS   set PASS as proxy password.\n"),
 
524
    N_("\
 
525
       --referer=URL           include `Referer: URL' header in HTTP request.\n"),
 
526
    N_("\
 
527
       --save-headers          save the HTTP headers to file.\n"),
 
528
    N_("\
 
529
  -U,  --user-agent=AGENT      identify as AGENT instead of Wget/VERSION.\n"),
 
530
    N_("\
 
531
       --no-http-keep-alive    disable HTTP keep-alive (persistent connections).\n"),
 
532
    N_("\
 
533
       --no-cookies            don't use cookies.\n"),
 
534
    N_("\
 
535
       --load-cookies=FILE     load cookies from FILE before session.\n"),
 
536
    N_("\
 
537
       --save-cookies=FILE     save cookies to FILE after session.\n"),
 
538
    N_("\
 
539
       --keep-session-cookies  load and save session (non-permanent) cookies.\n"),
 
540
    N_("\
 
541
       --post-data=STRING      use the POST method; send STRING as the data.\n"),
 
542
    N_("\
 
543
       --post-file=FILE        use the POST method; send contents of FILE.\n"),
 
544
    "\n",
 
545
 
 
546
#ifdef HAVE_SSL
 
547
    N_("\
 
548
HTTPS (SSL/TLS) options:\n"),
 
549
    N_("\
 
550
       --secure-protocol=PR     choose secure protocol, one of auto, SSLv2,\n\
 
551
                                SSLv3, and TLSv1.\n"),
 
552
    N_("\
 
553
       --no-check-certificate   don't validate the server's certificate.\n"),
 
554
    N_("\
 
555
       --certificate=FILE       client certificate file.\n"),
 
556
    N_("\
 
557
       --certificate-type=TYPE  client certificate type, PEM or DER.\n"),
 
558
    N_("\
 
559
       --private-key=FILE       private key file.\n"),
 
560
    N_("\
 
561
       --private-key-type=TYPE  private key type, PEM or DER.\n"),
 
562
    N_("\
 
563
       --ca-certificate=FILE    file with the bundle of CA's.\n"),
 
564
    N_("\
 
565
       --ca-directory=DIR       directory where hash list of CA's is stored.\n"),
 
566
    N_("\
 
567
       --random-file=FILE       file with random data for seeding the SSL PRNG.\n"),
 
568
    N_("\
 
569
       --egd-file=FILE          file naming the EGD socket with random data.\n"),
 
570
    "\n",
 
571
#endif /* HAVE_SSL */
 
572
 
 
573
    N_("\
 
574
FTP options:\n"),
 
575
    N_("\
 
576
       --ftp-user=USER         set ftp user to USER.\n"),
 
577
    N_("\
 
578
       --ftp-password=PASS     set ftp password to PASS.\n"),
 
579
    N_("\
 
580
       --no-remove-listing     don't remove `.listing' files.\n"),
 
581
    N_("\
 
582
       --no-glob               turn off FTP file name globbing.\n"),
 
583
    N_("\
 
584
       --no-passive-ftp        disable the \"passive\" transfer mode.\n"),
 
585
    N_("\
 
586
       --retr-symlinks         when recursing, get linked-to files (not dir).\n"),
 
587
    N_("\
 
588
       --preserve-permissions  preserve remote file permissions.\n"),
 
589
    "\n",
 
590
 
 
591
    N_("\
 
592
Recursive download:\n"),
 
593
    N_("\
 
594
  -r,  --recursive          specify recursive download.\n"),
 
595
    N_("\
 
596
  -l,  --level=NUMBER       maximum recursion depth (inf or 0 for infinite).\n"),
 
597
    N_("\
 
598
       --delete-after       delete files locally after downloading them.\n"),
 
599
    N_("\
 
600
  -k,  --convert-links      make links in downloaded HTML point to local files.\n"),
 
601
    N_("\
 
602
  -K,  --backup-converted   before converting file X, back up as X.orig.\n"),
 
603
    N_("\
 
604
  -m,  --mirror             shortcut option equivalent to -r -N -l inf -nr.\n"),
 
605
    N_("\
 
606
  -p,  --page-requisites    get all images, etc. needed to display HTML page.\n"),
 
607
    N_("\
 
608
       --strict-comments    turn on strict (SGML) handling of HTML comments.\n"),
 
609
    "\n",
 
610
 
 
611
    N_("\
 
612
Recursive accept/reject:\n"),
 
613
    N_("\
 
614
  -A,  --accept=LIST               comma-separated list of accepted extensions.\n"),
 
615
    N_("\
 
616
  -R,  --reject=LIST               comma-separated list of rejected extensions.\n"),
 
617
    N_("\
 
618
  -D,  --domains=LIST              comma-separated list of accepted domains.\n"),
 
619
    N_("\
 
620
       --exclude-domains=LIST      comma-separated list of rejected domains.\n"),
 
621
    N_("\
 
622
       --follow-ftp                follow FTP links from HTML documents.\n"),
 
623
    N_("\
 
624
       --follow-tags=LIST          comma-separated list of followed HTML tags.\n"),
 
625
    N_("\
 
626
       --ignore-tags=LIST          comma-separated list of ignored HTML tags.\n"),
 
627
    N_("\
 
628
  -H,  --span-hosts                go to foreign hosts when recursive.\n"),
 
629
    N_("\
 
630
  -L,  --relative                  follow relative links only.\n"),
 
631
    N_("\
 
632
  -I,  --include-directories=LIST  list of allowed directories.\n"),
 
633
    N_("\
 
634
  -X,  --exclude-directories=LIST  list of excluded directories.\n"),
 
635
    N_("\
 
636
  -np, --no-parent                 don't ascend to the parent directory.\n"),
 
637
    "\n",
 
638
 
 
639
    N_("Mail bug reports and suggestions to <bug-wget@gnu.org>.\n")
 
640
  };
 
641
 
 
642
  int i;
 
643
 
135
644
  printf (_("GNU Wget %s, a non-interactive network retriever.\n"),
136
645
          version_string);
137
646
  print_usage ();
138
 
  /* Had to split this in parts, so the #@@#%# Ultrix compiler and cpp
139
 
     don't bitch.  Also, it makes translation much easier.  */
140
 
  fputs (_("\
141
 
\n\
142
 
Mandatory arguments to long options are mandatory for short options too.\n\
143
 
\n"), stdout);
144
 
  fputs (_("\
145
 
Startup:\n\
146
 
  -V,  --version           display the version of Wget and exit.\n\
147
 
  -h,  --help              print this help.\n\
148
 
  -b,  --background        go to background after startup.\n\
149
 
  -e,  --execute=COMMAND   execute a `.wgetrc\'-style command.\n\
150
 
\n"), stdout);
151
 
  fputs (_("\
152
 
Logging and input file:\n\
153
 
  -o,  --output-file=FILE     log messages to FILE.\n\
154
 
  -a,  --append-output=FILE   append messages to FILE.\n\
155
 
  -d,  --debug                print debug output.\n\
156
 
  -q,  --quiet                quiet (no output).\n\
157
 
  -v,  --verbose              be verbose (this is the default).\n\
158
 
  -nv, --non-verbose          turn off verboseness, without being quiet.\n\
159
 
  -i,  --input-file=FILE      download URLs found in FILE.\n\
160
 
  -F,  --force-html           treat input file as HTML.\n\
161
 
  -B,  --base=URL             prepends URL to relative links in -F -i file.\n\
162
 
\n"),stdout);
163
 
  fputs (_("\
164
 
Download:\n\
165
 
  -t,  --tries=NUMBER           set number of retries to NUMBER (0 unlimits).\n\
166
 
       --retry-connrefused      retry even if connection is refused.\n\
167
 
  -O   --output-document=FILE   write documents to FILE.\n\
168
 
  -nc, --no-clobber             don\'t clobber existing files or use .# suffixes.\n\
169
 
  -c,  --continue               resume getting a partially-downloaded file.\n\
170
 
       --progress=TYPE          select progress gauge type.\n\
171
 
  -N,  --timestamping           don\'t re-retrieve files unless newer than local.\n\
172
 
  -S,  --server-response        print server response.\n\
173
 
       --spider                 don\'t download anything.\n\
174
 
  -T,  --timeout=SECONDS        set all timeout values to SECONDS.\n\
175
 
       --dns-timeout=SECS       set the DNS lookup timeout to SECS.\n\
176
 
       --connect-timeout=SECS   set the connect timeout to SECS.\n\
177
 
       --read-timeout=SECS      set the read timeout to SECS.\n\
178
 
  -w,  --wait=SECONDS           wait SECONDS between retrievals.\n\
179
 
       --waitretry=SECONDS      wait 1...SECONDS between retries of a retrieval.\n\
180
 
       --random-wait            wait from 0...2*WAIT secs between retrievals.\n\
181
 
  -Y,  --proxy=on/off           turn proxy on or off.\n\
182
 
  -Q,  --quota=NUMBER           set retrieval quota to NUMBER.\n\
183
 
       --bind-address=ADDRESS   bind to ADDRESS (hostname or IP) on local host.\n\
184
 
       --limit-rate=RATE        limit download rate to RATE.\n\
185
 
       --dns-cache=off          disable caching DNS lookups.\n\
186
 
       --restrict-file-names=OS restrict chars in file names to ones OS allows.\n\
187
 
\n"), stdout);
188
 
  fputs (_("\
189
 
Directories:\n\
190
 
  -nd, --no-directories            don\'t create directories.\n\
191
 
  -x,  --force-directories         force creation of directories.\n\
192
 
  -nH, --no-host-directories       don\'t create host directories.\n\
193
 
  -P,  --directory-prefix=PREFIX   save files to PREFIX/...\n\
194
 
       --cut-dirs=NUMBER           ignore NUMBER remote directory components.\n\
195
 
\n"), stdout);
196
 
  fputs (_("\
197
 
HTTP options:\n\
198
 
       --http-user=USER      set http user to USER.\n\
199
 
       --http-passwd=PASS    set http password to PASS.\n\
200
 
  -C,  --cache=on/off        (dis)allow server-cached data (normally allowed).\n\
201
 
  -E,  --html-extension      save all text/html documents with .html extension.\n\
202
 
       --ignore-length       ignore `Content-Length\' header field.\n\
203
 
       --header=STRING       insert STRING among the headers.\n\
204
 
       --proxy-user=USER     set USER as proxy username.\n\
205
 
       --proxy-passwd=PASS   set PASS as proxy password.\n\
206
 
       --referer=URL         include `Referer: URL\' header in HTTP request.\n\
207
 
  -s,  --save-headers        save the HTTP headers to file.\n\
208
 
  -U,  --user-agent=AGENT    identify as AGENT instead of Wget/VERSION.\n\
209
 
       --no-http-keep-alive  disable HTTP keep-alive (persistent connections).\n\
210
 
       --cookies=off         don't use cookies.\n\
211
 
       --load-cookies=FILE   load cookies from FILE before session.\n\
212
 
       --save-cookies=FILE   save cookies to FILE after session.\n\
213
 
       --post-data=STRING    use the POST method; send STRING as the data.\n\
214
 
       --post-file=FILE      use the POST method; send contents of FILE.\n\
215
 
\n"), stdout);
216
 
#ifdef HAVE_SSL
217
 
  fputs (_("\
218
 
HTTPS (SSL) options:\n\
219
 
       --sslcertfile=FILE     optional client certificate.\n\
220
 
       --sslcertkey=KEYFILE   optional keyfile for this certificate.\n\
221
 
       --egd-file=FILE        file name of the EGD socket.\n\
222
 
       --sslcadir=DIR         dir where hash list of CA's are stored.\n\
223
 
       --sslcafile=FILE       file with bundle of CA's\n\
224
 
       --sslcerttype=0/1      Client-Cert type 0=PEM (default) / 1=ASN1 (DER)\n\
225
 
       --sslcheckcert=0/1     Check the server cert agenst given CA\n\
226
 
       --sslprotocol=0-3      choose SSL protocol; 0=automatic,\n\
227
 
                              1=SSLv2 2=SSLv3 3=TLSv1\n\
228
 
\n"), stdout);
229
 
#endif
230
 
  fputs (_("\
231
 
FTP options:\n\
232
 
  -nr, --dont-remove-listing   don\'t remove `.listing\' files.\n\
233
 
  -g,  --glob=on/off           turn file name globbing on or off.\n\
234
 
       --passive-ftp           use the \"passive\" transfer mode.\n\
235
 
       --retr-symlinks         when recursing, get linked-to files (not dirs).\n\
236
 
\n"), stdout);
237
 
  fputs (_("\
238
 
Recursive retrieval:\n\
239
 
  -r,  --recursive          recursive download.\n\
240
 
  -l,  --level=NUMBER       maximum recursion depth (inf or 0 for infinite).\n\
241
 
       --delete-after       delete files locally after downloading them.\n\
242
 
  -k,  --convert-links      convert non-relative links to relative.\n\
243
 
  -K,  --backup-converted   before converting file X, back up as X.orig.\n\
244
 
  -m,  --mirror             shortcut option equivalent to -r -N -l inf -nr.\n\
245
 
  -p,  --page-requisites    get all images, etc. needed to display HTML page.\n\
246
 
       --strict-comments    turn on strict (SGML) handling of HTML comments.\n\
247
 
\n"), stdout);
248
 
  fputs (_("\
249
 
Recursive accept/reject:\n\
250
 
  -A,  --accept=LIST                comma-separated list of accepted extensions.\n\
251
 
  -R,  --reject=LIST                comma-separated list of rejected extensions.\n\
252
 
  -D,  --domains=LIST               comma-separated list of accepted domains.\n\
253
 
       --exclude-domains=LIST       comma-separated list of rejected domains.\n\
254
 
       --follow-ftp                 follow FTP links from HTML documents.\n\
255
 
       --follow-tags=LIST           comma-separated list of followed HTML tags.\n\
256
 
  -G,  --ignore-tags=LIST           comma-separated list of ignored HTML tags.\n\
257
 
  -H,  --span-hosts                 go to foreign hosts when recursive.\n\
258
 
  -L,  --relative                   follow relative links only.\n\
259
 
  -I,  --include-directories=LIST   list of allowed directories.\n\
260
 
  -X,  --exclude-directories=LIST   list of excluded directories.\n\
261
 
  -np, --no-parent                  don\'t ascend to the parent directory.\n\
262
 
\n"), stdout);
263
 
  fputs (_("Mail bug reports and suggestions to <bug-wget@gnu.org>.\n"),
 
647
 
 
648
  for (i = 0; i < countof (help); i++)
 
649
    fputs (_(help[i]), stdout);
 
650
 
 
651
  exit (0);
 
652
}
 
653
 
 
654
static void
 
655
print_version (void)
 
656
{
 
657
  printf ("GNU Wget %s\n\n", version_string);
 
658
  fputs (_("\
 
659
Copyright (C) 2005 Free Software Foundation, Inc.\n"), stdout);
 
660
  fputs (_("\
 
661
This program is distributed in the hope that it will be useful,\n\
 
662
but WITHOUT ANY WARRANTY; without even the implied warranty of\n\
 
663
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n\
 
664
GNU General Public License for more details.\n"), stdout);
 
665
  fputs (_("\nOriginally written by Hrvoje Niksic <hniksic@xemacs.org>.\n"),
264
666
         stdout);
 
667
  exit (0);
265
668
}
266
669
 
267
670
int
268
671
main (int argc, char *const *argv)
269
672
{
270
673
  char **url, **t;
271
 
  int i, c, nurl, status, append_to_log;
272
 
 
273
 
  static struct option long_options[] =
274
 
  {
275
 
    /* Options without arguments: */
276
 
    { "background", no_argument, NULL, 'b' },
277
 
    { "backup-converted", no_argument, NULL, 'K' },
278
 
    { "continue", no_argument, NULL, 'c' },
279
 
    { "convert-links", no_argument, NULL, 'k' },
280
 
    { "debug", no_argument, NULL, 'd' },
281
 
    { "delete-after", no_argument, NULL, 136 },
282
 
    { "dont-remove-listing", no_argument, NULL, 149 },
283
 
    { "follow-ftp", no_argument, NULL, 142 },
284
 
    { "force-directories", no_argument, NULL, 'x' },
285
 
    { "force-hier", no_argument, NULL, 'x' }, /* obsolete */
286
 
    { "force-html", no_argument, NULL, 'F'},
287
 
    { "help", no_argument, NULL, 'h' },
288
 
    { "html-extension", no_argument, NULL, 'E' },
289
 
    { "ignore-length", no_argument, NULL, 138 },
290
 
    { "mirror", no_argument, NULL, 'm' },
291
 
    { "no-clobber", no_argument, NULL, 141 },
292
 
    { "no-directories", no_argument, NULL, 147 },
293
 
    { "no-host-directories", no_argument, NULL, 148 },
294
 
    { "no-host-lookup", no_argument, NULL, 150 },
295
 
    { "no-http-keep-alive", no_argument, NULL, 156 },
296
 
    { "no-parent", no_argument, NULL, 133 },
297
 
    { "non-verbose", no_argument, NULL, 146 },
298
 
    { "passive-ftp", no_argument, NULL, 139 },
299
 
    { "page-requisites", no_argument, NULL, 'p' },
300
 
    { "quiet", no_argument, NULL, 'q' },
301
 
    { "random-wait", no_argument, NULL, 165 },
302
 
    { "recursive", no_argument, NULL, 'r' },
303
 
    { "relative", no_argument, NULL, 'L' },
304
 
    { "retr-symlinks", no_argument, NULL, 137 },
305
 
    { "retry-connrefused", no_argument, NULL, 174 },
306
 
    { "save-headers", no_argument, NULL, 's' },
307
 
    { "server-response", no_argument, NULL, 'S' },
308
 
    { "span-hosts", no_argument, NULL, 'H' },
309
 
    { "spider", no_argument, NULL, 132 },
310
 
    { "strict-comments", no_argument, NULL, 177 },
311
 
    { "timestamping", no_argument, NULL, 'N' },
312
 
    { "verbose", no_argument, NULL, 'v' },
313
 
    { "version", no_argument, NULL, 'V' },
314
 
 
315
 
    /* Options accepting an argument: */
316
 
    { "accept", required_argument, NULL, 'A' },
317
 
    { "append-output", required_argument, NULL, 'a' },
318
 
    { "backups", required_argument, NULL, 151 }, /* undocumented */
319
 
    { "base", required_argument, NULL, 'B' },
320
 
    { "bind-address", required_argument, NULL, 155 },
321
 
    { "cache", required_argument, NULL, 'C' },
322
 
    { "connect-timeout", required_argument, NULL, 180 },
323
 
    { "cookies", required_argument, NULL, 160 },
324
 
    { "cut-dirs", required_argument, NULL, 145 },
325
 
    { "dns-timeout", required_argument, NULL, 178 },
326
 
    { "directory-prefix", required_argument, NULL, 'P' },
327
 
    { "dns-cache", required_argument, NULL, 175 },
328
 
    { "domains", required_argument, NULL, 'D' },
329
 
    { "dot-style", required_argument, NULL, 134 },
330
 
    { "execute", required_argument, NULL, 'e' },
331
 
    { "exclude-directories", required_argument, NULL, 'X' },
332
 
    { "exclude-domains", required_argument, NULL, 140 },
333
 
    { "follow-tags", required_argument, NULL, 153 },
334
 
    { "glob", required_argument, NULL, 'g' },
335
 
    { "header", required_argument, NULL, 131 },
336
 
    { "htmlify", required_argument, NULL, 135 },
337
 
    { "http-passwd", required_argument, NULL, 130 },
338
 
    { "http-user", required_argument, NULL, 129 },
339
 
    { "ignore-tags", required_argument, NULL, 'G' },
340
 
    { "include-directories", required_argument, NULL, 'I' },
341
 
    { "input-file", required_argument, NULL, 'i' },
342
 
    { "level", required_argument, NULL, 'l' },
343
 
    { "limit-rate", required_argument, NULL, 164 },
344
 
    { "load-cookies", required_argument, NULL, 161 },
345
 
    { "no", required_argument, NULL, 'n' },
346
 
    { "output-document", required_argument, NULL, 'O' },
347
 
    { "output-file", required_argument, NULL, 'o' },
348
 
    { "post-data", required_argument, NULL, 167 },
349
 
    { "post-file", required_argument, NULL, 168 },
350
 
    { "progress", required_argument, NULL, 163 },
351
 
    { "proxy", required_argument, NULL, 'Y' },
352
 
    { "proxy-passwd", required_argument, NULL, 144 },
353
 
    { "proxy-user", required_argument, NULL, 143 },
354
 
    { "quota", required_argument, NULL, 'Q' },
355
 
    { "read-timeout", required_argument, NULL, 179 },
356
 
    { "reject", required_argument, NULL, 'R' },
357
 
    { "restrict-file-names", required_argument, NULL, 176 },
358
 
    { "save-cookies", required_argument, NULL, 162 },
359
 
    { "timeout", required_argument, NULL, 'T' },
360
 
    { "tries", required_argument, NULL, 't' },
361
 
    { "user-agent", required_argument, NULL, 'U' },
362
 
    { "referer", required_argument, NULL, 157 },
363
 
    { "use-proxy", required_argument, NULL, 'Y' },
364
 
#ifdef HAVE_SSL
365
 
    { "sslcertfile", required_argument, NULL, 158 },
366
 
    { "sslcertkey", required_argument, NULL, 159 },
367
 
    { "egd-file", required_argument, NULL, 166 },
368
 
    { "sslcadir",         required_argument, NULL, 169},
369
 
    { "sslcafile",        required_argument, NULL, 170},
370
 
    { "sslcerttype",      required_argument, NULL, 171},
371
 
    { "sslcheckcert",     required_argument, NULL, 172},
372
 
    { "sslprotocol",      required_argument, NULL, 173},
373
 
#endif /* HAVE_SSL */
374
 
    { "wait", required_argument, NULL, 'w' },
375
 
    { "waitretry", required_argument, NULL, 152 },
376
 
    { 0, 0, 0, 0 }
377
 
  };
 
674
  int i, ret, longindex;
 
675
  int nurl, status;
 
676
  int append_to_log = 0;
378
677
 
379
678
  i18n_initialize ();
380
679
 
381
 
  append_to_log = 0;
382
 
 
383
680
  /* Construct the name of the executable, without the directory part.  */
384
681
  exec_name = strrchr (argv[0], PATH_SEPARATOR);
385
682
  if (!exec_name)
388
685
    ++exec_name;
389
686
 
390
687
#ifdef WINDOWS
391
 
  windows_main_junk (&argc, (char **) argv, (char **) &exec_name);
 
688
  /* Drop extension (typically .EXE) from executable filename. */
 
689
  windows_main (&argc, (char **) argv, (char **) &exec_name);
392
690
#endif
393
691
 
394
 
  initialize (); /* sets option defaults; reads the system wgetrc and .wgetrc */
 
692
  /* Set option defaults; read the system wgetrc and ~/.wgetrc.  */
 
693
  initialize ();
395
694
 
396
 
  /* [Is the order of the option letters significant?  If not, they should be
397
 
      alphabetized, like the long_options.  The only thing I know for sure is
398
 
      that the options with required arguments must be followed by a ':'.
399
 
      -- Dan Harkless <wget@harkless.org>] */
400
 
  while ((c = getopt_long (argc, argv, "\
401
 
hpVqvdkKsxmNWrHSLcFbEY:G:g:T:U:O:l:n:i:o:a:t:D:A:R:P:B:e:Q:X:I:w:C:",
402
 
                           long_options, (int *)0)) != EOF)
 
695
  init_switches ();
 
696
  longindex = -1;
 
697
  while ((ret = getopt_long (argc, argv,
 
698
                             short_options, long_options, &longindex)) != -1)
403
699
    {
404
 
      switch (c)
405
 
        {
406
 
          /* Options without arguments: */
407
 
        case 132:
408
 
          setoptval ("spider", "on");
409
 
          break;
410
 
        case 133:
411
 
          setoptval ("noparent", "on");
412
 
          break;
413
 
        case 136:
414
 
          setoptval ("deleteafter", "on");
415
 
          break;
416
 
        case 137:
417
 
          setoptval ("retrsymlinks", "on");
418
 
          break;
419
 
        case 138:
420
 
          setoptval ("ignorelength", "on");
421
 
          break;
422
 
        case 139:
423
 
          setoptval ("passiveftp", "on");
424
 
          break;
425
 
        case 141:
426
 
          setoptval ("noclobber", "on");
427
 
          break;
428
 
        case 142:
429
 
          setoptval ("followftp", "on");
430
 
          break;
431
 
        case 145:
432
 
          setoptval ("cutdirs", optarg);
433
 
          break;
434
 
        case 146:
435
 
          setoptval ("verbose", "off");
436
 
          break;
437
 
        case 147:
438
 
          setoptval ("dirstruct", "off");
439
 
          break;
440
 
        case 148:
441
 
          setoptval ("addhostdir", "off");
442
 
          break;
443
 
        case 149:
444
 
          setoptval ("removelisting", "off");
445
 
          break;
446
 
        case 155:
447
 
          setoptval ("bindaddress", optarg);
448
 
          break;
449
 
        case 156:
450
 
          setoptval ("httpkeepalive", "off");
451
 
          break;
452
 
        case 165:
453
 
          setoptval ("randomwait", "on");
454
 
          break;
455
 
        case 'b':
456
 
          setoptval ("background", "on");
457
 
          break;
458
 
        case 'c':
459
 
          setoptval ("continue", "on");
460
 
          break;
461
 
        case 'd':
462
 
#ifdef ENABLE_DEBUG
463
 
          setoptval ("debug", "on");
464
 
#else
465
 
          fprintf (stderr, _("%s: debug support not compiled in.\n"),
466
 
                   exec_name);
467
 
#endif
468
 
          break;
469
 
        case 'E':
470
 
          setoptval ("htmlextension", "on");
471
 
          break;
472
 
        case 'F':
473
 
          setoptval ("forcehtml", "on");
474
 
          break;
475
 
        case 'H':
476
 
          setoptval ("spanhosts", "on");
477
 
          break;
478
 
        case 'h':
479
 
          print_help ();
480
 
#ifdef WINDOWS
481
 
          ws_help (exec_name);
482
 
#endif
483
 
          exit (0);
484
 
          break;
485
 
        case 'K':
486
 
          setoptval ("backupconverted", "on");
487
 
          break;
488
 
        case 'k':
489
 
          setoptval ("convertlinks", "on");
490
 
          break;
491
 
        case 'L':
492
 
          setoptval ("relativeonly", "on");
493
 
          break;
494
 
        case 'm':
495
 
          setoptval ("mirror", "on");
496
 
          break;
497
 
        case 'N':
498
 
          setoptval ("timestamping", "on");
499
 
          break;
500
 
        case 'p':
501
 
          setoptval ("pagerequisites", "on");
502
 
          break;
503
 
        case 'S':
504
 
          setoptval ("serverresponse", "on");
505
 
          break;
506
 
        case 's':
507
 
          setoptval ("saveheaders", "on");
508
 
          break;
509
 
        case 'q':
510
 
          setoptval ("quiet", "on");
511
 
          break;
512
 
        case 'r':
513
 
          setoptval ("recursive", "on");
514
 
          break;
515
 
        case 'V':
516
 
          printf ("GNU Wget %s\n\n", version_string);
517
 
          printf ("%s", _("\
518
 
Copyright (C) 2003 Free Software Foundation, Inc.\n"));
519
 
          printf ("%s", _("\
520
 
This program is distributed in the hope that it will be useful,\n\
521
 
but WITHOUT ANY WARRANTY; without even the implied warranty of\n\
522
 
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n\
523
 
GNU General Public License for more details.\n"));
524
 
          printf (_("\nOriginally written by Hrvoje Niksic <hniksic@xemacs.org>.\n"));
525
 
          exit (0);
526
 
          break;
527
 
        case 'v':
528
 
          setoptval ("verbose", "on");
529
 
          break;
530
 
        case 'x':
531
 
          setoptval ("dirstruct", "on");
532
 
          break;
533
 
        case 174:
534
 
          setoptval ("retryconnrefused", "on");
535
 
          break;
536
 
        case 177:
537
 
          setoptval ("strictcomments", "on");
538
 
          break;
539
 
 
540
 
          /* Options accepting an argument: */
541
 
        case 129:
542
 
          setoptval ("httpuser", optarg);
543
 
          break;
544
 
        case 130:
545
 
          setoptval ("httppasswd", optarg);
546
 
          break;
547
 
        case 131:
548
 
          setoptval ("header", optarg);
549
 
          break;
550
 
        case 134:
551
 
          setoptval ("dotstyle", optarg);
552
 
          break;
553
 
        case 135:
554
 
          setoptval ("htmlify", optarg);
555
 
          break;
556
 
        case 140:
557
 
          setoptval ("excludedomains", optarg);
558
 
          break;
559
 
        case 143:
560
 
          setoptval ("proxyuser", optarg);
561
 
          break;
562
 
        case 144:
563
 
          setoptval ("proxypasswd", optarg);
564
 
          break;
565
 
        case 151:
566
 
          setoptval ("backups", optarg);
567
 
          break;
568
 
        case 152:
569
 
          setoptval ("waitretry", optarg);
570
 
          break;
571
 
        case 153:
572
 
          setoptval ("followtags", optarg);
573
 
          break;
574
 
        case 160:
575
 
          setoptval ("cookies", optarg);
576
 
          break;
577
 
        case 161:
578
 
          setoptval ("loadcookies", optarg);
579
 
          break;
580
 
        case 162:
581
 
          setoptval ("savecookies", optarg);
582
 
          break;
583
 
        case 163:
584
 
          setoptval ("progress", optarg);
585
 
          break;
586
 
        case 164:
587
 
          setoptval ("limitrate", optarg);
588
 
          break;
589
 
        case 157:
590
 
          setoptval ("referer", optarg);
591
 
          break;
592
 
#ifdef HAVE_SSL
593
 
        case 158:
594
 
          setoptval ("sslcertfile", optarg);
595
 
          break;
596
 
        case 159:
597
 
          setoptval ("sslcertkey", optarg);
598
 
          break;
599
 
        case 166:
600
 
          setoptval ("egdfile", optarg);
601
 
          break;
602
 
        case 169:
603
 
          setoptval ("sslcadir", optarg);
604
 
          break;
605
 
        case 170:
606
 
          setoptval ("sslcafile", optarg);
607
 
          break;
608
 
        case 171:
609
 
          setoptval ("sslcerttype", optarg);
610
 
          break;
611
 
        case 172:
612
 
          setoptval ("sslcheckcert", optarg);
613
 
          break;
614
 
        case 173:
615
 
          setoptval ("sslprotocol", optarg);
616
 
          break;
617
 
#endif /* HAVE_SSL */
618
 
        case 167:
619
 
          setoptval ("postdata", optarg);
620
 
          break;
621
 
        case 168:
622
 
          setoptval ("postfile", optarg);
623
 
          break;
624
 
        case 175:
625
 
          setoptval ("dnscache", optarg);
626
 
          break;
627
 
        case 176:
628
 
          setoptval ("restrictfilenames", optarg);
629
 
          break;
630
 
        case 178:
631
 
          setoptval ("dnstimeout", optarg);
632
 
          break;
633
 
        case 179:
634
 
          setoptval ("readtimeout", optarg);
635
 
          break;
636
 
        case 180:
637
 
          setoptval ("connecttimeout", optarg);
638
 
          break;
639
 
        case 'A':
640
 
          setoptval ("accept", optarg);
641
 
          break;
642
 
        case 'a':
643
 
          setoptval ("logfile", optarg);
 
700
      int val;
 
701
      struct cmdline_option *opt;
 
702
 
 
703
      /* If LONGINDEX is unchanged, it means RET is referring a short
 
704
         option.  */
 
705
      if (longindex == -1)
 
706
        {
 
707
          if (ret == '?')
 
708
            {
 
709
              print_usage ();
 
710
              printf ("\n");
 
711
              printf (_("Try `%s --help' for more options.\n"), exec_name);
 
712
              exit (2);
 
713
            }
 
714
          /* Find the short option character in the mapping.  */
 
715
          longindex = optmap[ret - 32];
 
716
        }
 
717
      val = long_options[longindex].val;
 
718
 
 
719
      /* Use the retrieved value to locate the option in the
 
720
         option_data array, and to see if we're dealing with the
 
721
         negated "--no-FOO" variant of the boolean option "--foo".  */
 
722
      opt = &option_data[val & ~BOOLEAN_NEG_MARKER];
 
723
      switch (opt->type)
 
724
        {
 
725
        case OPT_VALUE:
 
726
          setoptval (opt->data, optarg, opt->long_name);
 
727
          break;
 
728
        case OPT_BOOLEAN:
 
729
          if (optarg)
 
730
            /* The user has specified a value -- use it. */
 
731
            setoptval (opt->data, optarg, opt->long_name);
 
732
          else
 
733
            {
 
734
              /* NEG is true for `--no-FOO' style boolean options. */
 
735
              int neg = val & BOOLEAN_NEG_MARKER;
 
736
              setoptval (opt->data, neg ? "0" : "1", opt->long_name);
 
737
            }
 
738
          break;
 
739
        case OPT_FUNCALL:
 
740
          {
 
741
            void (*func) PARAMS ((void)) = (void (*) PARAMS ((void))) opt->data;
 
742
            func ();
 
743
          }
 
744
          break;
 
745
        case OPT__APPEND_OUTPUT:
 
746
          setoptval ("logfile", optarg, opt->long_name);
644
747
          append_to_log = 1;
645
748
          break;
646
 
        case 'B':
647
 
          setoptval ("base", optarg);
648
 
          break;
649
 
        case 'C':
650
 
          setoptval ("cache", optarg);
651
 
          break;
652
 
        case 'D':
653
 
          setoptval ("domains", optarg);
654
 
          break;
655
 
        case 'e':
 
749
        case OPT__EXECUTE:
656
750
          run_command (optarg);
657
751
          break;
658
 
        case 'G':
659
 
          setoptval ("ignoretags", optarg);
660
 
          break;
661
 
        case 'g':
662
 
          setoptval ("glob", optarg);
663
 
          break;
664
 
        case 'I':
665
 
          setoptval ("includedirectories", optarg);
666
 
          break;
667
 
        case 'i':
668
 
          setoptval ("input", optarg);
669
 
          break;
670
 
        case 'l':
671
 
          setoptval ("reclevel", optarg);
672
 
          break;
673
 
        case 'n':
 
752
        case OPT__NO:
674
753
          {
675
 
            /* #### What we really want here is --no-foo. */
 
754
            /* We support real --no-FOO flags now, but keep these
 
755
               short options for convenience and backward
 
756
               compatibility.  */
676
757
            char *p;
677
 
 
678
758
            for (p = optarg; *p; p++)
679
759
              switch (*p)
680
760
                {
681
761
                case 'v':
682
 
                  setoptval ("verbose", "off");
 
762
                  setoptval ("verbose", "0", opt->long_name);
683
763
                  break;
684
764
                case 'H':
685
 
                  setoptval ("addhostdir", "off");
 
765
                  setoptval ("addhostdir", "0", opt->long_name);
686
766
                  break;
687
767
                case 'd':
688
 
                  setoptval ("dirstruct", "off");
 
768
                  setoptval ("dirstruct", "0", opt->long_name);
689
769
                  break;
690
770
                case 'c':
691
 
                  setoptval ("noclobber", "on");
692
 
                  break;
693
 
                case 'r':
694
 
                  setoptval ("removelisting", "off");
 
771
                  setoptval ("noclobber", "1", opt->long_name);
695
772
                  break;
696
773
                case 'p':
697
 
                  setoptval ("noparent", "on");
698
 
                  break;
699
 
                case 'k':
700
 
                  setoptval ("httpkeepalive", "off");
 
774
                  setoptval ("noparent", "1", opt->long_name);
701
775
                  break;
702
776
                default:
703
777
                  printf (_("%s: illegal option -- `-n%c'\n"), exec_name, *p);
704
778
                  print_usage ();
705
779
                  printf ("\n");
706
 
                  printf (_("Try `%s --help\' for more options.\n"), exec_name);
 
780
                  printf (_("Try `%s --help' for more options.\n"), exec_name);
707
781
                  exit (1);
708
782
                }
709
783
            break;
710
784
          }
711
 
        case 'O':
712
 
          setoptval ("outputdocument", optarg);
713
 
          break;
714
 
        case 'o':
715
 
          setoptval ("logfile", optarg);
716
 
          break;
717
 
        case 'P':
718
 
          setoptval ("dirprefix", optarg);
719
 
          break;
720
 
        case 'Q':
721
 
          setoptval ("quota", optarg);
722
 
          break;
723
 
        case 'R':
724
 
          setoptval ("reject", optarg);
725
 
          break;
726
 
        case 'T':
727
 
          setoptval ("timeout", optarg);
728
 
          break;
729
 
        case 't':
730
 
          setoptval ("tries", optarg);
731
 
          break;
732
 
        case 'U':
733
 
          setoptval ("useragent", optarg);
734
 
          break;
735
 
        case 'w':
736
 
          setoptval ("wait", optarg);
737
 
          break;
738
 
        case 'X':
739
 
          setoptval ("excludedirectories", optarg);
740
 
          break;
741
 
        case 'Y':
742
 
          setoptval ("useproxy", optarg);
743
 
          break;
744
 
 
745
 
        case '?':
746
 
          print_usage ();
747
 
          printf ("\n");
748
 
          printf (_("Try `%s --help' for more options.\n"), exec_name);
749
 
          exit (0);
 
785
        case OPT__PARENT:
 
786
        case OPT__CLOBBER:
 
787
          {
 
788
            /* The wgetrc commands are named noparent and noclobber,
 
789
               so we must revert the meaning of the cmdline options
 
790
               before passing the value to setoptval.  */
 
791
            int flag = 1;
 
792
            if (optarg)
 
793
              flag = (*optarg == '1' || TOLOWER (*optarg) == 'y'
 
794
                      || (TOLOWER (optarg[0]) == 'o'
 
795
                          && TOLOWER (optarg[1]) == 'n'));
 
796
            setoptval (opt->type == OPT__PARENT ? "noparent" : "noclobber",
 
797
                       flag ? "0" : "1", opt->long_name);
 
798
            break;
 
799
          }
 
800
        case OPT__DONT_REMOVE_LISTING:
 
801
          setoptval ("removelisting", "0", opt->long_name);
750
802
          break;
751
803
        }
 
804
 
 
805
      longindex = -1;
752
806
    }
753
807
 
754
808
  /* All user options have now been processed, so it's now safe to do
755
809
     interoption dependency checks. */
756
810
 
757
811
  if (opt.reclevel == 0)
758
 
    opt.reclevel = INFINITE_RECURSION;  /* see wget.h for commentary on this */
 
812
    opt.reclevel = INFINITE_RECURSION; /* see recur.h for commentary on this */
759
813
 
760
814
  if (opt.page_requisites && !opt.recursive)
761
815
    {
762
 
      opt.recursive = TRUE;
 
816
      /* Don't set opt.recursive here because it would confuse the FTP
 
817
         code.  Instead, call retrieve_tree below when either
 
818
         page_requisites or recursive is requested.  */
763
819
      opt.reclevel = 0;
764
820
      if (!opt.no_dirstruct)
765
 
        opt.dirstruct = TRUE;  /* usually handled by cmd_spec_recursive() */
 
821
        opt.dirstruct = 1;      /* normally handled by cmd_spec_recursive() */
766
822
    }
767
823
 
768
824
  if (opt.verbose == -1)
782
838
      print_usage ();
783
839
      exit (1);
784
840
    }
 
841
#ifdef ENABLE_IPV6
 
842
  if (opt.ipv4_only && opt.ipv6_only)
 
843
    {
 
844
      printf (_("Cannot specify both --inet4-only and --inet6-only.\n"));
 
845
      print_usage ();
 
846
      exit (1);
 
847
    }
 
848
#endif
 
849
 
785
850
  nurl = argc - optind;
786
851
  if (!nurl && !opt.input_filename)
787
852
    {
815
880
    }
816
881
  url[i] = NULL;
817
882
 
818
 
  /* Change the title of console window on Windows.  #### I think this
819
 
     statement should belong to retrieve_url().  --hniksic.  */
820
 
#ifdef WINDOWS
821
 
  ws_changetitle (*url, nurl);
822
 
#endif
823
 
 
824
883
  /* Initialize logging.  */
825
884
  log_init (opt.lfilename, append_to_log);
826
885
 
830
889
  /* Open the output filename if necessary.  */
831
890
  if (opt.output_document)
832
891
    {
 
892
      extern FILE *output_stream;
 
893
      extern int output_stream_regular;
 
894
 
833
895
      if (HYPHENP (opt.output_document))
834
 
        opt.dfp = stdout;
 
896
        output_stream = stdout;
835
897
      else
836
898
        {
837
 
          struct stat st;
838
 
          opt.dfp = fopen (opt.output_document, opt.always_rest ? "ab" : "wb");
839
 
          if (opt.dfp == NULL)
 
899
          struct_stat st;
 
900
          output_stream = fopen (opt.output_document,
 
901
                                 opt.always_rest ? "ab" : "wb");
 
902
          if (output_stream == NULL)
840
903
            {
841
904
              perror (opt.output_document);
842
905
              exit (1);
843
906
            }
844
 
          if (fstat (fileno (opt.dfp), &st) == 0 && S_ISREG (st.st_mode))
845
 
            opt.od_known_regular = 1;
 
907
          if (fstat (fileno (output_stream), &st) == 0 && S_ISREG (st.st_mode))
 
908
            output_stream_regular = 1;
846
909
        }
847
910
    }
848
911
 
866
929
#endif
867
930
#endif /* HAVE_SIGNAL */
868
931
 
869
 
#ifdef HAVE_SSL
870
 
  /* Must call this before resolving any URLs because it has the power
871
 
     to disable `https'.  */
872
 
  ssl_init_prng ();
873
 
#endif
874
 
 
875
932
  status = RETROK;              /* initialize it, just-in-case */
876
933
  /* Retrieve the URLs from argument list.  */
877
934
  for (t = url; *t; t++)
879
936
      char *filename = NULL, *redirected_URL = NULL;
880
937
      int dt;
881
938
 
882
 
      if (opt.recursive && url_scheme (*t) != SCHEME_FTP)
 
939
      if ((opt.recursive || opt.page_requisites)
 
940
          && url_scheme (*t) != SCHEME_FTP)
883
941
        status = retrieve_tree (*t);
884
942
      else
885
943
        status = retrieve_url (*t, &filename, &redirected_URL, NULL, &dt);
892
950
            logprintf (LOG_NOTQUIET, "unlink: %s\n", strerror (errno));
893
951
        }
894
952
 
895
 
      FREE_MAYBE (redirected_URL);
896
 
      FREE_MAYBE (filename);
 
953
      xfree_null (redirected_URL);
 
954
      xfree_null (filename);
897
955
    }
898
956
 
899
957
  /* And then from the input file, if any.  */
906
964
                   opt.input_filename);
907
965
    }
908
966
  /* Print the downloaded sum.  */
909
 
  if (opt.recursive
 
967
  if (opt.recursive || opt.page_requisites
910
968
      || nurl > 1
911
969
      || (opt.input_filename && total_downloaded_bytes != 0))
912
970
    {
913
971
      logprintf (LOG_NOTQUIET,
914
972
                 _("\nFINISHED --%s--\nDownloaded: %s bytes in %d files\n"),
915
 
                 time_str (NULL), legible_large_int (total_downloaded_bytes),
 
973
                 time_str (NULL), with_thousand_seps_large (total_downloaded_bytes),
916
974
                 opt.numurls);
917
975
      /* Print quota warning, if exceeded.  */
918
976
      if (opt.quota && total_downloaded_bytes > opt.quota)
919
977
        logprintf (LOG_NOTQUIET,
920
978
                   _("Download quota (%s bytes) EXCEEDED!\n"),
921
 
                   legible (opt.quota));
 
979
                   with_thousand_seps_large (opt.quota));
922
980
    }
923
981
 
924
 
  if (opt.cookies_output && wget_cookie_jar)
925
 
    cookie_jar_save (wget_cookie_jar, opt.cookies_output);
 
982
  if (opt.cookies_output)
 
983
    save_cookies ();
926
984
 
927
985
  if (opt.convert_links && !opt.delete_after)
928
986
    convert_all_links ();
953
1011
static RETSIGTYPE
954
1012
redirect_output_signal (int sig)
955
1013
{
956
 
  char *signal_name = (sig == SIGHUP ? "SIGHUP" :
957
 
                       (sig == SIGUSR1 ? "SIGUSR1" :
958
 
                        "WTF?!"));
 
1014
  const char *signal_name = (sig == SIGHUP ? "SIGHUP" :
 
1015
                             (sig == SIGUSR1 ? "SIGUSR1" :
 
1016
                              "WTF?!"));
959
1017
  log_request_redirect_output (signal_name);
960
1018
  progress_schedule_redirect ();
961
1019
  signal (sig, redirect_output_signal);