1 #include "libc.h"
2 #include "stdio_impl.h"
3 #include <sys/uio.h>
4 
__stdio_write(FILE * f,const unsigned char * buf,size_t len)5 size_t __stdio_write(FILE* f, const unsigned char* buf, size_t len) {
6     struct iovec iovs[2] = {{.iov_base = f->wbase, .iov_len = f->wpos - f->wbase},
7                             {.iov_base = (void*)buf, .iov_len = len}};
8     struct iovec* iov = iovs;
9     size_t rem = iov[0].iov_len + iov[1].iov_len;
10     int iovcnt = 2;
11     ssize_t cnt = 0;
12     for (;;) {
13         cnt = writev(f->fd, iov, iovcnt);
14         if (cnt == rem) {
15             f->wend = f->buf + f->buf_size;
16             f->wpos = f->wbase = f->buf;
17             return len;
18         }
19         if (cnt < 0) {
20             f->wpos = f->wbase = f->wend = 0;
21             f->flags |= F_ERR;
22             return iovcnt == 2 ? 0 : len - iov[0].iov_len;
23         }
24         rem -= cnt;
25         if (cnt >= iov[0].iov_len) {
26             cnt -= iov[0].iov_len;
27             iov++;
28             iovcnt--;
29         }
30         iov[0].iov_base = (char*)iov[0].iov_base + cnt;
31         iov[0].iov_len -= cnt;
32     }
33 }
34