]> git.lizzy.rs Git - plan9front.git/blob - sys/src/ape/lib/bsd/writev.c
Import sources from 2011-03-30 iso image
[plan9front.git] / sys / src / ape / lib / bsd / writev.c
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
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 = n = 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 }