diff --git a/ChangeLog b/ChangeLog index 697f2ca6..1a20b3c6 100644 --- a/ChangeLog +++ b/ChangeLog @@ -2,6 +2,11 @@ * NEWS: Entry for --ask-password. +2008-05-14 Joao Ferreira + + * src/main.c, src/http.c, src/ftp.c: -nc is now working in + conjunction with '-O file'. + 2008-05-12 Micah Cowan * NEWS: Translations and -N/-O. diff --git a/src/ChangeLog b/src/ChangeLog index c5edf7a3..0d4c94b5 100644 --- a/src/ChangeLog +++ b/src/ChangeLog @@ -1,3 +1,8 @@ +2008-05-15 Steven Schubiger + + * ftp.c (getftp): Verify that the file actually exists in FTP, by + checking it against the listing. + 2008-05-15 Micah Cowan * main.c (prompt_for_password): Use the quote module. diff --git a/src/ftp.c b/src/ftp.c index 0ecc6bcb..17df5029 100644 --- a/src/ftp.c +++ b/src/ftp.c @@ -227,6 +227,8 @@ print_length (wgint size, wgint start, bool authoritative) 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 connection to the server. It always closes the data connection, 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 we're in spider mode, don't really retrieve anything. The - fact that we got to this point should be proof enough that - the file exists, vaguely akin to HTTP's concept of a "HEAD" - request. */ + /* If we're in spider mode, don't really retrieve anything except + the directory listing and verify whether the given "file" exists. */ 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); con->csock = -1; fd_close (dtsock); @@ -1096,7 +1123,9 @@ ftp_loop_internal (struct url *u, struct fileinfo *f, ccon *con) if (!con->target) 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, _("File %s already there; not retrieving.\n"), quote (con->target)); diff --git a/src/http.c b/src/http.c index 0252d342..11dc9cc8 100644 --- a/src/http.c +++ b/src/http.c @@ -1823,10 +1823,11 @@ gethttp (struct url *u, struct http_stat *hs, int *dt, struct url *proxy) /* TODO: perform this check only once. */ 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 - 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, _("\ File %s already there; not retrieving.\n\n"), quote (hs->local_file)); /* 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 * 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 - 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, _("\ File %s already there; not retrieving.\n\n"), quote (hstat.local_file)); diff --git a/src/main.c b/src/main.c index e239b6d0..159973a0 100644 --- a/src/main.c +++ b/src/main.c @@ -920,6 +920,12 @@ WARNING: timestamping does nothing in combination with -O. See the manual\n\ for details.\n\n")); 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)