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