diff options
author | Matt Kraai <kraai@debian.org> | 2001-05-09 19:15:46 +0000 |
---|---|---|
committer | Matt Kraai <kraai@debian.org> | 2001-05-09 19:15:46 +0000 |
commit | 854125f6e6f62d91f01ad23be6c8a9e64fc79636 (patch) | |
tree | 8c2e90750c6c040c08d9a658c2dca8eb489ff578 /networking/wget.c | |
parent | d283e1cfe97984bb1a15a16baa9316eef607025e (diff) | |
download | busybox-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.c | 54 |
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. */ | ||
78 | static 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. */ | ||
93 | static 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. */ | ||
107 | static 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 | ||