aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDaniel Stenberg <daniel@haxx.se>2010-04-09 16:54:52 +0200
committerDaniel Stenberg <daniel@haxx.se>2010-04-09 16:54:52 +0200
commit02892e4fd8c1faff74edd2ce7e232b0c8442c5c9 (patch)
tree0a1c7ce3e1ea0181bd1bf382388b738f2b5d573d
parent10977f57de0d2426f479ef4d36f8a203488fdda7 (diff)
FTP quote commands prefixed with '*' now can fail without aborting
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.
-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