/* 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.
#include <getpass.h>
#include <quote.h>
+#ifdef __VMS
+#include "vms.h"
+#endif /* __VMS */
+
#ifndef PATH_SEPARATOR
# define PATH_SEPARATOR '/'
#endif
/* 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);
{ "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 },
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_("\
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_("\
format_and_print_line (const char *prefix, const char *line,
int line_length)
{
- int leading_spaces;
int remaining_chars;
char *line_dup, *token;
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)
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, " ");
}
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);
+#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]);
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
(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\
<http://www.gnu.org/licenses/gpl.html>.\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, _("\
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);
}
}
+#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
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;
+ set_uri_encoding (iri, opt.locale, true);
+ url_parsed = url_parse (*t, &url_err, iri, true);
- /* 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);
-
- 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. */