mirror of
https://github.com/moparisthebest/curl
synced 2024-12-21 23:58:49 -05:00
- 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:
parent
cbd527843b
commit
c7d2e4c1e1
7
CHANGES
7
CHANGES
@ -7,6 +7,13 @@
|
||||
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)
|
||||
- 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
|
||||
|
84
lib/ftp.c
84
lib/ftp.c
@ -309,26 +309,8 @@ static CURLcode AllowServerConnect(struct connectdata *conn)
|
||||
{
|
||||
struct SessionHandle *data = conn->data;
|
||||
curl_socket_t sock = conn->sock[SECONDARYSOCKET];
|
||||
long timeout_ms = Curl_timeleft(conn, NULL, TRUE);
|
||||
|
||||
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 */
|
||||
{
|
||||
long timeout_ms;
|
||||
long interval_ms;
|
||||
curl_socket_t s = CURL_SOCKET_BAD;
|
||||
#ifdef ENABLE_IPV6
|
||||
struct Curl_sockaddr_storage add;
|
||||
@ -337,6 +319,28 @@ static CURLcode AllowServerConnect(struct connectdata *conn)
|
||||
#endif
|
||||
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)) {
|
||||
size = sizeof(add);
|
||||
|
||||
@ -345,7 +349,6 @@ static CURLcode AllowServerConnect(struct connectdata *conn)
|
||||
sclose(sock); /* close the first socket */
|
||||
|
||||
if(CURL_SOCKET_BAD == s) {
|
||||
/* DIE! */
|
||||
failf(data, "Error accept()ing server connect");
|
||||
return CURLE_FTP_PORT_FAILED;
|
||||
}
|
||||
@ -353,11 +356,10 @@ static CURLcode AllowServerConnect(struct connectdata *conn)
|
||||
|
||||
conn->sock[SECONDARYSOCKET] = s;
|
||||
curlx_nonblock(s, TRUE); /* enable non-blocking */
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
return CURLE_OK;
|
||||
} /* switch() */
|
||||
}
|
||||
/* never reaches this point */
|
||||
}
|
||||
|
||||
/* 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 */
|
||||
}
|
||||
|
||||
interval_ms = 1 * 1000; /* use 1 second timeout intervals */
|
||||
interval_ms = 1000; /* use 1 second timeout intervals */
|
||||
if(timeout < interval_ms)
|
||||
interval_ms = timeout;
|
||||
|
||||
@ -3047,6 +3049,7 @@ static CURLcode ftp_easy_statemach(struct connectdata *conn)
|
||||
CURLcode result = CURLE_OK;
|
||||
|
||||
while(ftpc->state != FTP_STOP) {
|
||||
long interval_ms;
|
||||
long timeout_ms = ftp_state_timeout(conn);
|
||||
|
||||
if(timeout_ms <=0 ) {
|
||||
@ -3054,30 +3057,31 @@ static CURLcode ftp_easy_statemach(struct connectdata *conn)
|
||||
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 */
|
||||
ftpc->sendleft?sock:CURL_SOCKET_BAD, /* writing */
|
||||
(int)timeout_ms);
|
||||
(int)interval_ms);
|
||||
|
||||
if(rc == -1) {
|
||||
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))
|
||||
if(Curl_pgrsUpdate(conn))
|
||||
result = CURLE_ABORTED_BY_CALLBACK;
|
||||
else
|
||||
result = Curl_speedcheck(data, Curl_tvnow());
|
||||
|
||||
if(result)
|
||||
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;
|
||||
|
Loading…
Reference in New Issue
Block a user