1 b2cfc4e2 2003-09-30 devnull #include "lib9.h"
2 b2cfc4e2 2003-09-30 devnull #include <bio.h>
5 b2cfc4e2 2003-09-30 devnull Bseek(Biobuf *bp, off_t offset, int base)
7 75a69d3b 2004-06-16 devnull vlong n, d;
8 39ef727f 2004-06-16 devnull int bufsz;
10 b2cfc4e2 2003-09-30 devnull switch(bp->state) {
12 b2cfc4e2 2003-09-30 devnull fprint(2, "Bseek: unknown state %d\n", bp->state);
13 b2cfc4e2 2003-09-30 devnull return Beof;
15 b2cfc4e2 2003-09-30 devnull case Bracteof:
16 b2cfc4e2 2003-09-30 devnull bp->state = Bractive;
17 b2cfc4e2 2003-09-30 devnull bp->icount = 0;
18 b2cfc4e2 2003-09-30 devnull bp->gbuf = bp->ebuf;
20 b2cfc4e2 2003-09-30 devnull case Bractive:
21 b2cfc4e2 2003-09-30 devnull n = offset;
22 b2cfc4e2 2003-09-30 devnull if(base == 1) {
23 b2cfc4e2 2003-09-30 devnull n += Boffset(bp);
24 b2cfc4e2 2003-09-30 devnull base = 0;
28 b2cfc4e2 2003-09-30 devnull * try to seek within buffer
30 b2cfc4e2 2003-09-30 devnull if(base == 0) {
31 b2cfc4e2 2003-09-30 devnull d = n - Boffset(bp);
32 39ef727f 2004-06-16 devnull bufsz = bp->ebuf - bp->gbuf;
33 39ef727f 2004-06-16 devnull if(-bufsz <= d && d <= bufsz){
34 39ef727f 2004-06-16 devnull bp->icount += d;
35 39ef727f 2004-06-16 devnull if(d >= 0) {
36 39ef727f 2004-06-16 devnull if(bp->icount <= 0)
37 39ef727f 2004-06-16 devnull return n;
39 39ef727f 2004-06-16 devnull if(bp->ebuf - bp->gbuf >= -bp->icount)
40 39ef727f 2004-06-16 devnull return n;
46 b2cfc4e2 2003-09-30 devnull * reset the buffer
48 b2cfc4e2 2003-09-30 devnull n = lseek(bp->fid, n, base);
49 b2cfc4e2 2003-09-30 devnull bp->icount = 0;
50 b2cfc4e2 2003-09-30 devnull bp->gbuf = bp->ebuf;
53 b2cfc4e2 2003-09-30 devnull case Bwactive:
54 b2cfc4e2 2003-09-30 devnull Bflush(bp);
55 b2cfc4e2 2003-09-30 devnull n = lseek(bp->fid, offset, base);
58 b2cfc4e2 2003-09-30 devnull bp->offset = n;
59 b2cfc4e2 2003-09-30 devnull return n;