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