summaryrefslogtreecommitdiff
path: root/networking/wget.c
diff options
context:
space:
mode:
authorMatt Kraai <kraai@debian.org>2001-05-09 19:15:46 +0000
committerMatt Kraai <kraai@debian.org>2001-05-09 19:15:46 +0000
commit854125f6e6f62d91f01ad23be6c8a9e64fc79636 (patch)
tree8c2e90750c6c040c08d9a658c2dca8eb489ff578 /networking/wget.c
parentd283e1cfe97984bb1a15a16baa9316eef607025e (diff)
downloadbusybox-w32-854125f6e6f62d91f01ad23be6c8a9e64fc79636.tar.gz
busybox-w32-854125f6e6f62d91f01ad23be6c8a9e64fc79636.tar.bz2
busybox-w32-854125f6e6f62d91f01ad23be6c8a9e64fc79636.zip
Make stdio functions which can be interrupted by the progressmeter timer
recover gracefully from EINTR.
Diffstat (limited to 'networking/wget.c')
-rw-r--r--networking/wget.c54
1 files changed, 49 insertions, 5 deletions
diff --git a/networking/wget.c b/networking/wget.c
index 8261d9cb6..cb96e65a3 100644
--- a/networking/wget.c
+++ b/networking/wget.c
@@ -72,6 +72,50 @@ static void close_and_delete_outfile(FILE* output, char *fname_out, int do_conti
72 } 72 }
73} 73}
74 74
75/* Read NMEMB elements of SIZE bytes into PTR from STREAM. Returns the
76 * number of elements read, and a short count if an eof or non-interrupt
77 * error is encountered. */
78static size_t safe_fread(void *ptr, size_t size, size_t nmemb, FILE *stream)
79{
80 size_t ret = 0;
81
82 do {
83 clearerr(stream);
84 ret += fread((char *)ptr + (ret * size), size, nmemb - ret, stream);
85 } while (ret < nmemb && ferror(stream) && errno == EINTR);
86
87 return ret;
88}
89
90/* Write NMEMB elements of SIZE bytes from PTR to STREAM. Returns the
91 * number of elements written, and a short count if an eof or non-interrupt
92 * error is encountered. */
93static size_t safe_fwrite(void *ptr, size_t size, size_t nmemb, FILE *stream)
94{
95 size_t ret = 0;
96
97 do {
98 clearerr(stream);
99 ret += fwrite((char *)ptr + (ret * size), size, nmemb - ret, stream);
100 } while (ret < nmemb && ferror(stream) && errno == EINTR);
101
102 return ret;
103}
104
105/* Read a line or SIZE - 1 bytes into S, whichever is less, from STREAM.
106 * Returns S, or NULL if an eof or non-interrupt error is encountered. */
107static char *safe_fgets(char *s, int size, FILE *stream)
108{
109 char *ret;
110
111 do {
112 clearerr(stream);
113 ret = fgets(s, size, stream);
114 } while (ret == NULL && ferror(stream) && errno == EINTR);
115
116 return ret;
117}
118
75#define close_delete_and_die(s...) { \ 119#define close_delete_and_die(s...) { \
76 close_and_delete_outfile(output, fname_out, do_continue); \ 120 close_and_delete_outfile(output, fname_out, do_continue); \
77 error_msg_and_die(s); } 121 error_msg_and_die(s); }
@@ -395,8 +439,8 @@ read_response: if (fgets(buf, sizeof(buf), sfp) == NULL)
395 progressmeter(-1); 439 progressmeter(-1);
396#endif 440#endif
397 do { 441 do {
398 while ((filesize > 0 || !got_clen) && (n = fread(buf, 1, chunked ? (filesize > sizeof(buf) ? sizeof(buf) : filesize) : sizeof(buf), dfp)) > 0) { 442 while ((filesize > 0 || !got_clen) && (n = safe_fread(buf, 1, chunked ? (filesize > sizeof(buf) ? sizeof(buf) : filesize) : sizeof(buf), dfp)) > 0) {
399 fwrite(buf, 1, n, output); 443 safe_fwrite(buf, 1, n, output);
400#ifdef BB_FEATURE_WGET_STATUSBAR 444#ifdef BB_FEATURE_WGET_STATUSBAR
401 statbytes+=n; 445 statbytes+=n;
402#endif 446#endif
@@ -405,8 +449,8 @@ read_response: if (fgets(buf, sizeof(buf), sfp) == NULL)
405 } 449 }
406 450
407 if (chunked) { 451 if (chunked) {
408 fgets(buf, sizeof(buf), dfp); /* This is a newline */ 452 safe_fgets(buf, sizeof(buf), dfp); /* This is a newline */
409 fgets(buf, sizeof(buf), dfp); 453 safe_fgets(buf, sizeof(buf), dfp);
410 filesize = strtol(buf, (char **) NULL, 16); 454 filesize = strtol(buf, (char **) NULL, 16);
411 if (filesize==0) chunked = 0; /* all done! */ 455 if (filesize==0) chunked = 0; /* all done! */
412 } 456 }
@@ -733,7 +777,7 @@ progressmeter(int flag)
733 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 777 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
734 * SUCH DAMAGE. 778 * SUCH DAMAGE.
735 * 779 *
736 * $Id: wget.c,v 1.36 2001/04/17 18:13:16 markw Exp $ 780 * $Id: wget.c,v 1.37 2001/05/09 19:15:46 kraai Exp $
737 */ 781 */
738 782
739 783