From 02892e4fd8c1faff74edd2ce7e232b0c8442c5c9 Mon Sep 17 00:00:00 2001 From: Daniel Stenberg Date: Fri, 9 Apr 2010 16:54:52 +0200 Subject: 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. --- lib/ftp.c | 19 +++++++++++++++++-- 1 file changed, 17 insertions(+), 2 deletions(-) (limited to 'lib/ftp.c') 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; } -- cgit v1.2.3