X-Git-Url: http://sjero.net/git/?p=wget;a=blobdiff_plain;f=src%2Fmain.c;h=414b62bc30995ea03a8cc5349bfd778478690df0;hp=824f9b2266daa42940387392a93667c2ea4842d1;hb=26a3eea8e2f42c621ce6c40a93acf5ff1cd12220;hpb=bc8f473272ec29b0d0021dbcab6ac561ddc6249d diff --git a/src/main.c b/src/main.c index 824f9b22..414b62bc 100644 --- a/src/main.c +++ b/src/main.c @@ -56,6 +56,8 @@ as that of the covered work. */ #include "http.h" /* for save_cookies */ #include +#include +#include #ifndef PATH_SEPARATOR # define PATH_SEPARATOR '/' @@ -63,7 +65,17 @@ as that of the covered work. */ struct options opt; +/* defined in version.c */ extern char *version_string; +extern char *compilation_string; +extern char *system_getrc; +extern char *link_string; +/* defined in build_info.c */ +extern char *compiled_features[]; +extern char *system_wgetrc; +extern char *locale_dir; +/* Used for --version output in print_version */ +static const int max_chars_per_line = 72; #if defined(SIGHUP) || defined(SIGUSR1) static void redirect_output_signal (int); @@ -130,6 +142,8 @@ static struct cmdline_option option_data[] = { { "accept", 'A', OPT_VALUE, "accept", -1 }, { "append-output", 'a', OPT__APPEND_OUTPUT, NULL, required_argument }, + { "ask-password", 0, OPT_BOOLEAN, "askpassword", -1 }, + { "auth-no-challenge", 0, OPT_BOOLEAN, "authnochallenge", -1 }, { "background", 'b', OPT_BOOLEAN, "background", -1 }, { "backup-converted", 'K', OPT_BOOLEAN, "backupconverted", -1 }, { "backups", 0, OPT_BOOLEAN, "backups", -1 }, @@ -149,6 +163,7 @@ static struct cmdline_option option_data[] = { "cookies", 0, OPT_BOOLEAN, "cookies", -1 }, { "cut-dirs", 0, OPT_VALUE, "cutdirs", -1 }, { WHEN_DEBUG ("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 }, { "directory-prefix", 'P', OPT_VALUE, "dirprefix", -1 }, @@ -186,10 +201,12 @@ static struct cmdline_option option_data[] = { "inet6-only", '6', OPT_BOOLEAN, "inet6only", -1 }, #endif { "input-file", 'i', OPT_VALUE, "input", -1 }, + { "iri", 0, OPT_BOOLEAN, "iri", -1 }, { "keep-session-cookies", 0, OPT_BOOLEAN, "keepsessioncookies", -1 }, { "level", 'l', OPT_VALUE, "reclevel", -1 }, { "limit-rate", 0, OPT_VALUE, "limitrate", -1 }, { "load-cookies", 0, OPT_VALUE, "loadcookies", -1 }, + { "locale", 0, OPT_VALUE, "locale", -1 }, { "max-redirect", 0, OPT_VALUE, "maxredirect", -1 }, { "mirror", 'm', OPT_BOOLEAN, "mirror", -1 }, { "no", 'n', OPT__NO, NULL, required_argument }, @@ -223,6 +240,7 @@ static struct cmdline_option option_data[] = { "referer", 0, OPT_VALUE, "referer", -1 }, { "reject", 'R', OPT_VALUE, "reject", -1 }, { "relative", 'L', OPT_BOOLEAN, "relativeonly", -1 }, + { "remote-encoding", 0, OPT_VALUE, "remoteencoding", -1}, { "remove-listing", 0, OPT_BOOLEAN, "removelisting", -1 }, { "restrict-file-names", 0, OPT_BOOLEAN, "restrictfilenames", -1 }, { "retr-symlinks", 0, OPT_BOOLEAN, "retrsymlinks", -1 }, @@ -290,7 +308,7 @@ static void init_switches (void) { char *p = short_options; - int i, o = 0; + size_t i, o = 0; for (i = 0; i < countof (option_data); i++) { struct cmdline_option *opt = &option_data[i]; @@ -401,7 +419,7 @@ Logging and input file:\n"), N_("\ -nv, --no-verbose turn off verboseness, without being quiet.\n"), N_("\ - -i, --input-file=FILE download URLs found in FILE.\n"), + -i, --input-file=FILE download URLs found in local or external FILE.\n"), N_("\ -F, --force-html treat input file as HTML.\n"), N_("\ @@ -471,6 +489,8 @@ Download:\n"), --user=USER set both ftp and http user to USER.\n"), N_("\ --password=PASS set both ftp and http password to PASS.\n"), + N_("\ + --ask-password prompt for passwords.\n"), "\n", N_("\ @@ -497,6 +517,9 @@ HTTP options:\n"), --http-password=PASS set http password to PASS.\n"), N_("\ --no-cache disallow server-cached data.\n"), + N_ ("\ + --default-page=NAME Change the default page name (normally\n\ + this is `index.html'.).\n"), N_("\ -E, --html-extension save HTML documents with `.html' extension.\n"), N_("\ @@ -532,6 +555,10 @@ HTTP options:\n"), N_("\ --content-disposition honor the Content-Disposition header when\n\ choosing local file names (EXPERIMENTAL).\n"), + N_("\ + --auth-no-challenge Send Basic HTTP authentication information\n\ + without first waiting for the server's\n\ + challenge.\n"), "\n", #ifdef HAVE_SSL @@ -588,7 +615,8 @@ Recursive download:\n"), N_("\ --delete-after delete files locally after downloading them.\n"), N_("\ - -k, --convert-links make links in downloaded HTML point to local files.\n"), + -k, --convert-links make links in downloaded HTML or CSS point to\n\ + local files.\n"), N_("\ -K, --backup-converted before converting file X, back up as X.orig.\n"), N_("\ @@ -630,7 +658,7 @@ Recursive accept/reject:\n"), N_("Mail bug reports and suggestions to .\n") }; - int i; + size_t i; printf (_("GNU Wget %s, a non-interactive network retriever.\n"), version_string); @@ -668,10 +696,121 @@ secs_to_human_time (double interval) return buf; } +static char * +prompt_for_password (void) +{ + if (opt.user) + printf (_("Password for user %s: "), quote (opt.user)); + else + printf (_("Password: ")); + return getpass(""); +} + +/* Function that prints the line argument while limiting it + to at most line_length. prefix is printed on the first line + and an appropriate number of spaces are added on subsequent + lines.*/ +static void +format_and_print_line (char* prefix, char* line, + int line_length) +{ + assert (prefix != NULL); + assert (line != NULL); + + if (line_length <= 0) + line_length = max_chars_per_line; + + const int leading_spaces = strlen (prefix); + printf ("%s", prefix); + int remaining_chars = line_length - leading_spaces; + /* We break on spaces. */ + char* token = strtok (line, " "); + while (token != NULL) + { + /* 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)) + { + printf ("\n"); + int j = 0; + for (j = 0; j < leading_spaces; j++) + { + printf (" "); + } + remaining_chars = line_length - leading_spaces; + } + printf ("%s ", token); + remaining_chars -= strlen (token) + 1; // account for " " + token = strtok (NULL, " "); + } + + printf ("\n"); + xfree (prefix); + xfree (line); +} + static void print_version (void) { - printf ("GNU Wget %s\n\n", version_string); + const char *options_title = "Options : "; + const char *wgetrc_title = "Wgetrc : "; + const char *locale_title = "Locale : "; + const char *compile_title = "Compile : "; + const char *link_title = "Link : "; + const char *prefix_spaces = " "; + const int prefix_space_length = strlen (prefix_spaces); + + printf ("GNU Wget %s\n", version_string); + printf (options_title); + /* compiled_features is a char*[]. We limit the characters per + line to max_chars_per_line and prefix each line with a constant + number of spaces for proper alignment. */ + int i =0; + for (i = 0; compiled_features[i] != NULL; ) + { + int line_length = max_chars_per_line - prefix_space_length; + while ((line_length > 0) && (compiled_features[i] != NULL)) + { + printf ("%s ", compiled_features[i]); + line_length -= strlen (compiled_features[i]) + 2; + i++; + } + printf ("\n"); + if (compiled_features[i] != NULL) + { + printf (prefix_spaces); + } + } + /* Handle the case when $WGETRC is unset and $HOME/.wgetrc is + absent. */ + printf (wgetrc_title); + char *env_wgetrc = wgetrc_env_file_name (); + if (env_wgetrc && *env_wgetrc) + { + printf ("%s (env)\n%s", env_wgetrc, prefix_spaces); + xfree (env_wgetrc); + } + char *user_wgetrc = wgetrc_user_file_name (); + if (user_wgetrc) + { + printf ("%s (user)\n%s", user_wgetrc, prefix_spaces); + xfree (user_wgetrc); + } + printf ("%s (system)\n", system_wgetrc); + + format_and_print_line (strdup (locale_title), + strdup (locale_dir), + max_chars_per_line); + + format_and_print_line (strdup (compile_title), + strdup (compilation_string), + max_chars_per_line); + + format_and_print_line (strdup (link_title), + strdup (link_string), + max_chars_per_line); + printf ("\n"); /* TRANSLATORS: When available, an actual copyright character (cirle-c) should be used in preference to "(C)". */ fputs (_("\ @@ -689,7 +828,6 @@ There is NO WARRANTY, to the extent permitted by law.\n"), stdout); stdout); exit (0); } - int main (int argc, char **argv) @@ -875,22 +1013,44 @@ Can't timestamp and not clobber old files at the same time.\n")); exit (1); } #endif - if (opt.output_document - && (opt.page_requisites - || opt.recursive - || opt.timestamping)) + if (opt.output_document) { - printf (_("Cannot specify -r, -p or -N if -O is given.\n")); + if (opt.convert_links + && (nurl > 1 || opt.page_requisites || opt.recursive)) + { + fputs (_("\ +Cannot specify both -k and -O if multiple URLs are given, or in combination\n\ +with -p or -r. See the manual for details.\n\n"), stdout); print_usage (); exit (1); + } + if (opt.page_requisites + || opt.recursive) + { + logprintf (LOG_NOTQUIET, "%s", _("\ +WARNING: combining -O with -r or -p will mean that all downloaded content\n\ +will be placed in the single file you specified.\n\n")); + } + if (opt.timestamping) + { + logprintf (LOG_NOTQUIET, "%s", _("\ +WARNING: timestamping does nothing in combination with -O. See the manual\n\ +for details.\n\n")); + opt.timestamping = false; + } + if (opt.noclobber && file_exists_p(opt.output_document)) + { + /* Check if output file exists; if it does, exit. */ + logprintf (LOG_VERBOSE, _("File `%s' already there; not retrieving.\n"), opt.output_document); + exit(1); + } } - if (opt.output_document - && opt.convert_links - && nurl > 1) + + if (opt.ask_passwd && opt.passwd) { - printf (_("Cannot specify both -k and -O if multiple URLs are given.\n")); - print_usage (); - exit (1); + printf (_("Cannot specify both --ask-password and --password.\n")); + print_usage (); + exit (1); } if (!nurl && !opt.input_filename) @@ -905,6 +1065,35 @@ Can't timestamp and not clobber old files at the same time.\n")); exit (1); } +#ifdef ENABLE_IRI + if (opt.enable_iri) + { + if (opt.locale && !check_encoding_name (opt.locale)) + opt.locale = NULL; + + if (!opt.locale) + opt.locale = find_locale (); + + if (opt.encoding_remote && !check_encoding_name (opt.encoding_remote)) + opt.encoding_remote = NULL; + } +#else + if (opt.enable_iri || opt.locale || opt.encoding_remote) + { + /* sXXXav : be more specific... */ + printf(_("This version does not have support for IRIs\n")); + exit(1); + } +#endif + + if (opt.ask_passwd) + { + opt.passwd = prompt_for_password (); + + if (opt.passwd == NULL || opt.passwd[0] == '\0') + exit (1); + } + #ifdef MSDOS if (opt.wdebug) dbug_init(); @@ -941,7 +1130,19 @@ Can't timestamp and not clobber old files at the same time.\n")); if (opt.output_document) { if (HYPHENP (opt.output_document)) - output_stream = stdout; + { +#ifdef WINDOWS + FILE *result; + result = freopen (NULL, "wb", stdout); + if (result == NULL) + { + logputs (LOG_NOTQUIET, _("\ +WARNING: Can't reopen standard output in binary mode;\n\ + downloaded file may contain inappropriate line endings.\n")); + } +#endif + output_stream = stdout; + } else { struct_fstat st; @@ -994,15 +1195,21 @@ Can't timestamp and not clobber old files at the same time.\n")); int old_follow_ftp = opt.follow_ftp; /* Turn opt.follow_ftp on in case of recursive FTP retrieval */ - if (url_scheme (*t) == SCHEME_FTP) + if (url_scheme (*t) == SCHEME_FTP) opt.follow_ftp = 1; - - status = retrieve_tree (*t); + + status = retrieve_tree (*t, NULL); opt.follow_ftp = old_follow_ftp; } else - status = retrieve_url (*t, &filename, &redirected_URL, NULL, &dt, opt.recursive); + { + struct iri *i = iri_new (); + set_uri_encoding (i, opt.locale, true); + status = retrieve_url (*t, &filename, &redirected_URL, NULL, &dt, + opt.recursive, i); + iri_free (i); + } if (opt.delete_after && file_exists_p(filename)) { @@ -1064,9 +1271,6 @@ Can't timestamp and not clobber old files at the same time.\n")); xfree (url[i]); cleanup (); -#ifdef DEBUG_MALLOC - print_malloc_debug_stats (); -#endif if (status == RETROK) return 0; else