|
|
1.1 ! root 1: #define FIO_IMP ! 2: #include "fio.h" ! 3: #include <libc.h> ! 4: ! 5: #define MAXREAD 0xff00 /* 64K - 4K */ ! 6: #define FIOSHORT 100 ! 7: ! 8: long ! 9: Fread(fd, addr, n) ! 10: char *addr; ! 11: long n; ! 12: { ! 13: register unsigned char *p; ! 14: register Fbuffer *f; ! 15: COUNT k; ! 16: char *oaddr = addr; ! 17: char *goal = addr+n; ! 18: ! 19: FIOSET(f, fd); ! 20: again: ! 21: k = f->end - f->next; ! 22: if(n < k) k = n; ! 23: memcpy(addr, (char *)f->next, k); ! 24: f->next += k; ! 25: f->lnext = f->next; /* effectively disable undo */ ! 26: n -= k; ! 27: addr += k; ! 28: if((n > 0) && (n < FIOSHORT)){ /* buffer reads of less than FIOSHORT */ ! 29: if(f->next == f->end) ! 30: f->next = f->end = f->buf; ! 31: if(Ffillbuf(fd) < 0) ! 32: return((long)(addr - oaddr)); ! 33: goto again; ! 34: } ! 35: if(n > 0) ! 36: FIOFLUSH(f->oflush); ! 37: while(n > 0){ /* buffer is empty so do real reads */ ! 38: k = n; ! 39: if(k > MAXREAD) k = MAXREAD; ! 40: if((k = read(fd, addr, k)) < 0) ! 41: return(-1L); ! 42: if(k == 0) break; ! 43: addr += k; ! 44: n -= k; ! 45: f->offset += k; ! 46: } ! 47: return((long)(addr - oaddr)); ! 48: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.