xref: /plan9/sys/src/ape/lib/bsd/writev.c (revision 781103c4074deb8af160e8a0da2742ba6b29dc2b)
1 #include <sys/types.h>
2 #include <unistd.h>
3 #include <string.h>
4 
5 /* bsd extensions */
6 #include <sys/uio.h>
7 #include <sys/socket.h>
8 
9 #include "priv.h"
10 
11 int
writev(int fd,struct iovec * v,int ent)12 writev(int fd, struct iovec *v, int ent)
13 {
14 	int i, n, written;
15 	char *t, *e, *f;
16 	char buf[10*1024];
17 
18 	written = 0;
19 	t = buf;
20 	e = buf+sizeof(buf);
21 	for(;ent ; v++, ent--){
22 		n = v->iov_len;
23 		f = v->iov_base;
24 		while(n > 0){
25 			i = e-t;
26 			if(n < i){
27 				memmove(t, f, n);
28 				t += n;
29 				break;
30 			}
31 			memmove(t, f, i);
32 			n -= i;
33 			f += i;
34 			i = write(fd, buf, sizeof(buf));
35 			if(i < 0){
36 				if(written > 0){
37 					return written;
38 				}else{
39 					_syserrno();
40 					return -1;
41 				}
42 			}
43 			written += i;
44 			if(i != sizeof(buf)) {
45 				return written;
46 			}
47 			t = buf;
48 		}
49 	}
50 	i = t - buf;
51 	if(i > 0){
52 		n = write(fd, buf, i);
53 		if(n < 0){
54 			if(written == 0){
55 				_syserrno();
56 				return -1;
57 			}
58 		} else
59 			written += n;
60 	}
61 	return written;
62 }
63