Loading CHANGES +7 −0 Original line number Original line Diff line number Diff line Loading @@ -7,6 +7,13 @@ Changelog Changelog Daniel Stenberg (26 Nov 2009) - Extended and fixed the change I did on Dec 11 for the the progress meter/callback during FTP command/response sequences. It turned out it was really lame before and now the progress meter SHOULD get called at least once per second. Daniel Stenberg (23 Nov 2009) Daniel Stenberg (23 Nov 2009) - Bjorn Augustsson reported a bug which made curl not report any problems even - Bjorn Augustsson reported a bug which made curl not report any problems even though it failed to write a very small download to disk (done in a single though it failed to write a very small download to disk (done in a single Loading lib/ftp.c +54 −50 Original line number Original line Diff line number Diff line Loading @@ -309,34 +309,38 @@ static CURLcode AllowServerConnect(struct connectdata *conn) { { struct SessionHandle *data = conn->data; struct SessionHandle *data = conn->data; curl_socket_t sock = conn->sock[SECONDARYSOCKET]; curl_socket_t sock = conn->sock[SECONDARYSOCKET]; long timeout_ms = Curl_timeleft(conn, NULL, TRUE); long timeout_ms; long interval_ms; curl_socket_t s = CURL_SOCKET_BAD; #ifdef ENABLE_IPV6 struct Curl_sockaddr_storage add; #else struct sockaddr_in add; #endif curl_socklen_t size = (curl_socklen_t) sizeof(add); for(;;) { timeout_ms = Curl_timeleft(conn, NULL, TRUE); if(timeout_ms < 0) { if(timeout_ms <= 0) { /* if a timeout was already reached, bail out */ /* if a timeout was already reached, bail out */ failf(data, "Timed out before server could connect to us"); failf(data, "Timeout while waiting for server connect"); return CURLE_OPERATION_TIMEDOUT; return CURLE_OPERATION_TIMEDOUT; } } switch (Curl_socket_ready(sock, CURL_SOCKET_BAD, (int)timeout_ms)) { interval_ms = 1000; /* use 1 second timeout intervals */ if(timeout_ms < interval_ms) interval_ms = timeout_ms; switch (Curl_socket_ready(sock, CURL_SOCKET_BAD, (int)interval_ms)) { case -1: /* error */ case -1: /* error */ /* let's die here */ /* let's die here */ failf(data, "Error while waiting for server connect"); failf(data, "Error while waiting for server connect"); return CURLE_FTP_PORT_FAILED; return CURLE_FTP_PORT_FAILED; case 0: /* timeout */ case 0: /* timeout */ /* let's die here */ break; /* loop */ failf(data, "Timeout while waiting for server connect"); return CURLE_FTP_PORT_FAILED; default: default: /* we have received data here */ /* we have received data here */ { curl_socket_t s = CURL_SOCKET_BAD; #ifdef ENABLE_IPV6 struct Curl_sockaddr_storage add; #else struct sockaddr_in add; #endif curl_socklen_t size = (curl_socklen_t) sizeof(add); if(0 == getsockname(sock, (struct sockaddr *) &add, &size)) { if(0 == getsockname(sock, (struct sockaddr *) &add, &size)) { size = sizeof(add); size = sizeof(add); Loading @@ -345,7 +349,6 @@ static CURLcode AllowServerConnect(struct connectdata *conn) sclose(sock); /* close the first socket */ sclose(sock); /* close the first socket */ if(CURL_SOCKET_BAD == s) { if(CURL_SOCKET_BAD == s) { /* DIE! */ failf(data, "Error accept()ing server connect"); failf(data, "Error accept()ing server connect"); return CURLE_FTP_PORT_FAILED; return CURLE_FTP_PORT_FAILED; } } Loading @@ -353,11 +356,10 @@ static CURLcode AllowServerConnect(struct connectdata *conn) conn->sock[SECONDARYSOCKET] = s; conn->sock[SECONDARYSOCKET] = s; curlx_nonblock(s, TRUE); /* enable non-blocking */ curlx_nonblock(s, TRUE); /* enable non-blocking */ } break; } return CURLE_OK; return CURLE_OK; } /* switch() */ } /* never reaches this point */ } } /* initialize stuff to prepare for reading a fresh new response */ /* initialize stuff to prepare for reading a fresh new response */ Loading Loading @@ -664,7 +666,7 @@ CURLcode Curl_GetFTPResponse(ssize_t *nreadp, /* return number of bytes read */ return CURLE_OPERATION_TIMEDOUT; /* already too little time */ return CURLE_OPERATION_TIMEDOUT; /* already too little time */ } } interval_ms = 1 * 1000; /* use 1 second timeout intervals */ interval_ms = 1000; /* use 1 second timeout intervals */ if(timeout < interval_ms) if(timeout < interval_ms) interval_ms = timeout; interval_ms = timeout; Loading Loading @@ -3047,6 +3049,7 @@ static CURLcode ftp_easy_statemach(struct connectdata *conn) CURLcode result = CURLE_OK; CURLcode result = CURLE_OK; while(ftpc->state != FTP_STOP) { while(ftpc->state != FTP_STOP) { long interval_ms; long timeout_ms = ftp_state_timeout(conn); long timeout_ms = ftp_state_timeout(conn); if(timeout_ms <=0 ) { if(timeout_ms <=0 ) { Loading @@ -3054,30 +3057,31 @@ static CURLcode ftp_easy_statemach(struct connectdata *conn) return CURLE_OPERATION_TIMEDOUT; /* already too little time */ return CURLE_OPERATION_TIMEDOUT; /* already too little time */ } } interval_ms = 1000; /* use 1 second timeout intervals */ if(timeout_ms < interval_ms) interval_ms = timeout_ms; rc = Curl_socket_ready(ftpc->sendleft?CURL_SOCKET_BAD:sock, /* reading */ rc = Curl_socket_ready(ftpc->sendleft?CURL_SOCKET_BAD:sock, /* reading */ ftpc->sendleft?sock:CURL_SOCKET_BAD, /* writing */ ftpc->sendleft?sock:CURL_SOCKET_BAD, /* writing */ (int)timeout_ms); (int)interval_ms); if(rc == -1) { if(Curl_pgrsUpdate(conn)) failf(data, "select/poll error"); return CURLE_OUT_OF_MEMORY; } else if(rc == 0) { result = CURLE_OPERATION_TIMEDOUT; break; } else { result = ftp_statemach_act(conn); if(result) break; else if(Curl_pgrsUpdate(conn)) result = CURLE_ABORTED_BY_CALLBACK; result = CURLE_ABORTED_BY_CALLBACK; else else result = Curl_speedcheck(data, Curl_tvnow()); result = Curl_speedcheck(data, Curl_tvnow()); if(result) if(result) break; break; if(rc == -1) { failf(data, "select/poll error"); result = CURLE_OUT_OF_MEMORY; } } else if(rc) result = ftp_statemach_act(conn); if(result) break; } } return result; return result; Loading Loading
CHANGES +7 −0 Original line number Original line Diff line number Diff line Loading @@ -7,6 +7,13 @@ Changelog Changelog Daniel Stenberg (26 Nov 2009) - Extended and fixed the change I did on Dec 11 for the the progress meter/callback during FTP command/response sequences. It turned out it was really lame before and now the progress meter SHOULD get called at least once per second. Daniel Stenberg (23 Nov 2009) Daniel Stenberg (23 Nov 2009) - Bjorn Augustsson reported a bug which made curl not report any problems even - Bjorn Augustsson reported a bug which made curl not report any problems even though it failed to write a very small download to disk (done in a single though it failed to write a very small download to disk (done in a single Loading
lib/ftp.c +54 −50 Original line number Original line Diff line number Diff line Loading @@ -309,34 +309,38 @@ static CURLcode AllowServerConnect(struct connectdata *conn) { { struct SessionHandle *data = conn->data; struct SessionHandle *data = conn->data; curl_socket_t sock = conn->sock[SECONDARYSOCKET]; curl_socket_t sock = conn->sock[SECONDARYSOCKET]; long timeout_ms = Curl_timeleft(conn, NULL, TRUE); long timeout_ms; long interval_ms; curl_socket_t s = CURL_SOCKET_BAD; #ifdef ENABLE_IPV6 struct Curl_sockaddr_storage add; #else struct sockaddr_in add; #endif curl_socklen_t size = (curl_socklen_t) sizeof(add); for(;;) { timeout_ms = Curl_timeleft(conn, NULL, TRUE); if(timeout_ms < 0) { if(timeout_ms <= 0) { /* if a timeout was already reached, bail out */ /* if a timeout was already reached, bail out */ failf(data, "Timed out before server could connect to us"); failf(data, "Timeout while waiting for server connect"); return CURLE_OPERATION_TIMEDOUT; return CURLE_OPERATION_TIMEDOUT; } } switch (Curl_socket_ready(sock, CURL_SOCKET_BAD, (int)timeout_ms)) { interval_ms = 1000; /* use 1 second timeout intervals */ if(timeout_ms < interval_ms) interval_ms = timeout_ms; switch (Curl_socket_ready(sock, CURL_SOCKET_BAD, (int)interval_ms)) { case -1: /* error */ case -1: /* error */ /* let's die here */ /* let's die here */ failf(data, "Error while waiting for server connect"); failf(data, "Error while waiting for server connect"); return CURLE_FTP_PORT_FAILED; return CURLE_FTP_PORT_FAILED; case 0: /* timeout */ case 0: /* timeout */ /* let's die here */ break; /* loop */ failf(data, "Timeout while waiting for server connect"); return CURLE_FTP_PORT_FAILED; default: default: /* we have received data here */ /* we have received data here */ { curl_socket_t s = CURL_SOCKET_BAD; #ifdef ENABLE_IPV6 struct Curl_sockaddr_storage add; #else struct sockaddr_in add; #endif curl_socklen_t size = (curl_socklen_t) sizeof(add); if(0 == getsockname(sock, (struct sockaddr *) &add, &size)) { if(0 == getsockname(sock, (struct sockaddr *) &add, &size)) { size = sizeof(add); size = sizeof(add); Loading @@ -345,7 +349,6 @@ static CURLcode AllowServerConnect(struct connectdata *conn) sclose(sock); /* close the first socket */ sclose(sock); /* close the first socket */ if(CURL_SOCKET_BAD == s) { if(CURL_SOCKET_BAD == s) { /* DIE! */ failf(data, "Error accept()ing server connect"); failf(data, "Error accept()ing server connect"); return CURLE_FTP_PORT_FAILED; return CURLE_FTP_PORT_FAILED; } } Loading @@ -353,11 +356,10 @@ static CURLcode AllowServerConnect(struct connectdata *conn) conn->sock[SECONDARYSOCKET] = s; conn->sock[SECONDARYSOCKET] = s; curlx_nonblock(s, TRUE); /* enable non-blocking */ curlx_nonblock(s, TRUE); /* enable non-blocking */ } break; } return CURLE_OK; return CURLE_OK; } /* switch() */ } /* never reaches this point */ } } /* initialize stuff to prepare for reading a fresh new response */ /* initialize stuff to prepare for reading a fresh new response */ Loading Loading @@ -664,7 +666,7 @@ CURLcode Curl_GetFTPResponse(ssize_t *nreadp, /* return number of bytes read */ return CURLE_OPERATION_TIMEDOUT; /* already too little time */ return CURLE_OPERATION_TIMEDOUT; /* already too little time */ } } interval_ms = 1 * 1000; /* use 1 second timeout intervals */ interval_ms = 1000; /* use 1 second timeout intervals */ if(timeout < interval_ms) if(timeout < interval_ms) interval_ms = timeout; interval_ms = timeout; Loading Loading @@ -3047,6 +3049,7 @@ static CURLcode ftp_easy_statemach(struct connectdata *conn) CURLcode result = CURLE_OK; CURLcode result = CURLE_OK; while(ftpc->state != FTP_STOP) { while(ftpc->state != FTP_STOP) { long interval_ms; long timeout_ms = ftp_state_timeout(conn); long timeout_ms = ftp_state_timeout(conn); if(timeout_ms <=0 ) { if(timeout_ms <=0 ) { Loading @@ -3054,30 +3057,31 @@ static CURLcode ftp_easy_statemach(struct connectdata *conn) return CURLE_OPERATION_TIMEDOUT; /* already too little time */ return CURLE_OPERATION_TIMEDOUT; /* already too little time */ } } interval_ms = 1000; /* use 1 second timeout intervals */ if(timeout_ms < interval_ms) interval_ms = timeout_ms; rc = Curl_socket_ready(ftpc->sendleft?CURL_SOCKET_BAD:sock, /* reading */ rc = Curl_socket_ready(ftpc->sendleft?CURL_SOCKET_BAD:sock, /* reading */ ftpc->sendleft?sock:CURL_SOCKET_BAD, /* writing */ ftpc->sendleft?sock:CURL_SOCKET_BAD, /* writing */ (int)timeout_ms); (int)interval_ms); if(rc == -1) { if(Curl_pgrsUpdate(conn)) failf(data, "select/poll error"); return CURLE_OUT_OF_MEMORY; } else if(rc == 0) { result = CURLE_OPERATION_TIMEDOUT; break; } else { result = ftp_statemach_act(conn); if(result) break; else if(Curl_pgrsUpdate(conn)) result = CURLE_ABORTED_BY_CALLBACK; result = CURLE_ABORTED_BY_CALLBACK; else else result = Curl_speedcheck(data, Curl_tvnow()); result = Curl_speedcheck(data, Curl_tvnow()); if(result) if(result) break; break; if(rc == -1) { failf(data, "select/poll error"); result = CURLE_OUT_OF_MEMORY; } } else if(rc) result = ftp_statemach_act(conn); if(result) break; } } return result; return result; Loading