summaryrefslogtreecommitdiff
path: root/libc/stdio/stdio.c
diff options
context:
space:
mode:
Diffstat (limited to 'libc/stdio/stdio.c')
-rw-r--r--libc/stdio/stdio.c24
1 files changed, 13 insertions, 11 deletions
diff --git a/libc/stdio/stdio.c b/libc/stdio/stdio.c
index a42750832..d6c950fd0 100644
--- a/libc/stdio/stdio.c
+++ b/libc/stdio/stdio.c
@@ -423,17 +423,19 @@ off_t _uClibc_fread(unsigned char *buf, off_t bytes, FILE *fp)
goto FROM_BUF;
}
- TRY_READ:
- len = read(fp->fd, p, (unsigned) bytes);
- if (len < 0) {
- if (errno == EINTR) { /* We were interrupted, so try again. */
- goto TRY_READ;
- }
- fp->mode |= __MODE_ERR;
- } else {
- p += len;
- if (len == 0) {
- fp->mode |= __MODE_EOF;
+ while (bytes) {
+ if ((len = read(fp->fd, p, (unsigned) bytes)) < 0) {
+ if (errno != EINTR) { /* We weren't interrupted, so error. */
+ fp->mode |= __MODE_ERR;
+ break;
+ }
+ } else {
+ if (len == 0) {
+ fp->mode |= __MODE_EOF;
+ break;
+ }
+ bytes -= len;
+ p += len;
}
}
}