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