1
0
mirror of https://github.com/moparisthebest/wget synced 2024-07-03 16:38:41 -04:00

[svn] Make -P work on Windows.

Submitted by Ian Abbott in <3C447E8F.13424.16ED42@localhost>.
This commit is contained in:
hniksic 2002-01-16 17:03:33 -08:00
parent fb2ed23830
commit e59a7ee8ac
3 changed files with 66 additions and 9 deletions

View File

@ -1,3 +1,15 @@
2002-01-15 Ian Abbott <abbotti@mev.co.uk>
* init.c (cmd_file): Change `\' to `/' for Windows (yes, really!)
(cmd_directory): New function. Like cmd_file(), but strips
trailing directory separators.
(commands): Change action for "dirprefix" from `cmd_file' to
`cmd_directory'.
* utils.c (make_directory): Allow intermediate `mkdir' calls to
fail, as not all path components that do not exist should be
directory components, especially under Windows.
2002-01-17 Hrvoje Niksic <hniksic@arsdigita.com> 2002-01-17 Hrvoje Niksic <hniksic@arsdigita.com>
* netrc.c (parse_netrc): Skip leading whitespace before testing * netrc.c (parse_netrc): Skip leading whitespace before testing

View File

@ -79,6 +79,7 @@ CMD_DECLARE (cmd_number);
CMD_DECLARE (cmd_number_inf); CMD_DECLARE (cmd_number_inf);
CMD_DECLARE (cmd_string); CMD_DECLARE (cmd_string);
CMD_DECLARE (cmd_file); CMD_DECLARE (cmd_file);
CMD_DECLARE (cmd_directory);
CMD_DECLARE (cmd_time); CMD_DECLARE (cmd_time);
CMD_DECLARE (cmd_vector); CMD_DECLARE (cmd_vector);
@ -117,7 +118,7 @@ static struct {
{ "debug", &opt.debug, cmd_boolean }, { "debug", &opt.debug, cmd_boolean },
#endif #endif
{ "deleteafter", &opt.delete_after, cmd_boolean }, { "deleteafter", &opt.delete_after, cmd_boolean },
{ "dirprefix", &opt.dir_prefix, cmd_file }, { "dirprefix", &opt.dir_prefix, cmd_directory },
{ "dirstruct", NULL, cmd_spec_dirstruct }, { "dirstruct", NULL, cmd_spec_dirstruct },
{ "domains", &opt.domains, cmd_vector }, { "domains", &opt.domains, cmd_vector },
{ "dotbytes", &opt.dot_bytes, cmd_bytes }, { "dotbytes", &opt.dot_bytes, cmd_bytes },
@ -674,7 +675,11 @@ cmd_file (const char *com, const char *val, void *closure)
/* #### If VAL is empty, perhaps should set *CLOSURE to NULL. */ /* #### 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: noexpand:
*pstring = xstrdup (val); *pstring = xstrdup (val);
@ -688,12 +693,21 @@ cmd_file (const char *com, const char *val, void *closure)
goto noexpand; goto noexpand;
homelen = strlen (home); homelen = strlen (home);
while (homelen && home[homelen - 1] == '/') while (homelen && (home[homelen - 1] == '/'
#ifdef WINDOWS
|| home[homelen - 1] == '\\'
#endif
))
home[--homelen] = '\0'; home[--homelen] = '\0';
/* Skip the leading "~/". */ /* Skip the leading "~/". */
#ifdef WINDOWS
for (++val; *val == '/' || *val == '\\'; val++)
;
#else
for (++val; *val == '/'; val++) for (++val; *val == '/'; val++)
; ;
#endif
result = xmalloc (homelen + 1 + strlen (val)); result = xmalloc (homelen + 1 + strlen (val));
memcpy (result, home, homelen); memcpy (result, home, homelen);
@ -702,6 +716,35 @@ cmd_file (const char *com, const char *val, void *closure)
*pstring = result; *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;
} }

View File

@ -579,6 +579,7 @@ make_directory (const char *directory)
{ {
int quit = 0; int quit = 0;
int i; int i;
int ret = 0;
char *dir; char *dir;
/* Make a copy of dir, to be able to write to it. Otherwise, the /* Make a copy of dir, to be able to write to it. Otherwise, the
@ -594,18 +595,19 @@ make_directory (const char *directory)
if (!dir[i]) if (!dir[i])
quit = 1; quit = 1;
dir[i] = '\0'; dir[i] = '\0';
/* Check whether the directory already exists. */ /* Check whether the directory already exists. Allow creation of
of intermediate directories to fail, as the initial path components
are not necessarily directories! */
if (!file_exists_p (dir)) if (!file_exists_p (dir))
{ ret = mkdir (dir, 0777);
if (mkdir (dir, 0777) < 0) else
return -1; ret = 0;
}
if (quit) if (quit)
break; break;
else else
dir[i] = '/'; dir[i] = '/';
} }
return 0; return ret;
} }
/* Merge BASE with FILE. BASE can be a directory or a file name, FILE /* Merge BASE with FILE. BASE can be a directory or a file name, FILE