diff options
author | Taru Karttunen <taruti@taruti.net> | 2011-03-30 15:46:40 +0300 |
---|---|---|
committer | Taru Karttunen <taruti@taruti.net> | 2011-03-30 15:46:40 +0300 |
commit | e5888a1ffdae813d7575f5fb02275c6bb07e5199 (patch) | |
tree | d8d51eac403f07814b9e936eed0c9a79195e2450 /sys/src/ape/lib/bsd/writev.c |
Import sources from 2011-03-30 iso image
Diffstat (limited to 'sys/src/ape/lib/bsd/writev.c')
-rwxr-xr-x | sys/src/ape/lib/bsd/writev.c | 62 |
1 files changed, 62 insertions, 0 deletions
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 <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 = 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; +} |