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)9 size_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