mirror of
https://github.com/moparisthebest/wget
synced 2024-07-03 16:38:41 -04:00
[svn] Fix recursive FTP retrieval so that
`wget -r ftp://<username>:<password>@host/%2Fhome/hniksic/dir/' works. Published in <sxsk84ug8gt.fsf@florida.arsdigita.de>.
This commit is contained in:
parent
665a84b4a2
commit
0c70c624f9
@ -1,3 +1,9 @@
|
||||
2001-04-09 Hrvoje Niksic <hniksic@arsdigita.com>
|
||||
|
||||
* ftp.c (ftp_retrieve_dirs): Don't forcibly prepend "/" to u->dir;
|
||||
that hack is no longer necessary.
|
||||
(getftp): Prepend initial directory to *non*-absolute u->dir's.
|
||||
|
||||
2001-04-09 Hrvoje Niksic <hniksic@arsdigita.com>
|
||||
|
||||
* init.c (cmd_file): New function.
|
||||
|
83
src/ftp.c
83
src/ftp.c
@ -349,56 +349,45 @@ Error in server response, closing control connection.\n"));
|
||||
logputs (LOG_VERBOSE, _("==> CWD not needed.\n"));
|
||||
else
|
||||
{
|
||||
/* Change working directory. If the FTP host runs VMS and
|
||||
the path specified is absolute, we will have to convert
|
||||
it to VMS style as VMS does not like leading slashes */
|
||||
char *target = u->dir;
|
||||
|
||||
DEBUGP (("changing working directory\n"));
|
||||
if (*(u->dir) == '/')
|
||||
|
||||
/* Change working directory. To change to a non-absolute
|
||||
Unix directory, we need to prepend initial directory
|
||||
(con->id) to it. Absolute directories "just work". */
|
||||
|
||||
if (*target != '/')
|
||||
{
|
||||
int pwd_len = strlen (con->id);
|
||||
char *result = (char *)alloca (strlen (u->dir) + pwd_len + 10);
|
||||
*result = '\0';
|
||||
switch (con->rs)
|
||||
int idlen = strlen (con->id);
|
||||
char *ntarget = (char *)alloca (idlen + 1 + strlen (u->dir) + 1);
|
||||
/* pwd_len == 1 means pwd = "/" */
|
||||
sprintf (ntarget, "%s%s%s", con->id, idlen == 1 ? "" : "/",
|
||||
target);
|
||||
target = ntarget;
|
||||
}
|
||||
|
||||
/* If the FTP host runs VMS, we will have to convert it to
|
||||
VMS style as VMS does not like leading slashes. "VMS
|
||||
style" is [dir.subdir.subsubdir]. */
|
||||
if (con->rs == ST_VMS)
|
||||
{
|
||||
case ST_VMS:
|
||||
{
|
||||
char *tmp_dir, *tmpp;
|
||||
STRDUP_ALLOCA (tmp_dir, u->dir);
|
||||
for (tmpp = tmp_dir; *tmpp; tmpp++)
|
||||
if (*tmpp=='/')
|
||||
char *tmpp;
|
||||
char *ntarget = (char *)alloca (strlen (target) + 1);
|
||||
strcpy (ntarget, target);
|
||||
assert (*ntarget == '/');
|
||||
*ntarget = '[';
|
||||
for (tmpp = ntarget + 1; *tmpp; tmpp++)
|
||||
if (*tmpp == '/')
|
||||
*tmpp = '.';
|
||||
strcpy (result, con->id);
|
||||
/* pwd ends with ']', we have to get rid of it */
|
||||
result[pwd_len - 1]= '\0';
|
||||
strcat (result, tmp_dir);
|
||||
strcat (result, "]");
|
||||
}
|
||||
break;
|
||||
case ST_UNIX:
|
||||
case ST_WINNT:
|
||||
case ST_MACOS:
|
||||
/* pwd_len == 1 means pwd = "/", but u->dir begins with '/'
|
||||
already */
|
||||
if (pwd_len > 1)
|
||||
strcpy (result, con->id);
|
||||
strcat (result, u->dir);
|
||||
DEBUGP(("\npwd=\"%s\"", con->id));
|
||||
DEBUGP(("\nu->dir=\"%s\"", u->dir));
|
||||
break;
|
||||
default:
|
||||
abort ();
|
||||
break;
|
||||
*tmpp++ = ']';
|
||||
*tmpp = '\0';
|
||||
target = ntarget;
|
||||
}
|
||||
|
||||
if (!opt.server_response)
|
||||
logprintf (LOG_VERBOSE, "==> CWD %s ... ", result);
|
||||
err = ftp_cwd (&con->rbuf, result);
|
||||
}
|
||||
else
|
||||
{
|
||||
if (!opt.server_response)
|
||||
logprintf (LOG_VERBOSE, "==> CWD %s ... ", u->dir);
|
||||
err = ftp_cwd (&con->rbuf, u->dir);
|
||||
}
|
||||
logprintf (LOG_VERBOSE, "==> CWD %s ... ", target);
|
||||
err = ftp_cwd (&con->rbuf, target);
|
||||
/* FTPRERR, WRITEFAILED, FTPNSFOD */
|
||||
switch (err)
|
||||
{
|
||||
@ -1465,14 +1454,14 @@ ftp_retrieve_dirs (struct urlinfo *u, struct fileinfo *f, ccon *con)
|
||||
if (f->type != FT_DIRECTORY)
|
||||
continue;
|
||||
odir = u->dir;
|
||||
len = 1 + strlen (u->dir) + 1 + strlen (f->name) + 1;
|
||||
len = strlen (u->dir) + 1 + strlen (f->name) + 1;
|
||||
/* Allocate u->dir off stack, but reallocate only if a larger
|
||||
string is needed. */
|
||||
if (len > current_length)
|
||||
current_container = (char *)alloca (len);
|
||||
u->dir = current_container;
|
||||
sprintf (u->dir, "/%s%s%s", odir + (*odir == '/'),
|
||||
(!*odir || (*odir == '/' && !* (odir + 1))) ? "" : "/", f->name);
|
||||
sprintf (u->dir, "%s%s%s", odir,
|
||||
(*odir == '/' && !*(odir + 1)) ? "" : "/", f->name);
|
||||
if (!accdir (u->dir, ALLABS))
|
||||
{
|
||||
logprintf (LOG_VERBOSE, _("\
|
||||
|
Loading…
Reference in New Issue
Block a user