diff options
Diffstat (limited to 'src/base/bufio/write.c')
-rw-r--r-- | src/base/bufio/write.c | 40 |
1 files changed, 40 insertions, 0 deletions
diff --git a/src/base/bufio/write.c b/src/base/bufio/write.c new file mode 100644 index 0000000..8b64055 --- /dev/null +++ b/src/base/bufio/write.c @@ -0,0 +1,40 @@ +#include "internal.h" + +intptr +bio·write(io·Header *io, intptr len, void *buf) +{ + char *b; + intptr c, o, nw, n; + + b = buf; + c = len; + o = io->olen; + + while(c > 0){ + n = -o; + if(n > c) + n = c; + if(n == 0){ + if(io->state != io·BufWtr) + return io·BufEof; + switch(sys·write(io->fd, io->cap, io->b, &nw)){ + case 0: + if(nw != io->cap) goto error; + io->pos += nw; + o = -io->cap; + continue; + case sys·ErrorInterrupt: + io->state = io·BufNil; + /* fallthrough */ + default: error: + return io·BufEof; + } + } + mem·move(io->e+o, b, n); + o += n; + c -= n; + b += n; + } + io->olen = o; + return len-c; +} |