diff options
Diffstat (limited to 'libc/stdio/stdio.c')
-rw-r--r-- | libc/stdio/stdio.c | 24 |
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; } } } |