- 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.
This commit is contained in:
Daniel Stenberg 2009-11-26 19:07:54 +00:00
parent cbd527843b
commit c7d2e4c1e1
2 changed files with 61 additions and 50 deletions

View File

@ -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

View File

@ -309,26 +309,8 @@ 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;
if(timeout_ms < 0) {
/* if a timeout was already reached, bail out */
failf(data, "Timed out before server could connect to us");
return CURLE_OPERATION_TIMEDOUT;
}
switch (Curl_socket_ready(sock, CURL_SOCKET_BAD, (int)timeout_ms)) {
case -1: /* error */
/* let's die here */
failf(data, "Error while waiting for server connect");
return CURLE_FTP_PORT_FAILED;
case 0: /* timeout */
/* let's die here */
failf(data, "Timeout while waiting for server connect");
return CURLE_FTP_PORT_FAILED;
default:
/* we have received data here */
{
curl_socket_t s = CURL_SOCKET_BAD; curl_socket_t s = CURL_SOCKET_BAD;
#ifdef ENABLE_IPV6 #ifdef ENABLE_IPV6
struct Curl_sockaddr_storage add; struct Curl_sockaddr_storage add;
@ -337,6 +319,28 @@ static CURLcode AllowServerConnect(struct connectdata *conn)
#endif #endif
curl_socklen_t size = (curl_socklen_t) sizeof(add); curl_socklen_t size = (curl_socklen_t) sizeof(add);
for(;;) {
timeout_ms = Curl_timeleft(conn, NULL, TRUE);
if(timeout_ms <= 0) {
/* if a timeout was already reached, bail out */
failf(data, "Timeout while waiting for server connect");
return CURLE_OPERATION_TIMEDOUT;
}
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 */
/* let's die here */
failf(data, "Error while waiting for server connect");
return CURLE_FTP_PORT_FAILED;
case 0: /* timeout */
break; /* loop */
default:
/* we have received data here */
if(0 == getsockname(sock, (struct sockaddr *) &add, &size)) { if(0 == getsockname(sock, (struct sockaddr *) &add, &size)) {
size = sizeof(add); size = sizeof(add);
@ -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;
} }
@ -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 */
@ -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;
@ -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 ) {
@ -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;