#include "internal.h" #define MAXHEADERS 20 static io·Header *tracked[MAXHEADERS]; static int doexit; static void untrackall(void *arg) { int i; io·Header *it; for(i=0; i < MAXHEADERS; i++){ it = tracked[i]; if(it){ tracked[i] = nil; io·flush(it); } } } static void untrack(io·Header *io) { int i; for(i=0; istate = io·BufRdr; io->olen = 0; break; case sys·OWrite: track(io); io->state = io·BufWtr; io->olen = -cap; break; } io->b = buf; io->e = buf+cap; io->g = io->e; io->fd = fd; io->cap = cap; io->pos = io->runesz = io->flag = io->ilen = io->nread = 0; return 0; } int io·init(io·Buffer *io, int fd, int mode) { return io·initcap(header(io), fd, mode, io·BufLen + io·BufUngets, io->bytes); } int io·close(io·Header *io) { int err; untrack(io); err = io·flush(io); if(io->flag == io·BufMagic){ io->flag = 0; if((err=sys·close(io->fd))) return err; } return 0; }