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 } 63