aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--CHANGES5
-rw-r--r--RELEASE-NOTES1
-rw-r--r--lib/ftp.c19
-rw-r--r--tests/data/test2275
4 files changed, 27 insertions, 3 deletions
diff --git a/CHANGES b/CHANGES
index eadf532ca..3d4674b25 100644
--- a/CHANGES
+++ b/CHANGES
@@ -6,6 +6,11 @@
Changelog
+Daniel Stenberg (9 Apr 2010)
+- Prefixing the FTP quote commands with an asterisk really only worked for the
+ postquote actions. This is now fixed and test case 227 has been extended to
+ verify.
+
Kamil Dudka (4 Apr 2010)
- Eliminated a race condition in Curl_resolv_timeout().
diff --git a/RELEASE-NOTES b/RELEASE-NOTES
index 9ecb0f1dd..cac8b06d9 100644
--- a/RELEASE-NOTES
+++ b/RELEASE-NOTES
@@ -45,6 +45,7 @@ This release includes the following bugfixes:
o RTSP GET_PARAMETER
o timeout after last data chunk was handled
o SFTP download hang
+ o FTP quote commands prefixed with '*' now can fail without aborting
This release includes the following known bugs:
diff --git a/lib/ftp.c b/lib/ftp.c
index 0ec524336..f821d124d 100644
--- a/lib/ftp.c
+++ b/lib/ftp.c
@@ -1424,6 +1424,12 @@ static CURLcode ftp_state_quote(struct connectdata *conn,
break;
}
+ /*
+ * This state uses:
+ * 'count1' to iterate over the commands to send
+ * 'count2' to store wether to allow commands to fail
+ */
+
if(init)
ftpc->count1 = 0;
else
@@ -1438,7 +1444,15 @@ static CURLcode ftp_state_quote(struct connectdata *conn,
i++;
}
if(item) {
- PPSENDF(&ftpc->pp, "%s", item->data);
+ char *cmd = item->data;
+ if(cmd[0] == '*') {
+ cmd++;
+ ftpc->count2 = 1; /* the sent command is allowed to fail */
+ }
+ else
+ ftpc->count2 = 0; /* failure means cancel operation */
+
+ PPSENDF(&ftpc->pp, "%s", cmd);
state(conn, instate);
quote = TRUE;
}
@@ -2658,7 +2672,8 @@ static CURLcode ftp_statemach_act(struct connectdata *conn)
case FTP_POSTQUOTE:
case FTP_RETR_PREQUOTE:
case FTP_STOR_PREQUOTE:
- if(ftpcode >= 400) {
+ if((ftpcode >= 400) && !ftpc->count2) {
+ /* failure reponse code, and not allowed to fail */
failf(conn->data, "QUOT command failed with %03d", ftpcode);
return CURLE_QUOTE_ERROR;
}
diff --git a/tests/data/test227 b/tests/data/test227
index 55a24e108..523fa0253 100644
--- a/tests/data/test227
+++ b/tests/data/test227
@@ -19,6 +19,7 @@ works
</data>
<servercmd>
REPLY EPSV 500 no such command
+REPLY FAIL 500 this might not be a failure!
</servercmd>
</reply>
@@ -31,7 +32,7 @@ ftp
FTP with quote ops
</name>
<command>
-ftp://%HOSTIP:%FTPPORT/227 -Q "NOOP 1" -Q "+NOOP 2" -Q "-NOOP 3"
+ftp://%HOSTIP:%FTPPORT/227 -Q "NOOP 1" -Q "+NOOP 2" -Q "-NOOP 3" -Q "*FAIL" -Q "+*FAIL HARD"
</command>
</client>
@@ -42,10 +43,12 @@ USER anonymous
PASS ftp@example.com
PWD
NOOP 1
+FAIL
EPSV
PASV
TYPE I
NOOP 2
+FAIL HARD
SIZE 227
RETR 227
NOOP 3