1 #include "stdio_impl.h"
2 #include <sys/uio.h>
3 
__stdio_read(FILE * f,unsigned char * buf,size_t len)4 size_t __stdio_read(FILE* f, unsigned char* buf, size_t len) {
5     struct iovec iov[2] = {{.iov_base = buf, .iov_len = len - !!f->buf_size},
6                            {.iov_base = f->buf, .iov_len = f->buf_size}};
7     ssize_t cnt = readv(f->fd, iov, 2);
8     if (cnt <= 0) {
9         f->flags |= F_EOF ^ ((F_ERR ^ F_EOF) & cnt);
10         return cnt;
11     }
12     if (cnt <= iov[0].iov_len)
13         return cnt;
14     cnt -= iov[0].iov_len;
15     f->rpos = f->buf;
16     f->rend = f->buf + cnt;
17     if (f->buf_size)
18         buf[len - 1] = *f->rpos++;
19     return len;
20 }
21