X-Git-Url: http://sjero.net/git/?p=wget;a=blobdiff_plain;f=src%2Fmain.c;h=8b9c11057b01091755732d381f351303b24126d1;hp=d0ff1d2194b267e8d12e8f5e32a377ea1de163e6;hb=50e12521d63b8b42370a07d9c9971f56ca6dc58a;hpb=9a2ea3938d09643c6528c3b83b1db4c30f47d981 diff --git a/src/main.c b/src/main.c index d0ff1d21..8b9c1105 100644 --- a/src/main.c +++ b/src/main.c @@ -1,6 +1,6 @@ /* Command line parsing. Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, - 2004, 2005, 2006, 2007, 2008 Free Software Foundation, Inc. + 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation, Inc. This file is part of GNU Wget. @@ -43,9 +43,6 @@ as that of the covered work. */ #include #include #include -#ifdef ENABLE_IRI -#include -#endif #include "utils.h" #include "init.h" @@ -57,7 +54,6 @@ as that of the covered work. */ #include "convert.h" #include "spider.h" #include "http.h" /* for save_cookies */ -#include "iri.h" #include #include @@ -76,8 +72,6 @@ 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; @@ -86,6 +80,9 @@ static void redirect_output_signal (int); #endif const char *exec_name; + +/* Number of successfully downloaded URLs */ +int numurls = 0; #ifndef TESTING /* Initialize I18N/L10N. That amounts to invoking setlocale, and @@ -167,6 +164,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 }, @@ -422,7 +420,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_("\ @@ -520,6 +518,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_("\ @@ -615,7 +616,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_("\ @@ -710,20 +712,26 @@ prompt_for_password (void) and an appropriate number of spaces are added on subsequent lines.*/ static void -format_and_print_line (char* prefix, char* line, - int line_length) +format_and_print_line (const char *prefix, const char *line, + int line_length) { + int leading_spaces; + int remaining_chars; + char *line_dup, *token; + assert (prefix != NULL); assert (line != NULL); + line_dup = xstrdup (line); + if (line_length <= 0) line_length = max_chars_per_line; - const int leading_spaces = strlen (prefix); + leading_spaces = strlen (prefix); printf ("%s", prefix); - int remaining_chars = line_length - leading_spaces; + remaining_chars = line_length - leading_spaces; /* We break on spaces. */ - char* token = strtok (line, " "); + token = strtok (line_dup, " "); while (token != NULL) { /* If however a token is much larger than the maximum @@ -731,12 +739,7 @@ format_and_print_line (char* prefix, char* line, token on the next line. */ if (remaining_chars <= strlen (token)) { - printf ("\n"); - int j = 0; - for (j = 0; j < leading_spaces; j++) - { - printf (" "); - } + printf ("\n%*c", leading_spaces, ' '); remaining_chars = line_length - leading_spaces; } printf ("%s ", token); @@ -745,8 +748,8 @@ format_and_print_line (char* prefix, char* line, } printf ("\n"); - xfree (prefix); - xfree (line); + + xfree (line_dup); } static void @@ -759,13 +762,15 @@ print_version (void) const char *link_title = "Link : "; const char *prefix_spaces = " "; const int prefix_space_length = strlen (prefix_spaces); + char *line; + char *env_wgetrc, *user_wgetrc; + int i; 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; @@ -784,31 +789,36 @@ print_version (void) /* Handle the case when $WGETRC is unset and $HOME/.wgetrc is absent. */ printf (wgetrc_title); - char *env_wgetrc = wgetrc_env_file_name (); + 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 (); + 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); +#ifdef SYSTEM_WGETRC + printf ("%s (system)\n", SYSTEM_WGETRC); +#else + putchar ('\n'); +#endif - format_and_print_line (strdup (locale_title), - strdup (locale_dir), + format_and_print_line (locale_title, + LOCALEDIR, max_chars_per_line); - format_and_print_line (strdup (compile_title), - strdup (compilation_string), + format_and_print_line (compile_title, + compilation_string, max_chars_per_line); - format_and_print_line (strdup (link_title), - strdup (link_string), + format_and_print_line (link_title, + link_string, max_chars_per_line); + printf ("\n"); /* TRANSLATORS: When available, an actual copyright character (cirle-c) should be used in preference to "(C)". */ @@ -825,9 +835,13 @@ There is NO WARRANTY, to the extent permitted by law.\n"), stdout); stdout); fputs (_("Currently maintained by Micah Cowan .\n"), stdout); + fputs (_("Please send bug reports and questions to .\n"), + stdout); exit (0); } +char *program_name; /* Needed by lib/error.c. */ + int main (int argc, char **argv) { @@ -836,6 +850,8 @@ main (int argc, char **argv) int nurl, status; bool append_to_log = false; + program_name = argv[0]; + i18n_initialize (); /* Construct the name of the executable, without the directory part. */ @@ -1075,8 +1091,6 @@ for details.\n\n")); if (opt.encoding_remote && !check_encoding_name (opt.encoding_remote)) opt.encoding_remote = NULL; - - /*logprintf (LOG_VERBOSE, "Locale = %s\n", quote (opt.locale));*/ } #else if (opt.enable_iri || opt.locale || opt.encoding_remote) @@ -1134,7 +1148,7 @@ for details.\n\n")); { #ifdef WINDOWS FILE *result; - result = freopen (NULL, "wb", stdout); + result = freopen ("CONOUT$", "wb", stdout); if (result == NULL) { logputs (LOG_NOTQUIET, _("\ @@ -1188,39 +1202,55 @@ WARNING: Can't reopen standard output in binary mode;\n\ for (t = url; *t; t++) { char *filename = NULL, *redirected_URL = NULL; - int dt; + int dt, url_err; + /* Need to do a new struct iri every time, because + * retrieve_url may modify it in some circumstances, + * currently. */ + struct iri *iri = iri_new (); + struct url *url_parsed = url_parse (*t, &url_err, iri, true); - set_current_as_locale (); + set_uri_encoding (iri, opt.locale, true); - if ((opt.recursive || opt.page_requisites) - && (url_scheme (*t) != SCHEME_FTP || url_uses_proxy (*t))) + if (!url_parsed) { - int old_follow_ftp = opt.follow_ftp; - - /* Turn opt.follow_ftp on in case of recursive FTP retrieval */ - if (url_scheme (*t) == SCHEME_FTP) - opt.follow_ftp = 1; - - status = retrieve_tree (*t); - - opt.follow_ftp = old_follow_ftp; + char *error = url_error (*t, url_err); + logprintf (LOG_NOTQUIET, "%s: %s.\n",*t, error); + xfree (error); + status = URLERROR; } else { - set_remote_as_current (); - status = retrieve_url (*t, &filename, &redirected_URL, NULL, &dt, opt.recursive); - } + if ((opt.recursive || opt.page_requisites) + && (url_scheme (*t) != SCHEME_FTP || url_uses_proxy (url_parsed))) + { + int old_follow_ftp = opt.follow_ftp; - if (opt.delete_after && file_exists_p(filename)) - { - DEBUGP (("Removing file due to --delete-after in main():\n")); - logprintf (LOG_VERBOSE, _("Removing %s.\n"), filename); - if (unlink (filename)) - logprintf (LOG_NOTQUIET, "unlink: %s\n", strerror (errno)); - } + /* Turn opt.follow_ftp on in case of recursive FTP retrieval */ + if (url_scheme (*t) == SCHEME_FTP) + opt.follow_ftp = 1; + + status = retrieve_tree (url_parsed, NULL); - xfree_null (redirected_URL); - xfree_null (filename); + opt.follow_ftp = old_follow_ftp; + } + else + { + status = retrieve_url (url_parsed, *t, &filename, &redirected_URL, + NULL, &dt, opt.recursive, iri); + } + + if (opt.delete_after && file_exists_p(filename)) + { + DEBUGP (("Removing file due to --delete-after in main():\n")); + logprintf (LOG_VERBOSE, _("Removing %s.\n"), filename); + if (unlink (filename)) + logprintf (LOG_NOTQUIET, "unlink: %s\n", strerror (errno)); + } + xfree_null (redirected_URL); + xfree_null (filename); + url_free (url_parsed); + } + iri_free (iri); } /* And then from the input file, if any. */ @@ -1249,7 +1279,7 @@ WARNING: Can't reopen standard output in binary mode;\n\ logprintf (LOG_NOTQUIET, _("FINISHED --%s--\nDownloaded: %d files, %s in %s (%s)\n"), datetime_str (time (NULL)), - opt.numurls, + numurls, human_readable (total_downloaded_bytes), secs_to_human_time (total_download_time), retr_rate (total_downloaded_bytes, total_download_time)); @@ -1271,9 +1301,6 @@ WARNING: Can't reopen standard output in binary mode;\n\ xfree (url[i]); cleanup (); -#ifdef DEBUG_MALLOC - print_malloc_debug_stats (); -#endif if (status == RETROK) return 0; else