X-Git-Url: http://sjero.net/git/?p=wget;a=blobdiff_plain;f=src%2Fmain.c;h=5c0b3315013189970e178752c35ffc4c4933dfbc;hp=414b62bc30995ea03a8cc5349bfd778478690df0;hb=9dadbf6fe9577a6a6b7e7bab4e4b782fc1a6f86c;hpb=090f1596ae2eb446c265a62849f59657a9ee9e07 diff --git a/src/main.c b/src/main.c index 414b62bc..5c0b3315 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. @@ -59,6 +59,10 @@ as that of the covered work. */ #include #include +#ifdef __VMS +#include "vms.h" +#endif /* __VMS */ + #ifndef PATH_SEPARATOR # define PATH_SEPARATOR '/' #endif @@ -72,16 +76,18 @@ 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; +#define MAX_CHARS_PER_LINE 72 +#define TABULATION 4 #if defined(SIGHUP) || defined(SIGUSR1) 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 @@ -141,6 +147,7 @@ struct cmdline_option { static struct cmdline_option option_data[] = { { "accept", 'A', OPT_VALUE, "accept", -1 }, + { "adjust-extension", 'E', OPT_BOOLEAN, "adjustextension", -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 }, @@ -171,7 +178,7 @@ static struct cmdline_option option_data[] = { "dns-timeout", 0, OPT_VALUE, "dnstimeout", -1 }, { "domains", 'D', OPT_VALUE, "domains", -1 }, { "dont-remove-listing", 0, OPT__DONT_REMOVE_LISTING, NULL, no_argument }, - { "dot-style", 0, OPT_VALUE, "dotstyle", -1 }, + { "dot-style", 0, OPT_VALUE, "dotstyle", -1 }, /* deprecated */ { "egd-file", 0, OPT_VALUE, "egdfile", -1 }, { "exclude-directories", 'X', OPT_VALUE, "excludedirectories", -1 }, { "exclude-domains", 0, OPT_VALUE, "excludedomains", -1 }, @@ -181,12 +188,15 @@ static struct cmdline_option option_data[] = { "force-directories", 'x', OPT_BOOLEAN, "dirstruct", -1 }, { "force-html", 'F', OPT_BOOLEAN, "forcehtml", -1 }, { "ftp-password", 0, OPT_VALUE, "ftppassword", -1 }, +#ifdef __VMS + { "ftp-stmlf", 0, OPT_BOOLEAN, "ftpstmlf", -1 }, +#endif /* def __VMS */ { "ftp-user", 0, OPT_VALUE, "ftpuser", -1 }, { "glob", 0, OPT_BOOLEAN, "glob", -1 }, { "header", 0, OPT_VALUE, "header", -1 }, { "help", 'h', OPT_FUNCALL, (void *)print_help, no_argument }, { "host-directories", 0, OPT_BOOLEAN, "addhostdir", -1 }, - { "html-extension", 'E', OPT_BOOLEAN, "htmlextension", -1 }, + { "html-extension", 'E', OPT_BOOLEAN, "adjustextension", -1 }, { "htmlify", 0, OPT_BOOLEAN, "htmlify", -1 }, { "http-keep-alive", 0, OPT_BOOLEAN, "httpkeepalive", -1 }, { "http-passwd", 0, OPT_VALUE, "httppassword", -1 }, /* deprecated */ @@ -206,7 +216,7 @@ static struct cmdline_option option_data[] = { "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 }, + { "local-encoding", 0, OPT_VALUE, "localencoding", -1 }, { "max-redirect", 0, OPT_VALUE, "maxredirect", -1 }, { "mirror", 'm', OPT_BOOLEAN, "mirror", -1 }, { "no", 'n', OPT__NO, NULL, required_argument }, @@ -240,7 +250,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}, + { "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 }, @@ -423,7 +433,8 @@ Logging and input file:\n"), N_("\ -F, --force-html treat input file as HTML.\n"), N_("\ - -B, --base=URL prepends URL to relative links in -F -i file.\n"), + -B, --base=URL resolves HTML input-file links (-i -F)\n\ + relative to URL.\n"), "\n", N_("\ @@ -491,6 +502,12 @@ Download:\n"), --password=PASS set both ftp and http password to PASS.\n"), N_("\ --ask-password prompt for passwords.\n"), + N_("\ + --no-iri turn off IRI support.\n"), + N_("\ + --local-encoding=ENC use ENC as the local encoding for IRIs.\n"), + N_("\ + --remote-encoding=ENC use ENC as the default remote encoding.\n"), "\n", N_("\ @@ -521,7 +538,7 @@ HTTP options:\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"), + -E, --adjust-extension save HTML/CSS documents with proper extensions.\n"), N_("\ --ignore-length ignore `Content-Length' header field.\n"), N_("\ @@ -556,7 +573,7 @@ HTTP options:\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\ + --auth-no-challenge send Basic HTTP authentication information\n\ without first waiting for the server's\n\ challenge.\n"), "\n", @@ -590,6 +607,10 @@ HTTPS (SSL/TLS) options:\n"), N_("\ FTP options:\n"), +#ifdef __VMS + N_("\ + --ftp-stmlf Use Stream_LF format for all binary FTP files.\n"), +#endif /* def __VMS */ N_("\ --ftp-user=USER set ftp user to USER.\n"), N_("\ @@ -602,8 +623,6 @@ FTP options:\n"), --no-passive-ftp disable the \"passive\" transfer mode.\n"), N_("\ --retr-symlinks when recursing, get linked-to files (not dir).\n"), - N_("\ - --preserve-permissions preserve remote file permissions.\n"), "\n", N_("\ @@ -617,8 +636,13 @@ Recursive download:\n"), N_("\ -k, --convert-links make links in downloaded HTML or CSS point to\n\ local files.\n"), +#ifdef __VMS + N_("\ + -K, --backup-converted before converting file X, back up as X_orig.\n"), +#else /* def __VMS */ N_("\ -K, --backup-converted before converting file X, back up as X.orig.\n"), +#endif /* def __VMS [else] */ N_("\ -m, --mirror shortcut for -N -r -l inf --no-remove-listing.\n"), N_("\ @@ -711,20 +735,24 @@ 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 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; + line_length = MAX_CHARS_PER_LINE - TABULATION; - const int leading_spaces = strlen (prefix); printf ("%s", prefix); - int remaining_chars = line_length - leading_spaces; + remaining_chars = line_length; /* 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 @@ -732,44 +760,42 @@ 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 (" "); - } - remaining_chars = line_length - leading_spaces; + printf ("\n%*c", TABULATION, ' '); + remaining_chars = line_length - TABULATION; } printf ("%s ", token); - remaining_chars -= strlen (token) + 1; // account for " " + remaining_chars -= strlen (token) + 1; /* account for " " */ token = strtok (NULL, " "); } printf ("\n"); - xfree (prefix); - xfree (line); + + xfree (line_dup); } static void print_version (void) { - 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); + const char *wgetrc_title = _("Wgetrc: "); + const char *locale_title = _("Locale: "); + const char *compile_title = _("Compile: "); + const char *link_title = _("Link: "); + char *line; + char *env_wgetrc, *user_wgetrc; + int i; + +#ifdef __VMS + printf (_("GNU Wget %s built on VMS %s %s.\n\n"), + version_string, vms_arch(), vms_vers()); +#else /* def __VMS */ + printf (_("GNU Wget %s built on %s.\n\n"), version_string, OS_TYPE); +#endif /* def __VMS */ /* compiled_features is a char*[]. We limit the characters per - line to max_chars_per_line and prefix each line with a constant + 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; + int line_length = MAX_CHARS_PER_LINE; while ((line_length > 0) && (compiled_features[i] != NULL)) { printf ("%s ", compiled_features[i]); @@ -777,44 +803,44 @@ print_version (void) i++; } printf ("\n"); - if (compiled_features[i] != NULL) - { - printf (prefix_spaces); - } } + printf ("\n"); /* Handle the case when $WGETRC is unset and $HOME/.wgetrc is absent. */ - printf (wgetrc_title); - char *env_wgetrc = wgetrc_env_file_name (); + printf ("%s\n", wgetrc_title); + env_wgetrc = wgetrc_env_file_name (); if (env_wgetrc && *env_wgetrc) { - printf ("%s (env)\n%s", env_wgetrc, prefix_spaces); + printf (_(" %s (env)\n"), env_wgetrc); 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); + printf (_(" %s (user)\n"), user_wgetrc); xfree (user_wgetrc); } - printf ("%s (system)\n", system_wgetrc); +#ifdef SYSTEM_WGETRC + printf (_(" %s (system)\n"), SYSTEM_WGETRC); +#endif - format_and_print_line (strdup (locale_title), - strdup (locale_dir), - max_chars_per_line); + format_and_print_line (locale_title, + LOCALEDIR, + MAX_CHARS_PER_LINE); - format_and_print_line (strdup (compile_title), - strdup (compilation_string), - max_chars_per_line); + format_and_print_line (compile_title, + compilation_string, + MAX_CHARS_PER_LINE); + + format_and_print_line (link_title, + link_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 (_("\ -Copyright (C) 2008 Free Software Foundation, Inc.\n"), stdout); +Copyright (C) 2009 Free Software Foundation, Inc.\n"), stdout); fputs (_("\ License GPLv3+: GNU GPL version 3 or later\n\ .\n\ @@ -826,9 +852,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) { @@ -837,6 +867,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. */ @@ -1123,17 +1155,26 @@ for details.\n\n")); /* Initialize logging. */ log_init (opt.lfilename, append_to_log); - DEBUGP (("DEBUG output created by Wget %s on %s.\n\n", version_string, - OS_TYPE)); + DEBUGP (("DEBUG output created by Wget %s on %s.\n\n", + version_string, OS_TYPE)); /* Open the output filename if necessary. */ + +/* 2005-04-17 SMS. + Note that having the output_stream ("-O") file opened here for an FTP + URL rather than in getftp() (ftp.c) (and the http equivalent) rather + limits the ability in VMS to open the file differently for ASCII + versus binary FTP there. (Of course, doing it here allows a open + failure to be detected immediately, without first connecting to the + server.) +*/ if (opt.output_document) { if (HYPHENP (opt.output_document)) { #ifdef WINDOWS FILE *result; - result = freopen (NULL, "wb", stdout); + result = freopen ("CONOUT$", "wb", stdout); if (result == NULL) { logputs (LOG_NOTQUIET, _("\ @@ -1146,8 +1187,20 @@ WARNING: Can't reopen standard output in binary mode;\n\ else { struct_fstat st; + +#ifdef __VMS +/* Common fopen() optional arguments: + sequential access only, access callback function. +*/ +# define FOPEN_OPT_ARGS , "fop=sqo", "acc", acc_cb, &open_id + int open_id = 7; +#else /* def __VMS */ +# define FOPEN_OPT_ARGS +#endif /* def __VMS [else] */ + output_stream = fopen (opt.output_document, - opt.always_rest ? "ab" : "wb"); + opt.always_rest ? "ab" : "wb" + FOPEN_OPT_ARGS); if (output_stream == NULL) { perror (opt.output_document); @@ -1158,6 +1211,20 @@ WARNING: Can't reopen standard output in binary mode;\n\ } } +#ifdef __VMS + /* Set global ODS5 flag according to the specified destination (if + any), otherwise according to the current default device. + */ + if (output_stream == NULL) + { + set_ods5_dest( "SYS$DISK"); + } + else if (output_stream != stdout) + { + set_ods5_dest( opt.output_document); + } +#endif /* def __VMS */ + #ifdef WINDOWS ws_startup (); #endif @@ -1187,40 +1254,56 @@ 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; - if ((opt.recursive || opt.page_requisites) - && (url_scheme (*t) != SCHEME_FTP || url_uses_proxy (*t))) - { - 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, NULL); + set_uri_encoding (iri, opt.locale, true); + url_parsed = url_parse (*t, &url_err, iri, true); - opt.follow_ftp = old_follow_ftp; + if (!url_parsed) + { + char *error = url_error (*t, url_err); + logprintf (LOG_NOTQUIET, "%s: %s.\n",*t, error); + xfree (error); + status = URLERROR; } else { - 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.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 +1332,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));