#include "recur.h"
#include "netrc.h"
#include "cookies.h" /* for cookies_cleanup */
+#include "progress.h"
#ifndef errno
extern int errno;
CMD_DECLARE (cmd_number_inf);
CMD_DECLARE (cmd_string);
CMD_DECLARE (cmd_file);
+CMD_DECLARE (cmd_directory);
CMD_DECLARE (cmd_time);
CMD_DECLARE (cmd_vector);
CMD_DECLARE (cmd_spec_header);
CMD_DECLARE (cmd_spec_htmlify);
CMD_DECLARE (cmd_spec_mirror);
-/*CMD_DECLARE (cmd_spec_progress);*/
+CMD_DECLARE (cmd_spec_progress);
CMD_DECLARE (cmd_spec_recursive);
CMD_DECLARE (cmd_spec_useragent);
{ "debug", &opt.debug, cmd_boolean },
#endif
{ "deleteafter", &opt.delete_after, cmd_boolean },
- { "dirprefix", &opt.dir_prefix, cmd_file },
+ { "dirprefix", &opt.dir_prefix, cmd_directory },
{ "dirstruct", NULL, cmd_spec_dirstruct },
{ "domains", &opt.domains, cmd_vector },
{ "dotbytes", &opt.dot_bytes, cmd_bytes },
{ "pagerequisites", &opt.page_requisites, cmd_boolean },
{ "passiveftp", &opt.ftp_pasv, cmd_lockable_boolean },
{ "passwd", &opt.ftp_pass, cmd_string },
- { "progress", &opt.progress_type, cmd_string },
+ { "progress", &opt.progress_type, cmd_spec_progress },
{ "proxypasswd", &opt.proxy_passwd, cmd_string },
{ "proxyuser", &opt.proxy_user, cmd_string },
{ "quiet", &opt.quiet, cmd_boolean },
{
if (!file_exists_p (env))
{
- fprintf (stderr, "%s: %s: %s.\n", exec_name, file, strerror (errno));
+ fprintf (stderr, "%s: %s: %s.\n", exec_name, env, strerror (errno));
exit (1);
}
return xstrdup (env);
cmd_address (const char *com, const char *val, void *closure)
{
struct address_list *al;
- struct sockaddr_in sin;
- struct sockaddr_in **target = (struct sockaddr_in **)closure;
+ wget_sockaddr sa;
+ wget_sockaddr **target = (wget_sockaddr **)closure;
- memset (&sin, '\0', sizeof (sin));
+ memset (&sa, '\0', sizeof (sa));
al = lookup_host (val, 1);
if (!al)
exec_name, com, val);
return 0;
}
- address_list_copy_one (al, 0, (unsigned char *)&sin.sin_addr);
+ sa.sa.sa_family = ip_default_family;
+ wget_sockaddr_set_port (&sa, 0);
+ address_list_copy_one (al, 0, wget_sockaddr_get_addr (&sa));
address_list_release (al);
- sin.sin_family = AF_INET;
- sin.sin_port = 0;
-
FREE_MAYBE (*target);
- *target = xmalloc (sizeof (sin));
- memcpy (*target, &sin, sizeof (sin));
+ *target = xmalloc (sizeof (sa));
+ memcpy (*target, &sa, sizeof (sa));
return 1;
}
/* #### If VAL is empty, perhaps should set *CLOSURE to NULL. */
- if (!enable_tilde_expansion || !(*val == '~' && *(val + 1) == '/'))
+ if (!enable_tilde_expansion || !(*val == '~' && (*(val + 1) == '/'
+#ifdef WINDOWS
+ || *(val + 1) == '\\'
+#endif
+ )))
{
noexpand:
*pstring = xstrdup (val);
goto noexpand;
homelen = strlen (home);
- while (homelen && home[homelen - 1] == '/')
+ while (homelen && (home[homelen - 1] == '/'
+#ifdef WINDOWS
+ || home[homelen - 1] == '\\'
+#endif
+ ))
home[--homelen] = '\0';
/* Skip the leading "~/". */
+#ifdef WINDOWS
+ for (++val; *val == '/' || *val == '\\'; val++)
+ ;
+#else
for (++val; *val == '/'; val++)
;
+#endif
result = xmalloc (homelen + 1 + strlen (val));
memcpy (result, home, homelen);
*pstring = result;
}
+#ifdef WINDOWS
+ /* Convert "\" to "/". */
+ {
+ char *s;
+ for (s = *pstring; *s; s++)
+ if (*s == '\\')
+ *s = '/';
+ }
+#endif
+ return 1;
+}
+
+/* Like cmd_file, but strips trailing '/' characters. */
+static int
+cmd_directory (const char *com, const char *val, void *closure)
+{
+ char *s, *t;
+
+ /* Call cmd_file() for tilde expansion and separator
+ canonicalization (backslash -> slash under Windows). These
+ things should perhaps be in a separate function. */
+ if (!cmd_file (com, val, closure))
+ return 0;
+
+ s = *(char **)closure;
+ t = s + strlen (s);
+ while (t > s && *--t == '/')
+ *t = '\0';
+
return 1;
}
return 1;
}
-#if 0
static int
cmd_spec_progress (const char *com, const char *val, void *closure)
{
exec_name, com, val);
return 0;
}
- set_progress_implementation (val);
+ FREE_MAYBE (opt.progress_type);
+
+ /* Don't call set_progress_implementation here. It will be called
+ in main() when it becomes clear what the log output is. */
+ opt.progress_type = xstrdup (val);
return 1;
}
-#endif
static int
cmd_spec_recursive (const char *com, const char *val, void *closure)