|
|
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.