wget: chunked mode fix. Closes bug 3229
Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
This commit is contained in:
		| @@ -466,15 +466,6 @@ static void NOINLINE retrieve_file_data(FILE *dfp, int output_fd) | |||||||
|  |  | ||||||
| 	polldata.fd = fileno(dfp); | 	polldata.fd = fileno(dfp); | ||||||
| 	polldata.events = POLLIN | POLLPRI; | 	polldata.events = POLLIN | POLLPRI; | ||||||
|  |  | ||||||
| 	/* Must use nonblocking I/O, otherwise fread will loop |  | ||||||
| 	 * and *block* until it reads full buffer, |  | ||||||
| 	 * which messes up progress bar and/or timing out. |  | ||||||
| 	 * Because of nonblocking I/O, we need to dance |  | ||||||
| 	 * very carefully around EAGAIN. See explanation at |  | ||||||
| 	 * clearerr() call. |  | ||||||
| 	 */ |  | ||||||
| 	ndelay_on(polldata.fd); |  | ||||||
| #endif | #endif | ||||||
| 	progress_meter(PROGRESS_START); | 	progress_meter(PROGRESS_START); | ||||||
|  |  | ||||||
| @@ -483,6 +474,17 @@ static void NOINLINE retrieve_file_data(FILE *dfp, int output_fd) | |||||||
|  |  | ||||||
| 	/* Loops only if chunked */ | 	/* Loops only if chunked */ | ||||||
| 	while (1) { | 	while (1) { | ||||||
|  |  | ||||||
|  | #if ENABLE_FEATURE_WGET_STATUSBAR || ENABLE_FEATURE_WGET_TIMEOUT | ||||||
|  | 		/* Must use nonblocking I/O, otherwise fread will loop | ||||||
|  | 		 * and *block* until it reads full buffer, | ||||||
|  | 		 * which messes up progress bar and/or timeout logic. | ||||||
|  | 		 * Because of nonblocking I/O, we need to dance | ||||||
|  | 		 * very carefully around EAGAIN. See explanation at | ||||||
|  | 		 * clearerr() call. | ||||||
|  | 		 */ | ||||||
|  | 		ndelay_on(polldata.fd); | ||||||
|  | #endif | ||||||
| 		while (1) { | 		while (1) { | ||||||
| 			int n; | 			int n; | ||||||
| 			unsigned rdsz; | 			unsigned rdsz; | ||||||
| @@ -552,11 +554,15 @@ static void NOINLINE retrieve_file_data(FILE *dfp, int output_fd) | |||||||
| 					break; | 					break; | ||||||
| 			} | 			} | ||||||
| 		} | 		} | ||||||
|  | #if ENABLE_FEATURE_WGET_STATUSBAR || ENABLE_FEATURE_WGET_TIMEOUT | ||||||
|  | 		clearerr(dfp); | ||||||
|  | 		ndelay_off(polldata.fd); | ||||||
|  | #endif | ||||||
|  |  | ||||||
| 		if (!G.chunked) | 		if (!G.chunked) | ||||||
| 			break; | 			break; | ||||||
|  |  | ||||||
| 		fgets_and_trim(dfp); /* This is a newline */ | 		fgets_and_trim(dfp); /* Eat empty line */ | ||||||
|  get_clen: |  get_clen: | ||||||
| 		fgets_and_trim(dfp); | 		fgets_and_trim(dfp); | ||||||
| 		G.content_len = STRTOOFF(G.wget_buf, NULL, 16); | 		G.content_len = STRTOOFF(G.wget_buf, NULL, 16); | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user