]> sjero.net Git - wget/commitdiff
[svn] Support the SIZE command.
authorhniksic <devnull@localhost>
Tue, 20 Nov 2001 21:01:27 +0000 (13:01 -0800)
committerhniksic <devnull@localhost>
Tue, 20 Nov 2001 21:01:27 +0000 (13:01 -0800)
Originally by Dave Turner.  Modified by Ian Abbott and published
in <3BFAA33C.6236.6D42F6@localhost>.

src/ChangeLog
src/ftp-basic.c
src/ftp.c
src/ftp.h

index 24b227770a3061df00f9d345a09414824892a76c..9e766719ff89eb9f2fb61493de5feb880903958d 100644 (file)
@@ -1,3 +1,11 @@
+2001-08-21  Dave Turner <dct25@hermes.cam.ac.uk>
+
+       * ftp-basic.c (ftp_size): New function to send non-standard SIZE
+         command to server to request file size.
+       * ftp.h (ftp_size): Export it.
+       * ftp.c (getftp): Use new ftp_size function if restoring
+         transfer of a file with unknown size.
+
 2001-11-20  Hrvoje Niksic  <hniksic@arsdigita.com>
 
        * url.c (parseurl): Don't depend on the now-obsolete TYPE.
index cb2621aec1f817dde667157bad3620eebc0e9396..ee17669058f0f9a6249ded23125e892dccc814bd 100644 (file)
@@ -21,6 +21,8 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.  */
 
 #include <stdio.h>
 #include <stdlib.h>
+#include <errno.h>
+
 #ifdef HAVE_STRING_H
 # include <string.h>
 #else
@@ -631,3 +633,60 @@ ftp_pwd (struct rbuf *rbuf, char **pwd)
   /* All OK.  */
   return FTPOK;
 }
+/* Sends the SIZE command to the server, and returns the value in 'size'.
+ * If an error occurs, size is set to zero. */
+uerr_t
+ftp_size (struct rbuf *rbuf, const char *file, long int *size)
+{
+  char *request, *respline;
+  int nwritten;
+  uerr_t err;
+
+  /* Send PWD request.  */
+  request = ftp_request ("SIZE", file);
+  nwritten = iwrite (RBUF_FD (rbuf), request, strlen (request));
+  if (nwritten < 0)
+    {
+      xfree (request);
+      *size = 0;
+      return WRITEFAILED;
+    }
+  xfree (request);
+  /* Get appropriate response.  */
+  err = ftp_response (rbuf, &respline);
+  if (err != FTPOK)
+    {
+      xfree (respline);
+      *size = 0;
+      return err;
+    }
+  if (*respline == '5')
+    {
+      /* 
+       * Probably means SIZE isn't supported on this server.
+       * Error is nonfatal since SIZE isn't in RFC 959 
+       */
+      xfree (respline);
+      *size = 0;
+      return FTPOK;
+    }
+
+  errno = 0;
+  *size = strtol (respline + 4, NULL, 0);
+  if (errno) 
+    {
+      /* 
+       * Couldn't parse the response for some reason.  On the (few)
+       * tests I've done, the response is 213 <SIZE> with nothing else -
+       * maybe something a bit more resilient is necessary.  It's not a
+       * fatal error, however.
+       */
+      xfree (respline);
+      *size = 0;
+      return FTPOK;
+    }
+
+  xfree (respline);
+  /* All OK.  */
+  return FTPOK;
+}
index 7bcca7ab5664111550491a61da38899e9f31cd74..7427d9e8d935da379e24aebd8f40ac03cbf9bda3 100644 (file)
--- a/src/ftp.c
+++ b/src/ftp.c
@@ -462,6 +462,38 @@ Error in server response, closing control connection.\n"));
   else /* do not CWD */
     logputs (LOG_VERBOSE, _("==> CWD not required.\n"));
 
+  if ((cmd & DO_RETR) && restval && *len == 0)
+    {
+      if (opt.verbose)
+       {
+          if (!opt.server_response)
+           logprintf (LOG_VERBOSE, "==> SIZE %s ... ", u->file);
+       }
+
+      err = ftp_size(&con->rbuf, u->file, len);
+      /* FTPRERR */
+      switch (err)
+       {
+       case FTPRERR:
+       case FTPSRVERR :
+         logputs (LOG_VERBOSE, "\n");
+         logputs (LOG_NOTQUIET, _("\
+Error in server response, closing control connection.\n"));
+         CLOSE (csock);
+         rbuf_uninitialize (&con->rbuf);
+         return err;
+         break;
+       case FTPOK:
+         /* Everything is OK.  */
+         break;
+       default:
+         abort ();
+         break;
+       }
+       if (!opt.server_response)
+         logputs (LOG_VERBOSE, _("done.\n"));
+    }
+
   /* If anything is to be retrieved, PORT (or PASV) must be sent.  */
   if (cmd & (DO_LIST | DO_RETR))
     {
index 718106ced28aac000289c1a3430d150ea15c6a32..e0ad7ccb946c820f80030cdcad75188558eae06f 100644 (file)
--- a/src/ftp.h
+++ b/src/ftp.h
@@ -44,6 +44,7 @@ uerr_t ftp_rest PARAMS ((struct rbuf *, long));
 uerr_t ftp_list PARAMS ((struct rbuf *, const char *));
 uerr_t ftp_syst PARAMS ((struct rbuf *, enum stype *));
 uerr_t ftp_pwd PARAMS ((struct rbuf *, char **));
+uerr_t ftp_size PARAMS ((struct rbuf *, const char *, long int *));
 
 struct urlinfo;