#include        <u.h>
#include        <libc.h>
#include        <bio.h>

long
Bwrite(Biobufhdr *bp, void *ap, long count)
{
       long c;
       uchar *p;
       int i, n, oc;
       char errbuf[ERRMAX];

       p = ap;
       c = count;
       oc = bp->ocount;

       while(c > 0) {
               n = -oc;
               if(n > c)
                       n = c;
               if(n == 0) {
                       if(bp->state != Bwactive)
                               return Beof;
                       i = bp->iof(bp, bp->bbuf, bp->bsize);
                       if(i != bp->bsize) {
                               errstr(errbuf, sizeof errbuf);
                               if(strstr(errbuf, "interrupt") == nil) {
                                       bp->state = Binactive;
                                       Berror(bp, "write error: %s", errbuf);
                               }
                               errstr(errbuf, sizeof errbuf);
                               return Beof;
                       }
                       bp->offset += i;
                       oc = -bp->bsize;
                       continue;
               }
               memmove(bp->ebuf+oc, p, n);
               oc += n;
               c -= n;
               p += n;
       }
       bp->ocount = oc;
       return count-c;
}