From e5888a1ffdae813d7575f5fb02275c6bb07e5199 Mon Sep 17 00:00:00 2001 From: Taru Karttunen Date: Wed, 30 Mar 2011 15:46:40 +0300 Subject: Import sources from 2011-03-30 iso image --- sys/src/ape/lib/bsd/writev.c | 62 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 62 insertions(+) create mode 100755 sys/src/ape/lib/bsd/writev.c (limited to 'sys/src/ape/lib/bsd/writev.c') diff --git a/sys/src/ape/lib/bsd/writev.c b/sys/src/ape/lib/bsd/writev.c new file mode 100755 index 000000000..fbb36b692 --- /dev/null +++ b/sys/src/ape/lib/bsd/writev.c @@ -0,0 +1,62 @@ +#include +#include +#include + +/* bsd extensions */ +#include +#include + +#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 = n = 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; +} -- cgit v1.2.3