FTP quote commands prefixed with '*' now can fail without aborting
authorDaniel Stenberg <daniel@haxx.se>
Fri, 9 Apr 2010 14:54:52 +0000 (16:54 +0200)
committerDaniel Stenberg <daniel@haxx.se>
Fri, 9 Apr 2010 14:54:52 +0000 (16:54 +0200)
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.

CHANGES
RELEASE-NOTES
lib/ftp.c
tests/data/test227

diff --git a/CHANGES b/CHANGES
index eadf532..3d4674b 100644 (file)
--- 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().
 
index 9ecb0f1..cac8b06 100644 (file)
@@ -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:
 
index 0ec5243..f821d12 100644 (file)
--- 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;
       }
index 55a24e1..523fa02 100644 (file)
@@ -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\r
 PWD\r
 NOOP 1\r
+FAIL\r
 EPSV\r
 PASV\r
 TYPE I\r
 NOOP 2\r
+FAIL HARD\r
 SIZE 227\r
 RETR 227\r
 NOOP 3\r