X-Git-Url: http://sjero.net/git/?p=wget;a=blobdiff_plain;f=src%2Fmain.c;h=39fcff44e1b8a4a066d0a50858c63ef6bb59ea43;hp=e5a60e66c06ae6dad274b4549e8fb599e52cf9e3;hb=320cfdcb658e8d6556ae9dfd902c2db1db866a6b;hpb=6b5c0c742d251dd299ad46b43ea6bb576b7b8997 diff --git a/src/main.c b/src/main.c index e5a60e66..39fcff44 100644 --- a/src/main.c +++ b/src/main.c @@ -56,7 +56,6 @@ as that of the covered work. */ #include "http.h" /* for save_cookies */ #include "ptimer.h" #include "warc.h" -#include "closeout.h" #include #include #include @@ -129,12 +128,6 @@ static void print_version (void); # define IF_SSL(x) NULL #endif -#ifdef ENABLE_DEBUG -# define WHEN_DEBUG(x) x -#else -# define WHEN_DEBUG(x) NULL -#endif - struct cmdline_option { const char *long_name; char short_name; @@ -168,6 +161,8 @@ static struct cmdline_option option_data[] = { "backups", 0, OPT_BOOLEAN, "backups", -1 }, { "base", 'B', OPT_VALUE, "base", -1 }, { "bind-address", 0, OPT_VALUE, "bindaddress", -1 }, + { "body-data", 0, OPT_VALUE, "bodydata", -1 }, + { "body-file", 0, OPT_VALUE, "bodyfile", -1 }, { IF_SSL ("ca-certificate"), 0, OPT_VALUE, "cacertificate", -1 }, { IF_SSL ("ca-directory"), 0, OPT_VALUE, "cadirectory", -1 }, { "cache", 0, OPT_BOOLEAN, "cache", -1 }, @@ -183,7 +178,7 @@ static struct cmdline_option option_data[] = { "content-on-error", 0, OPT_BOOLEAN, "contentonerror", -1 }, { "cookies", 0, OPT_BOOLEAN, "cookies", -1 }, { "cut-dirs", 0, OPT_VALUE, "cutdirs", -1 }, - { WHEN_DEBUG ("debug"), 'd', OPT_BOOLEAN, "debug", -1 }, + { "debug", 'd', OPT_BOOLEAN, "debug", -1 }, { "default-page", 0, OPT_VALUE, "defaultpage", -1 }, { "delete-after", 0, OPT_BOOLEAN, "deleteafter", -1 }, { "directories", 0, OPT_BOOLEAN, "dirstruct", -1 }, @@ -216,6 +211,7 @@ static 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 }, + { IF_SSL ("https-only"), 0, OPT_BOOLEAN, "httpsonly", -1 }, { "ignore-case", 0, OPT_BOOLEAN, "ignorecase", -1 }, { "ignore-length", 0, OPT_BOOLEAN, "ignorelength", -1 }, { "ignore-tags", 0, OPT_VALUE, "ignoretags", -1 }, @@ -232,9 +228,11 @@ static struct cmdline_option option_data[] = { "load-cookies", 0, OPT_VALUE, "loadcookies", -1 }, { "local-encoding", 0, OPT_VALUE, "localencoding", -1 }, { "max-redirect", 0, OPT_VALUE, "maxredirect", -1 }, + { "method", 0, OPT_VALUE, "method", -1 }, { "mirror", 'm', OPT_BOOLEAN, "mirror", -1 }, { "no", 'n', OPT__NO, NULL, required_argument }, { "no-clobber", 0, OPT_BOOLEAN, "noclobber", -1 }, + { "no-config", 0, OPT_BOOLEAN, "noconfig", -1}, { "no-parent", 0, OPT_BOOLEAN, "noparent", -1 }, { "output-document", 'O', OPT_VALUE, "outputdocument", -1 }, { "output-file", 'o', OPT_VALUE, "logfile", -1 }, @@ -278,6 +276,7 @@ static struct cmdline_option option_data[] = { "server-response", 'S', OPT_BOOLEAN, "serverresponse", -1 }, { "span-hosts", 'H', OPT_BOOLEAN, "spanhosts", -1 }, { "spider", 0, OPT_BOOLEAN, "spider", -1 }, + { "start-pos", 0, OPT_VALUE, "startpos", -1 }, { "strict-comments", 0, OPT_BOOLEAN, "strictcomments", -1 }, { "timeout", 'T', OPT_VALUE, "timeout", -1 }, { "timestamping", 'N', OPT_BOOLEAN, "timestamping", -1 }, @@ -308,7 +307,6 @@ static struct cmdline_option option_data[] = #endif }; -#undef WHEN_DEBUG #undef IF_SSL /* Return a string that contains S with "no-" prepended. The string @@ -460,6 +458,8 @@ Logging and input file:\n"), -v, --verbose be verbose (this is the default).\n"), N_("\ -nv, --no-verbose turn off verboseness, without being quiet.\n"), + N_("\ + --report-speed=TYPE Output bandwidth as TYPE. TYPE can be bits.\n"), N_("\ -i, --input-file=FILE download URLs found in local or external FILE.\n"), N_("\ @@ -468,7 +468,9 @@ Logging and input file:\n"), -B, --base=URL resolves HTML input-file links (-i -F)\n\ relative to URL.\n"), N_("\ - --config=FILE Specify config file to use.\n"), + --config=FILE Specify config file to use.\n"), + N_("\ + --no-config Do not read any config file.\n"), "\n", N_("\ @@ -484,6 +486,8 @@ Download:\n"), existing files (overwriting them).\n"), N_("\ -c, --continue resume getting a partially-downloaded file.\n"), + N_("\ + --start-pos=OFFSET start downloading from zero-based position OFFSET.\n"), N_("\ --progress=TYPE select progress gauge type.\n"), N_("\ @@ -608,6 +612,12 @@ 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_("\ + --method=HTTPMethod use method \"HTTPMethod\" in the header.\n"), + N_("\ + --body-data=STRING Send STRING as data. --method MUST be set.\n"), + N_("\ + --body-file=FILE Send contents of FILE. --method MUST be set.\n"), N_("\ --content-disposition honor the Content-Disposition header when\n\ choosing local file names (EXPERIMENTAL).\n"), @@ -624,7 +634,9 @@ HTTP options:\n"), HTTPS (SSL/TLS) options:\n"), N_("\ --secure-protocol=PR choose secure protocol, one of auto, SSLv2,\n\ - SSLv3, and TLSv1.\n"), + SSLv3, TLSv1 and PFS.\n"), + N_("\ + --https-only only follow secure HTTPS links\n"), N_("\ --no-check-certificate don't validate the server's certificate.\n"), N_("\ @@ -704,6 +716,9 @@ Recursive download:\n"), N_("\ -k, --convert-links make links in downloaded HTML or CSS point to\n\ local files.\n"), + N_("\ + --backups=N before writing file X, rotate up to N backup files.\n"), + #ifdef __VMS N_("\ -K, --backup-converted before converting file X, back up as X_orig.\n"), @@ -760,12 +775,6 @@ Recursive accept/reject:\n"), N_("\ -np, --no-parent don't ascend to the parent directory.\n"), "\n", - - N_("\ -Output format:\n"), - N_("\ - --report-speed=TYPE Output bandwidth as TYPE. TYPE can be bits.\n"), - "\n", N_("Mail bug reports and suggestions to .\n") }; @@ -833,15 +842,16 @@ format_and_print_line (const char *prefix, const char *line, assert (prefix != NULL); assert (line != NULL); + assert (line_length > TABULATION); line_dup = xstrdup (line); - if (line_length <= 0) - line_length = MAX_CHARS_PER_LINE - TABULATION; - if (printf ("%s", prefix) < 0) return -1; - remaining_chars = line_length; + + /* Wrap to new line after prefix. */ + remaining_chars = 0; + /* We break on spaces. */ token = strtok (line_dup, " "); while (token != NULL) @@ -849,7 +859,7 @@ format_and_print_line (const char *prefix, const char *line, /* If however a token is much larger than the maximum line length, all bets are off and we simply print the token on the next line. */ - if (remaining_chars <= strlen (token)) + if (remaining_chars <= (int) strlen (token)) { if (printf ("\n%*c", TABULATION, ' ') < 0) return -1; @@ -923,7 +933,7 @@ print_version (void) #ifdef ENABLE_NLS if (format_and_print_line (locale_title, - LOCALEDIR, + LOCALEDIR, MAX_CHARS_PER_LINE) < 0) exit (3); #endif /* def ENABLE_NLS */ @@ -945,8 +955,8 @@ print_version (void) /* TRANSLATORS: When available, an actual copyright character (circle-c) should be used in preference to "(C)". */ - if (fputs (_("\ -Copyright (C) 2011 Free Software Foundation, Inc.\n"), stdout) < 0) + if (printf (_("\ +Copyright (C) %s Free Software Foundation, Inc.\n"), "2014") < 0) exit (3); if (fputs (_("\ License GPLv3+: GNU GPL version 3 or later\n\ @@ -986,8 +996,6 @@ main (int argc, char **argv) i18n_initialize (); - atexit (close_stdout); - /* Construct the name of the executable, without the directory part. */ #ifdef __VMS /* On VMS, lose the "dev:[dir]" prefix and the ".EXE;nnn" suffix. */ @@ -1036,12 +1044,12 @@ main (int argc, char **argv) longindex = -1; int retconf; bool use_userconfig = false; + bool noconfig = false; while ((retconf = getopt_long (argc, argv, short_options, long_options, &longindex)) != -1) { int confval; - bool userrc_ret = true; struct cmdline_option *config_opt; /* There is no short option for "--config". */ @@ -1049,23 +1057,29 @@ main (int argc, char **argv) { confval = long_options[longindex].val; config_opt = &option_data[confval & ~BOOLEAN_NEG_MARKER]; - if (strcmp (config_opt->long_name, "config") == 0) + if (strcmp (config_opt->long_name, "no-config") == 0) { - userrc_ret &= run_wgetrc (optarg); - use_userconfig = true; + noconfig = true; + break; } - if (!userrc_ret) + else if (strcmp (config_opt->long_name, "config") == 0) { - fprintf (stderr, "Exiting due to error in %s\n", optarg); - exit (2); + bool userrc_ret = true; + userrc_ret &= run_wgetrc (optarg); + use_userconfig = true; + if (userrc_ret) + break; + else + { + fprintf (stderr, _("Exiting due to error in %s\n"), optarg); + exit (2); + } } - else - break; } } /* If the user did not specify a config, read the system wgetrc and ~/.wgetrc. */ - if (use_userconfig == false) + if (noconfig == false && use_userconfig == false) initialize (); opterr = 0; @@ -1188,14 +1202,27 @@ main (int argc, char **argv) nurl = argc - optind; + /* If we do not have Debug support compiled in AND Wget is invoked with the + * --debug switch, instead of failing, we silently turn it into a no-op. For + * this no-op, we explicitly set opt.debug to false and hence none of the + * Debug output messages will be printed. + */ +#ifndef ENABLE_DEBUG + if (opt.debug) + { + fprintf (stderr, _("Debugging support not compiled in. " + "Ignoring --debug flag.\n")); + opt.debug = false; + } +#endif + /* All user options have now been processed, so it's now safe to do interoption dependency checks. */ - if (opt.noclobber && opt.convert_links) { fprintf (stderr, _("Both --no-clobber and --convert-links were specified," - "only --convert-links will be used.\n")); + " only --convert-links will be used.\n")); opt.noclobber = false; } @@ -1218,6 +1245,7 @@ main (int argc, char **argv) if (opt.verbose == -1) opt.verbose = !opt.quiet; + /* Sanity checks. */ if (opt.verbose && opt.quiet) { @@ -1298,12 +1326,13 @@ for details.\n\n")); _("WARC output does not work with --spider.\n")); exit (1); } - if (opt.always_rest) + if (opt.always_rest || opt.start_pos >= 0) { fprintf (stderr, - _("WARC output does not work with --continue, " - "--continue will be disabled.\n")); + _("WARC output does not work with --continue or" + " --start-pos, they will be disabled.\n")); opt.always_rest = false; + opt.start_pos = -1; } if (opt.warc_cdx_dedup_filename != 0 && !opt.warc_digests_enabled) { @@ -1325,6 +1354,14 @@ for details.\n\n")); exit (1); } + if (opt.start_pos >= 0 && opt.always_rest) + { + fprintf (stderr, + _("Specifying both --start-pos and --continue is not " + "recommended; --continue will be disabled.\n")); + opt.always_rest = false; + } + if (!nurl && !opt.input_filename) { /* No URL specified. */ @@ -1365,6 +1402,64 @@ for details.\n\n")); if (!opt.rejectregex) exit (1); } + if (opt.post_data || opt.post_file_name) + { + if (opt.post_data && opt.post_file_name) + { + fprintf (stderr, _("You cannot specify both --post-data and --post-file.\n")); + exit (1); + } + else if (opt.method) + { + fprintf (stderr, _("You cannot use --post-data or --post-file along with --method. " + "--method expects data through --body-data and --body-file options")); + exit (1); + } + } + if (opt.body_data || opt.body_file) + { + if (!opt.method) + { + fprintf (stderr, _("You must specify a method through --method=HTTPMethod " + "to use with --body-data or --body-file.\n")); + exit (1); + } + else if (opt.body_data && opt.body_file) + { + fprintf (stderr, _("You cannot specify both --body-data and --body-file.\n")); + exit (1); + } + } + + /* Set various options as required for opt.method. */ + + /* When user specifies HEAD as the method, we do not wish to download any + files. Hence, set wget to run in spider mode. */ + if (opt.method && strcasecmp (opt.method, "HEAD") == 0) + setoptval ("spider", "1", "spider"); + + /* Convert post_data to body-data and post_file_name to body-file options. + This is required so as to remove redundant code later on in gethttp(). + The --post-data and --post-file options may also be removed in + the future hence it makes sense to convert them to aliases for + the more generic --method options. + This MUST occur only after the sanity checks so as to prevent the + user from setting both post and body options simultaneously. + */ + if (opt.post_data || opt.post_file_name) + { + setoptval ("method", "POST", "method"); + if (opt.post_data) + { + setoptval ("bodydata", opt.post_data, "body-data"); + opt.post_data = NULL; + } + else + { + setoptval ("bodyfile", opt.post_file_name, "body-file"); + opt.post_file_name = NULL; + } + } #ifdef ENABLE_IRI if (opt.enable_iri) @@ -1633,14 +1728,6 @@ outputting to a regular file.\n")); if (opt.convert_links && !opt.delete_after) convert_all_links (); - /* Close WARC file. */ - if (opt.warc_filename != 0) - warc_close (); - - log_close (); - - for (i = 0; i < nurl; i++) - xfree (url[i]); cleanup (); exit (get_exit_status ());