1#include "libc.h"
2#include "stdio_impl.h"
3#include <sys/uio.h>
4
5size_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