aboutsummaryrefslogtreecommitdiff
path: root/lib/url.c
diff options
context:
space:
mode:
authorDaniel Stenberg <daniel@haxx.se>2013-08-05 23:49:53 +0200
committerDaniel Stenberg <daniel@haxx.se>2013-08-06 09:57:59 +0200
commit7cc00d9a832c42a330888aa5c11a2abad1bd5ac0 (patch)
tree6a5cd7dd22df9292abd502fed6b5e25c72bcecbd /lib/url.c
parent230e16dc033a05ad9b2ed8a499f74b69886e0865 (diff)
FTP: when EPSV gets a 229 but fails to connect, retry with PASV
This is a regression as this logic used to work. It isn't clear when it broke, but I'm assuming in 7.28.0 when we went all-multi internally. This likely never worked with the multi interface. As the failed connection is detected once the multi state has reached DO_MORE, the Curl_do_more() function was now expanded somewhat so that the ftp_do_more() function can request to go "back" to the previous state when it makes another attempt - using PASV. Added test case 1233 to verify this fix. It has the little issue that it assumes no service is listening/accepting connections on port 1... Reported-by: byte_bucket in the #curl IRC channel
Diffstat (limited to 'lib/url.c')
-rw-r--r--lib/url.c10
1 files changed, 6 insertions, 4 deletions
diff --git a/lib/url.c b/lib/url.c
index d2149abd8..7cec5bccd 100644
--- a/lib/url.c
+++ b/lib/url.c
@@ -5841,18 +5841,20 @@ CURLcode Curl_do(struct connectdata **connp, bool *done)
*
* TODO: A future libcurl should be able to work away this state.
*
+ * 'complete' can return 0 for incomplete, 1 for done and -1 for go back to
+ * DOING state there's more work to do!
*/
-CURLcode Curl_do_more(struct connectdata *conn, bool *completed)
+CURLcode Curl_do_more(struct connectdata *conn, int *complete)
{
CURLcode result=CURLE_OK;
- *completed = FALSE;
+ *complete = 0;
if(conn->handler->do_more)
- result = conn->handler->do_more(conn, completed);
+ result = conn->handler->do_more(conn, complete);
- if(!result && *completed)
+ if(!result && (*complete == 1))
/* do_complete must be called after the protocol-specific DO function */
do_complete(conn);