X-Git-Url: http://sjero.net/git/?p=wget;a=blobdiff_plain;f=src%2Fftp-basic.c;h=0e11a8d3353a66d9385373dd47ea81be0e6690ad;hp=4920f72523052679d049103bf4d04e8f2f55654f;hb=d5e283b1a75c5f8249300b465b4e7b55130bec49;hpb=b7c6c35be5930695cc64ef2d54d6f421f8511553
diff --git a/src/ftp-basic.c b/src/ftp-basic.c
index 4920f725..0e11a8d3 100644
--- a/src/ftp-basic.c
+++ b/src/ftp-basic.c
@@ -1,6 +1,6 @@
/* Basic FTP routines.
Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003,
- 2004, 2005, 2006, 2007 Free Software Foundation, Inc.
+ 2004, 2005, 2006, 2007, 2008 Free Software Foundation, Inc.
This file is part of GNU Wget.
@@ -17,17 +17,18 @@ GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with Wget. If not, see .
-In addition, as a special exception, the Free Software Foundation
-gives permission to link the code of its release of Wget with the
-OpenSSL project's "OpenSSL" library (or with modified versions of it
-that use the same license as the "OpenSSL" library), and distribute
-the linked executables. You must obey the GNU General Public License
-in all respects for all of the code used other than "OpenSSL". If you
-modify this file, you may extend this exception to your version of the
-file, but you are not obligated to do so. If you do not wish to do
-so, delete this exception statement from your version. */
+Additional permission under GNU GPL version 3 section 7
-#include
+If you modify this program, or any covered work, by linking or
+combining it with the OpenSSL project's OpenSSL library (or a
+modified version of that library), containing parts covered by the
+terms of the OpenSSL or SSLeay licenses, the Free Software Foundation
+grants you additional permission to convey the resulting work.
+Corresponding Source for a non-source form of such a combination
+shall include the source code for the parts of OpenSSL used as well
+as that of the covered work. */
+
+#include "wget.h"
#include
#include
@@ -38,8 +39,6 @@ so, delete this exception statement from your version. */
#ifdef HAVE_UNISTD_H
# include
#endif
-
-#include "wget.h"
#include "utils.h"
#include "connect.h"
#include "host.h"
@@ -69,7 +68,7 @@ ftp_response (int fd, char **ret_line)
return FTPRERR;
/* Strip trailing CRLF before printing the line, so that
- escnonprint doesn't include bogus \012 and \015. */
+ quotting doesn't include bogus \012 and \015. */
p = strchr (line, '\0');
if (p > line && p[-1] == '\n')
*--p = '\0';
@@ -77,9 +76,10 @@ ftp_response (int fd, char **ret_line)
*--p = '\0';
if (opt.server_response)
- logprintf (LOG_NOTQUIET, "%s\n", escnonprint (line));
+ logprintf (LOG_NOTQUIET, "%s\n",
+ quotearg_style (escape_quoting_style, line));
else
- DEBUGP (("%s\n", escnonprint (line)));
+ DEBUGP (("%s\n", quotearg_style (escape_quoting_style, line)));
/* The last line of output is the one that begins with "ddd ". */
if (c_isdigit (line[0]) && c_isdigit (line[1]) && c_isdigit (line[2])
@@ -117,7 +117,8 @@ ftp_request (const char *command, const char *value)
if (*p == '\r' || *p == '\n')
*p = ' ';
DEBUGP (("\nDetected newlines in %s \"%s\"; changing to %s \"%s\"\n",
- command, escnonprint (value), command, escnonprint (defanged)));
+ command, quotearg_style (escape_quoting_style, value),
+ command, quotearg_style (escape_quoting_style, defanged)));
/* Make VALUE point to the defanged copy of the string. */
value = defanged;
}
@@ -188,7 +189,7 @@ ftp_login (int csock, const char *acc, const char *pass)
"331 s/key ",
"331 opiekey "
};
- int i;
+ size_t i;
const char *seed = NULL;
for (i = 0; i < countof (skey_head); i++)
@@ -888,6 +889,42 @@ ftp_cwd (int csock, const char *dir)
return FTPOK;
}
+/* Sends DELE command to the FTP server. */
+uerr_t
+ftp_dele (int csock, const char *file)
+{
+ char *request, *respline;
+ int nwritten;
+ uerr_t err;
+
+ /* Send DELE request. */
+ request = ftp_request ("DELE", file);
+ nwritten = fd_write (csock, request, strlen (request), -1.0);
+ if (nwritten < 0)
+ {
+ xfree (request);
+ return WRITEFAILED;
+ }
+ xfree (request);
+ /* Get appropriate response. */
+ err = ftp_response (csock, &respline);
+ if (err != FTPOK)
+ return err; /* Return with early bad status. */
+
+ /* All OK, so far. */
+ if (*respline == '5')
+ {
+ err = FTPNSFOD; /* Permanent Negative Completion. */
+ }
+ else if (*respline != '2') /* Success might be 226 or 250 (or ???). */
+ {
+ err = FTPRERR; /* Not Positive Completion. */
+ }
+
+ xfree (respline); /* Free "respline" storage. */
+ return err; /* Return response-based status code. */
+}
+
/* Sends REST command to the FTP server. */
uerr_t
ftp_rest (int csock, wgint offset)
@@ -957,17 +994,24 @@ ftp_retr (int csock, const char *file)
/* Sends the LIST command to the server. If FILE is NULL, send just
`LIST' (no space). */
uerr_t
-ftp_list (int csock, const char *file)
+ftp_list (int csock, const char *file, enum stype rs)
{
char *request, *respline;
int nwritten;
uerr_t err;
bool ok = false;
- int i = 0;
+ size_t i = 0;
/* Try `LIST -a' first and revert to `LIST' in case of failure. */
const char *list_commands[] = { "LIST -a",
"LIST" };
+ /* 2008-01-29 SMS. For a VMS FTP server, where "LIST -a" may not
+ fail, but will never do what is desired here, skip directly to the
+ simple "LIST" command (assumed to be the last one in the list).
+ */
+ if (rs == ST_VMS)
+ i = countof (list_commands)- 1;
+
do {
/* Send request. */
request = ftp_request (list_commands[i], file);