#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; }