X-Git-Url: http://sjero.net/git/?p=wget;a=blobdiff_plain;f=src%2Fmain.c;h=5898a1989058995a619b3d244037f853c4f4684d;hp=b8039d6b16b1526a31423fd0c6e0a72ce089f674;hb=d5e283b1a75c5f8249300b465b4e7b55130bec49;hpb=94d6650817110c639975d45df57b345e10b0e396 diff --git a/src/main.c b/src/main.c index b8039d6b..5898a198 100644 --- a/src/main.c +++ b/src/main.c @@ -59,6 +59,12 @@ as that of the covered work. */ #include #include +#ifdef __VMS +#include "vms.h" +#endif /* __VMS */ + +#include "version.h" + #ifndef PATH_SEPARATOR # define PATH_SEPARATOR '/' #endif @@ -73,7 +79,8 @@ extern char *link_string; /* defined in build_info.c */ extern char *compiled_features[]; /* 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); @@ -182,6 +189,9 @@ 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 }, @@ -202,10 +212,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 }, @@ -239,6 +251,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 }, @@ -588,6 +601,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_("\ @@ -615,8 +632,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_("\ @@ -659,7 +681,7 @@ Recursive accept/reject:\n"), size_t i; printf (_("GNU Wget %s, a non-interactive network retriever.\n"), - version_string); + VERSION_STRING); print_usage (); for (i = 0; i < countof (help); i++) @@ -712,7 +734,6 @@ static void format_and_print_line (const char *prefix, const char *line, int line_length) { - int leading_spaces; int remaining_chars; char *line_dup, *token; @@ -722,11 +743,10 @@ format_and_print_line (const char *prefix, const char *line, line_dup = xstrdup (line); if (line_length <= 0) - line_length = max_chars_per_line; + line_length = MAX_CHARS_PER_LINE - TABULATION; - leading_spaces = strlen (prefix); printf ("%s", prefix); - remaining_chars = line_length - leading_spaces; + remaining_chars = line_length; /* We break on spaces. */ token = strtok (line_dup, " "); while (token != NULL) @@ -736,11 +756,11 @@ format_and_print_line (const char *prefix, const char *line, token on the next line. */ if (remaining_chars <= strlen (token)) { - printf ("\n%*c", leading_spaces, ' '); - 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, " "); } @@ -752,25 +772,27 @@ format_and_print_line (const char *prefix, const char *line, 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); + 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; - printf ("GNU Wget %s\n", version_string); - printf (options_title); + printf (_("GNU Wget %s\n\n"), version_string); +#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. */ 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]); @@ -778,43 +800,38 @@ 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); + 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); } 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); } #ifdef SYSTEM_WGETRC - printf ("%s (system)\n", SYSTEM_WGETRC); -#else - putchar ('\n'); + printf (" %s (system)\n", SYSTEM_WGETRC); #endif format_and_print_line (locale_title, LOCALEDIR, - max_chars_per_line); + MAX_CHARS_PER_LINE); format_and_print_line (compile_title, compilation_string, - max_chars_per_line); + MAX_CHARS_PER_LINE); format_and_print_line (link_title, link_string, - max_chars_per_line); + MAX_CHARS_PER_LINE); printf ("\n"); /* TRANSLATORS: When available, an actual copyright character @@ -1077,6 +1094,27 @@ for details.\n\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 (); @@ -1114,10 +1152,19 @@ 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)) @@ -1137,8 +1184,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); @@ -1149,6 +1208,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 @@ -1179,7 +1252,14 @@ WARNING: Can't reopen standard output in binary mode;\n\ { char *filename = NULL, *redirected_URL = NULL; int dt, url_err; - struct url *url_parsed = url_parse (*t, &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; + + set_uri_encoding (iri, opt.locale, true); + url_parsed = url_parse (*t, &url_err, iri, true); if (!url_parsed) { @@ -1199,12 +1279,15 @@ WARNING: Can't reopen standard output in binary mode;\n\ if (url_scheme (*t) == SCHEME_FTP) opt.follow_ftp = 1; - status = retrieve_tree (url_parsed); + status = retrieve_tree (url_parsed, NULL); opt.follow_ftp = old_follow_ftp; } else - status = retrieve_url (url_parsed, *t, &filename, &redirected_URL, NULL, &dt, opt.recursive); + { + status = retrieve_url (url_parsed, *t, &filename, &redirected_URL, + NULL, &dt, opt.recursive, iri); + } if (opt.delete_after && file_exists_p(filename)) { @@ -1217,6 +1300,7 @@ WARNING: Can't reopen standard output in binary mode;\n\ xfree_null (filename); url_free (url_parsed); } + iri_free (iri); } /* And then from the input file, if any. */