]> sjero.net Git - wget/commitdiff
Merging heads.
authorMicah Cowan <micah@cowan.name>
Fri, 16 May 2008 05:36:20 +0000 (22:36 -0700)
committerMicah Cowan <micah@cowan.name>
Fri, 16 May 2008 05:36:20 +0000 (22:36 -0700)
ChangeLog
src/ChangeLog
src/ftp.c
src/http.c
src/main.c

index 697f2ca6da2f469ccdc5b85e5731f946ec12da33..1a20b3c6186bf140767485152f2ad0571981f260 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -2,6 +2,11 @@
 
        * 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>
 
        * NEWS: Translations and -N/-O.
index c5edf7a32f3eb5693395faa74237a5ef1feb4820..0d4c94b53a664c33e20ed55feb9f55ce24ffbf02 100644 (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>
 
        * main.c (prompt_for_password): Use the quote module.
index 0ecc6bcb1dafbb417ed12922f75b3f433e83a812..17df502996cae7154b8cb0d7b82f3fa3bd692d6f 100644 (file)
--- 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));
index 0252d3421f07f491a59c443f50ab08aa6480d2af..11dc9cc8f7d08c2678e09a486f135e21118e16de 100644 (file)
@@ -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));
index e239b6d009ff0aa71456ed150aacc7a69c585e0b..159973a0021a2e36e80d5c389f8c40fa38f3b91e 100644 (file)
@@ -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)