text: #include <sys/types.h>
  #include <unistd.h>
  #include <string.h>
  
  /* bsd extensions */
  #include <sys/uio.h>
  #include <sys/socket.h>
  
  #include "priv.h"
  
  int
  writev(int fd, struct iovec *v, int ent)
  {
  	int i, n, written;
  	char *t, *e, *f;
  	char buf[10*1024];
  
  	written = 0;
  	t = buf;
  	e = buf+sizeof(buf);
  	for(;ent ; v++, ent--){
  		n = v->iov_len;
  		f = v->iov_base;
  		while(n > 0){
  			i = e-t;
  			if(n < i){
  				memmove(t, f, n);
  				t += n;
  				break;
  			}
  			memmove(t, f, i);
  			n -= i;
  			f += i;
  			i = write(fd, buf, sizeof(buf));
  			if(i < 0){
  				if(written > 0){
  					return written;
  				}else{
  					_syserrno();
  					return -1;
  				}
  			}
  			written += i;
  			if(i != sizeof(buf)) {
  				return written;
  			}
  			t = buf;
  		}
  	}
  	i = t - buf;
  	if(i > 0){
  		n = write(fd, buf, i);
  		if(n < 0){
  			if(written == 0){
  				_syserrno();
  				return -1;
  			}
  		} else
  			written += n;
  	}
  	return written;
  }
  