mirror of
https://github.com/moparisthebest/wget
synced 2024-07-03 16:38:41 -04:00
[svn] Fix retrieval of directories when initial CWD is not `/'.
Published in <sxsitkc709p.fsf@florida.arsdigita.de>. * url.c (parseurl): Don't strip trailing slash when u->dir is "/" because that strips the *leading* slash, thus forcing relative FTP retrieval. * ftp.c (getftp): Convert initial FTP directory from VMS to UNIX notation for VMS servers. (ftp_retrieve_dirs): Do not prepend '/' to f->name when odir is an empty string.
This commit is contained in:
parent
90a26b7987
commit
963863113f
@ -1,3 +1,16 @@
|
|||||||
|
2001-04-11 Hrvoje Niksic <hniksic@arsdigita.com>
|
||||||
|
|
||||||
|
* url.c (parseurl): Don't strip trailing slash when u->dir is "/"
|
||||||
|
because that strips the *leading* slash, thus forcing relative
|
||||||
|
FTP retrieval.
|
||||||
|
|
||||||
|
2001-04-10 Jan Prikryl <prikryl@cg.tuwien.ac.at>
|
||||||
|
|
||||||
|
* ftp.c (getftp): Convert initial FTP directory from VMS to UNIX
|
||||||
|
notation for VMS servers.
|
||||||
|
(ftp_retrieve_dirs): Do not prepend '/' to f->name when
|
||||||
|
odir is an empty string.
|
||||||
|
|
||||||
2001-04-10 Jan Prikryl <prikryl@cg.tuwien.ac.at>
|
2001-04-10 Jan Prikryl <prikryl@cg.tuwien.ac.at>
|
||||||
|
|
||||||
* ftp-ls.c (ftp_parse_winnt_ls): Made the fix for AM/PM more
|
* ftp-ls.c (ftp_parse_winnt_ls): Made the fix for AM/PM more
|
||||||
|
57
src/ftp.c
57
src/ftp.c
@ -298,6 +298,29 @@ Error in server response, closing control connection.\n"));
|
|||||||
abort ();
|
abort ();
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
/* VMS will report something like "PUB$DEVICE:[INITIAL.FOLDER]".
|
||||||
|
Convert it to "/INITIAL/FOLDER" */
|
||||||
|
if (con->rs == ST_VMS)
|
||||||
|
{
|
||||||
|
char *path = strchr (con->id, '[');
|
||||||
|
char *pathend = path ? strchr (path + 1, ']') : NULL;
|
||||||
|
if (!path || !pathend)
|
||||||
|
DEBUGP (("Initial VMS directory not in the form [...]!\n"));
|
||||||
|
else
|
||||||
|
{
|
||||||
|
char *idir = con->id;
|
||||||
|
DEBUGP (("Preprocessing the initial VMS directory\n"));
|
||||||
|
DEBUGP ((" old = '%s'\n", con->id));
|
||||||
|
/* We do the conversion in-place by copying the stuff
|
||||||
|
between [ and ] to the beginning, and changing dots
|
||||||
|
to slashes at the same time. */
|
||||||
|
*idir++ = '/';
|
||||||
|
for (++path; path < pathend; path++, idir++)
|
||||||
|
*idir = *path == '.' ? '/' : *path;
|
||||||
|
*idir = '\0';
|
||||||
|
DEBUGP ((" new = '%s'\n\n", con->id));
|
||||||
|
}
|
||||||
|
}
|
||||||
if (!opt.server_response)
|
if (!opt.server_response)
|
||||||
logputs (LOG_VERBOSE, _("done.\n"));
|
logputs (LOG_VERBOSE, _("done.\n"));
|
||||||
|
|
||||||
@ -361,19 +384,27 @@ Error in server response, closing control connection.\n"));
|
|||||||
{
|
{
|
||||||
int idlen = strlen (con->id);
|
int idlen = strlen (con->id);
|
||||||
char *ntarget = (char *)alloca (idlen + 1 + strlen (u->dir) + 1);
|
char *ntarget = (char *)alloca (idlen + 1 + strlen (u->dir) + 1);
|
||||||
/* pwd_len == 1 means pwd = "/" */
|
/* idlen == 1 means con->id = "/" */
|
||||||
sprintf (ntarget, "%s%s%s", con->id, idlen == 1 ? "" : "/",
|
sprintf (ntarget, "%s%s%s", con->id, idlen == 1 ? "" : "/",
|
||||||
target);
|
target);
|
||||||
|
DEBUGP (("Prepended initial PWD to relative path:\n"));
|
||||||
|
DEBUGP ((" old: '%s'\n new: '%s'\n", target, ntarget));
|
||||||
target = ntarget;
|
target = ntarget;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* If the FTP host runs VMS, we will have to convert it to
|
/* If the FTP host runs VMS, we will have to convert the absolute
|
||||||
VMS style as VMS does not like leading slashes. "VMS
|
directory path in UNIX notation to absolute directory path in
|
||||||
style" is [dir.subdir.subsubdir]. */
|
VMS notation as VMS FTP servers do not like UNIX notation of
|
||||||
|
absolute paths. "VMS notation" is [dir.subdir.subsubdir]. */
|
||||||
|
|
||||||
if (con->rs == ST_VMS)
|
if (con->rs == ST_VMS)
|
||||||
{
|
{
|
||||||
char *tmpp;
|
char *tmpp;
|
||||||
char *ntarget = (char *)alloca (strlen (target) + 1);
|
char *ntarget = (char *)alloca (strlen (target) + 2);
|
||||||
|
/* We use a converted initial dir, so directories in
|
||||||
|
TARGET will be separated with slashes, something like
|
||||||
|
"/INITIAL/FOLDER/DIR/SUBDIR". Convert that to
|
||||||
|
"[INITIAL.FOLDER.DIR.SUBDIR]". */
|
||||||
strcpy (ntarget, target);
|
strcpy (ntarget, target);
|
||||||
assert (*ntarget == '/');
|
assert (*ntarget == '/');
|
||||||
*ntarget = '[';
|
*ntarget = '[';
|
||||||
@ -382,6 +413,8 @@ Error in server response, closing control connection.\n"));
|
|||||||
*tmpp = '.';
|
*tmpp = '.';
|
||||||
*tmpp++ = ']';
|
*tmpp++ = ']';
|
||||||
*tmpp = '\0';
|
*tmpp = '\0';
|
||||||
|
DEBUGP (("Changed file name to VMS syntax:\n"));
|
||||||
|
DEBUGP ((" Unix: '%s'\n VMS: '%s'\n", target, ntarget));
|
||||||
target = ntarget;
|
target = ntarget;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1460,8 +1493,18 @@ ftp_retrieve_dirs (struct urlinfo *u, struct fileinfo *f, ccon *con)
|
|||||||
if (len > current_length)
|
if (len > current_length)
|
||||||
current_container = (char *)alloca (len);
|
current_container = (char *)alloca (len);
|
||||||
u->dir = current_container;
|
u->dir = current_container;
|
||||||
sprintf (u->dir, "%s%s%s", odir,
|
if (*odir == '\0'
|
||||||
(*odir == '/' && !*(odir + 1)) ? "" : "/", f->name);
|
|| (*odir == '/' && *(odir + 1) == '\0'))
|
||||||
|
/* If ODIR is empty or just "/", simply append f->name to
|
||||||
|
ODIR. (In the former case, to preserve u->dir being
|
||||||
|
relative; in the latter case, to avoid double slash.) */
|
||||||
|
sprintf (u->dir, "%s%s", odir, f->name);
|
||||||
|
else
|
||||||
|
/* Else, use a separator. */
|
||||||
|
sprintf (u->dir, "%s/%s", odir, f->name);
|
||||||
|
DEBUGP (("Composing new CWD relative to the initial directory.\n"));
|
||||||
|
DEBUGP ((" odir = '%s'\n f->name = '%s'\n u->dir = '%s'\n\n",
|
||||||
|
odir, f->name, u->dir));
|
||||||
if (!accdir (u->dir, ALLABS))
|
if (!accdir (u->dir, ALLABS))
|
||||||
{
|
{
|
||||||
logprintf (LOG_VERBOSE, _("\
|
logprintf (LOG_VERBOSE, _("\
|
||||||
|
@ -514,7 +514,7 @@ parseurl (const char *url, struct urlinfo *u, int strict)
|
|||||||
DEBUGP (("ndir %s\n", u->dir));
|
DEBUGP (("ndir %s\n", u->dir));
|
||||||
/* Strip trailing `/'. */
|
/* Strip trailing `/'. */
|
||||||
l = strlen (u->dir);
|
l = strlen (u->dir);
|
||||||
if (l && u->dir[l - 1] == '/')
|
if (l > 1 && u->dir[l - 1] == '/')
|
||||||
u->dir[l - 1] = '\0';
|
u->dir[l - 1] = '\0';
|
||||||
/* Re-create the path: */
|
/* Re-create the path: */
|
||||||
abs_ftp = (u->proto == URLFTP && *u->dir == '/');
|
abs_ftp = (u->proto == URLFTP && *u->dir == '/');
|
||||||
|
Loading…
Reference in New Issue
Block a user