Merging heads.

This commit is contained in:
Micah Cowan 2008-05-15 22:36:20 -07:00
commit d78cd8d8f8
5 changed files with 56 additions and 9 deletions

View File

@ -2,6 +2,11 @@
* NEWS: Entry for --ask-password. * NEWS: Entry for --ask-password.
2008-05-14 Joao Ferreira <joao@joaoff.com>
* src/main.c, src/http.c, src/ftp.c: -nc is now working in
conjunction with '-O file'.
2008-05-12 Micah Cowan <micah@cowan.name> 2008-05-12 Micah Cowan <micah@cowan.name>
* NEWS: Translations and -N/-O. * NEWS: Translations and -N/-O.

View File

@ -1,3 +1,8 @@
2008-05-15 Steven Schubiger <schubiger@gmail.com>
* ftp.c (getftp): Verify that the file actually exists in FTP, by
checking it against the listing.
2008-05-15 Micah Cowan <micah@cowan.name> 2008-05-15 Micah Cowan <micah@cowan.name>
* main.c (prompt_for_password): Use the quote module. * main.c (prompt_for_password): Use the quote module.

View File

@ -227,6 +227,8 @@ print_length (wgint size, wgint start, bool authoritative)
logputs (LOG_VERBOSE, !authoritative ? _(" (unauthoritative)\n") : "\n"); logputs (LOG_VERBOSE, !authoritative ? _(" (unauthoritative)\n") : "\n");
} }
static uerr_t ftp_get_listing (struct url *, ccon *, struct fileinfo **);
/* Retrieves a file with denoted parameters through opening an FTP /* Retrieves a file with denoted parameters through opening an FTP
connection to the server. It always closes the data connection, connection to the server. It always closes the data connection,
and closes the control connection in case of error. */ and closes the control connection in case of error. */
@ -779,12 +781,37 @@ Error in server response, closing control connection.\n"));
if (cmd & DO_RETR) if (cmd & DO_RETR)
{ {
/* If we're in spider mode, don't really retrieve anything. The /* If we're in spider mode, don't really retrieve anything except
fact that we got to this point should be proof enough that the directory listing and verify whether the given "file" exists. */
the file exists, vaguely akin to HTTP's concept of a "HEAD"
request. */
if (opt.spider) if (opt.spider)
{ {
bool exists = false;
uerr_t res;
struct fileinfo *f;
res = ftp_get_listing (u, con, &f);
/* Set the DO_RETR command flag again, because it gets unset when
calling ftp_get_listing() and would otherwise cause an assertion
failure earlier on when this function gets repeatedly called
(e.g., when recursing). */
con->cmd |= DO_RETR;
if (res == RETROK)
{
while (f)
{
if (!strcmp (f->name, u->file))
{
exists = true;
break;
}
f = f->next;
}
if (!exists)
{
logputs (LOG_VERBOSE, "\n");
logprintf (LOG_NOTQUIET, _("No such file `%s'.\n"),
escnonprint (u->file));
}
}
fd_close (csock); fd_close (csock);
con->csock = -1; con->csock = -1;
fd_close (dtsock); fd_close (dtsock);
@ -1096,7 +1123,9 @@ ftp_loop_internal (struct url *u, struct fileinfo *f, ccon *con)
if (!con->target) if (!con->target)
con->target = url_file_name (u); con->target = url_file_name (u);
if (opt.noclobber && file_exists_p (con->target)) /* If the output_document was given, then this check was already done and
the file didn't exist. Hence the !opt.output_document */
if (opt.noclobber && !opt.output_document && file_exists_p (con->target))
{ {
logprintf (LOG_VERBOSE, logprintf (LOG_VERBOSE,
_("File %s already there; not retrieving.\n"), quote (con->target)); _("File %s already there; not retrieving.\n"), quote (con->target));

View File

@ -1823,10 +1823,11 @@ gethttp (struct url *u, struct http_stat *hs, int *dt, struct url *proxy)
/* TODO: perform this check only once. */ /* TODO: perform this check only once. */
if (!hs->existence_checked && file_exists_p (hs->local_file)) if (!hs->existence_checked && file_exists_p (hs->local_file))
{ {
if (opt.noclobber) if (opt.noclobber && !opt.output_document)
{ {
/* If opt.noclobber is turned on and file already exists, do not /* If opt.noclobber is turned on and file already exists, do not
retrieve the file */ retrieve the file. But if the output_document was given, then this
test was already done and the file didn't exist. Hence the !opt.output_document */
logprintf (LOG_VERBOSE, _("\ logprintf (LOG_VERBOSE, _("\
File %s already there; not retrieving.\n\n"), quote (hs->local_file)); File %s already there; not retrieving.\n\n"), quote (hs->local_file));
/* If the file is there, we suppose it's retrieved OK. */ /* If the file is there, we suppose it's retrieved OK. */
@ -2376,10 +2377,11 @@ http_loop (struct url *u, char **newloc, char **local_file, const char *referer,
/* TODO: Ick! This code is now in both gethttp and http_loop, and is /* TODO: Ick! This code is now in both gethttp and http_loop, and is
* screaming for some refactoring. */ * screaming for some refactoring. */
if (got_name && file_exists_p (hstat.local_file) && opt.noclobber) if (got_name && file_exists_p (hstat.local_file) && opt.noclobber && !opt.output_document)
{ {
/* If opt.noclobber is turned on and file already exists, do not /* If opt.noclobber is turned on and file already exists, do not
retrieve the file */ retrieve the file. But if the output_document was given, then this
test was already done and the file didn't exist. Hence the !opt.output_document */
logprintf (LOG_VERBOSE, _("\ logprintf (LOG_VERBOSE, _("\
File %s already there; not retrieving.\n\n"), File %s already there; not retrieving.\n\n"),
quote (hstat.local_file)); quote (hstat.local_file));

View File

@ -920,6 +920,12 @@ WARNING: timestamping does nothing in combination with -O. See the manual\n\
for details.\n\n")); for details.\n\n"));
opt.timestamping = false; opt.timestamping = false;
} }
if (opt.noclobber && file_exists_p(opt.output_document))
{
/* Check if output file exists; if it does, exit. */
logprintf (LOG_VERBOSE, _("File `%s' already there; not retrieving.\n"), opt.output_document);
exit(1);
}
} }
if (opt.ask_passwd && opt.passwd) if (opt.ask_passwd && opt.passwd)