]> git.lizzy.rs Git - plan9front.git/blob - sys/src/libbio/bwrite.c
bio: add support for custom I/O handler via Biofn
[plan9front.git] / sys / src / libbio / bwrite.c
1 #include        <u.h>
2 #include        <libc.h>
3 #include        <bio.h>
4
5 long
6 Bwrite(Biobufhdr *bp, void *ap, long count)
7 {
8         long c;
9         uchar *p;
10         int i, n, oc;
11         char errbuf[ERRMAX];
12
13         p = ap;
14         c = count;
15         oc = bp->ocount;
16
17         while(c > 0) {
18                 n = -oc;
19                 if(n > c)
20                         n = c;
21                 if(n == 0) {
22                         if(bp->state != Bwactive)
23                                 return Beof;
24                         i = bp->iof(bp, bp->bbuf, bp->bsize);
25                         if(i != bp->bsize) {
26                                 errstr(errbuf, sizeof errbuf);
27                                 if(strstr(errbuf, "interrupt") == nil) {
28                                         bp->state = Binactive;
29                                         Berror(bp, "write error: %s", errbuf);
30                                 }
31                                 errstr(errbuf, sizeof errbuf);
32                                 return Beof;
33                         }
34                         bp->offset += i;
35                         oc = -bp->bsize;
36                         continue;
37                 }
38                 memmove(bp->ebuf+oc, p, n);
39                 oc += n;
40                 c -= n;
41                 p += n;
42         }
43         bp->ocount = oc;
44         return count-c;
45 }