1 0c98da8b 2005-07-13 devnull #include <u.h>
2 0c98da8b 2005-07-13 devnull #include <libc.h>
3 0c98da8b 2005-07-13 devnull #include <diskfs.h>
5 0c98da8b 2005-07-13 devnull typedef struct DiskFile DiskFile;
6 0c98da8b 2005-07-13 devnull struct DiskFile
8 0c98da8b 2005-07-13 devnull Disk disk;
12 0c98da8b 2005-07-13 devnull int nfilereads;
14 0c98da8b 2005-07-13 devnull static long
15 0c98da8b 2005-07-13 devnull preadn(int fd, void *vdata, u32int ulen, u64int offset)
18 0c98da8b 2005-07-13 devnull uchar *data;
19 0c98da8b 2005-07-13 devnull long len;
21 0c98da8b 2005-07-13 devnull nfilereads++;
22 0c98da8b 2005-07-13 devnull len = ulen;
23 0c98da8b 2005-07-13 devnull data = vdata;
24 0c98da8b 2005-07-13 devnull // fprint(2, "readn 0x%llux 0x%ux\n", offset, ulen);
25 0c98da8b 2005-07-13 devnull while(len > 0){
26 0c98da8b 2005-07-13 devnull n = pread(fd, data, len, offset);
27 0c98da8b 2005-07-13 devnull if(n <= 0)
29 0c98da8b 2005-07-13 devnull data += n;
30 0c98da8b 2005-07-13 devnull offset += n;
31 0c98da8b 2005-07-13 devnull len -= n;
33 0c98da8b 2005-07-13 devnull return data-(uchar*)vdata;
36 0c98da8b 2005-07-13 devnull static void
37 0c98da8b 2005-07-13 devnull diskfileblockput(Block *b)
42 0c98da8b 2005-07-13 devnull uvlong nreadx;
43 0c98da8b 2005-07-13 devnull static Block*
44 0c98da8b 2005-07-13 devnull diskfileread(Disk *dd, u32int len, u64int offset)
47 0c98da8b 2005-07-13 devnull Block *b;
48 0c98da8b 2005-07-13 devnull DiskFile *d = (DiskFile*)dd;
50 0c98da8b 2005-07-13 devnull b = mallocz(sizeof(Block)+len, 1);
51 0c98da8b 2005-07-13 devnull if(b == nil)
52 0c98da8b 2005-07-13 devnull return nil;
53 0c98da8b 2005-07-13 devnull b->data = (uchar*)&b[1];
54 0c98da8b 2005-07-13 devnull nreadx += len;
55 0c98da8b 2005-07-13 devnull n = preadn(d->fd, b->data, len, offset);
56 0c98da8b 2005-07-13 devnull if(n <= 0){
58 0c98da8b 2005-07-13 devnull return nil;
60 0c98da8b 2005-07-13 devnull b->_close = diskfileblockput;
61 0c98da8b 2005-07-13 devnull b->len = n;
62 0c98da8b 2005-07-13 devnull return b;
65 0c98da8b 2005-07-13 devnull static int
66 0c98da8b 2005-07-13 devnull diskfilesync(Disk *dd)
68 0c98da8b 2005-07-13 devnull USED(dd);
69 0c98da8b 2005-07-13 devnull return 0;
72 0c98da8b 2005-07-13 devnull static void
73 0c98da8b 2005-07-13 devnull diskfileclose(Disk *dd)
75 0c98da8b 2005-07-13 devnull DiskFile *d = (DiskFile*)dd;
77 0c98da8b 2005-07-13 devnull close(d->fd);
82 0c98da8b 2005-07-13 devnull diskopenfile(char *file)
85 0c98da8b 2005-07-13 devnull DiskFile *d;
87 0c98da8b 2005-07-13 devnull if((fd = open(file, OREAD)) < 0)
88 0c98da8b 2005-07-13 devnull return nil;
89 0c98da8b 2005-07-13 devnull d = mallocz(sizeof(DiskFile), 1);
90 0c98da8b 2005-07-13 devnull if(d == nil){
91 0c98da8b 2005-07-13 devnull close(fd);
92 0c98da8b 2005-07-13 devnull return nil;
94 0c98da8b 2005-07-13 devnull d->disk._read = diskfileread;
95 0c98da8b 2005-07-13 devnull d->disk._sync = diskfilesync;
96 0c98da8b 2005-07-13 devnull d->disk._close = diskfileclose;
97 0c98da8b 2005-07-13 devnull d->fd = fd;
98 0c98da8b 2005-07-13 devnull return &d->disk;