- 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:
		
							
								
								
									
										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 | ||||
|   | ||||
							
								
								
									
										104
									
								
								lib/ftp.c
									
									
									
									
									
								
							
							
						
						
									
										104
									
								
								lib/ftp.c
									
									
									
									
									
								
							| @@ -140,16 +140,16 @@ static int ftp_need_type(struct connectdata *conn, | ||||
|                          bool ascii); | ||||
| static CURLcode ftp_do(struct connectdata *conn, bool *done); | ||||
| static CURLcode ftp_done(struct connectdata *conn, | ||||
|                               CURLcode, bool premature); | ||||
|                          CURLcode, bool premature); | ||||
| static CURLcode ftp_connect(struct connectdata *conn, bool *done); | ||||
| static CURLcode ftp_disconnect(struct connectdata *conn); | ||||
| static CURLcode ftp_nextconnect(struct connectdata *conn); | ||||
| static CURLcode ftp_multi_statemach(struct connectdata *conn, bool *done); | ||||
| static int ftp_getsock(struct connectdata *conn, | ||||
|                             curl_socket_t *socks, | ||||
|                             int numsocks); | ||||
|                        curl_socket_t *socks, | ||||
|                        int numsocks); | ||||
| static CURLcode ftp_doing(struct connectdata *conn, | ||||
|                                bool *dophase_done); | ||||
|                           bool *dophase_done); | ||||
| static CURLcode ftp_setup_connection(struct connectdata * conn); | ||||
|  | ||||
| /* easy-to-use macro: */ | ||||
| @@ -309,34 +309,38 @@ 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 */ | ||||
|     { | ||||
|       curl_socket_t s = CURL_SOCKET_BAD; | ||||
|   long timeout_ms; | ||||
|   long interval_ms; | ||||
|   curl_socket_t s = CURL_SOCKET_BAD; | ||||
| #ifdef ENABLE_IPV6 | ||||
|       struct Curl_sockaddr_storage add; | ||||
|   struct Curl_sockaddr_storage add; | ||||
| #else | ||||
|       struct sockaddr_in add; | ||||
|   struct sockaddr_in add; | ||||
| #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)) { | ||||
|         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() */ | ||||
|   } | ||||
|  | ||||
|   return CURLE_OK; | ||||
|   /* 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(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"); | ||||
|       return CURLE_OUT_OF_MEMORY; | ||||
|       result = CURLE_OUT_OF_MEMORY; | ||||
|     } | ||||
|     else if(rc == 0) { | ||||
|       result = CURLE_OPERATION_TIMEDOUT; | ||||
|       break; | ||||
|     } | ||||
|     else { | ||||
|     else if(rc) | ||||
|       result = ftp_statemach_act(conn); | ||||
|       if(result) | ||||
|         break; | ||||
|       else if(Curl_pgrsUpdate(conn)) | ||||
|         result = CURLE_ABORTED_BY_CALLBACK; | ||||
|       else | ||||
|         result = Curl_speedcheck(data, Curl_tvnow()); | ||||
|  | ||||
|       if(result) | ||||
|         break; | ||||
|     } | ||||
|     if(result) | ||||
|       break; | ||||
|   } | ||||
|  | ||||
|   return result; | ||||
|   | ||||
		Reference in New Issue
	
	Block a user
	 Daniel Stenberg
					Daniel Stenberg