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 d3285dcb 2005-12-16 devnull int nfilereads;
6 6519f895 2007-11-05 rsc void _nfilereads_darwin_sucks(void) { }
8 0c98da8b 2005-07-13 devnull typedef struct DiskFile DiskFile;
9 0c98da8b 2005-07-13 devnull struct DiskFile
11 0c98da8b 2005-07-13 devnull Disk disk;
15 0c98da8b 2005-07-13 devnull static long
16 0c98da8b 2005-07-13 devnull preadn(int fd, void *vdata, u32int ulen, u64int offset)
19 0c98da8b 2005-07-13 devnull uchar *data;
20 0c98da8b 2005-07-13 devnull long len;
22 0c98da8b 2005-07-13 devnull nfilereads++;
23 0c98da8b 2005-07-13 devnull len = ulen;
24 0c98da8b 2005-07-13 devnull data = vdata;
25 cbeb0b26 2006-04-01 devnull /* fprint(2, "readn 0x%llux 0x%ux\n", offset, ulen); */
26 0c98da8b 2005-07-13 devnull while(len > 0){
27 0c98da8b 2005-07-13 devnull n = pread(fd, data, len, offset);
28 0c98da8b 2005-07-13 devnull if(n <= 0)
30 0c98da8b 2005-07-13 devnull data += n;
31 0c98da8b 2005-07-13 devnull offset += n;
32 0c98da8b 2005-07-13 devnull len -= n;
34 0c98da8b 2005-07-13 devnull return data-(uchar*)vdata;
37 0c98da8b 2005-07-13 devnull static void
38 0c98da8b 2005-07-13 devnull diskfileblockput(Block *b)
43 0c98da8b 2005-07-13 devnull uvlong nreadx;
44 0c98da8b 2005-07-13 devnull static Block*
45 0c98da8b 2005-07-13 devnull diskfileread(Disk *dd, u32int len, u64int offset)
48 0c98da8b 2005-07-13 devnull Block *b;
49 0c98da8b 2005-07-13 devnull DiskFile *d = (DiskFile*)dd;
51 0c98da8b 2005-07-13 devnull b = mallocz(sizeof(Block)+len, 1);
52 0c98da8b 2005-07-13 devnull if(b == nil)
53 0c98da8b 2005-07-13 devnull return nil;
54 0c98da8b 2005-07-13 devnull b->data = (uchar*)&b[1];
55 0c98da8b 2005-07-13 devnull nreadx += len;
56 0c98da8b 2005-07-13 devnull n = preadn(d->fd, b->data, len, offset);
57 0c98da8b 2005-07-13 devnull if(n <= 0){
59 0c98da8b 2005-07-13 devnull return nil;
61 0c98da8b 2005-07-13 devnull b->_close = diskfileblockput;
62 0c98da8b 2005-07-13 devnull b->len = n;
63 0c98da8b 2005-07-13 devnull return b;
66 0c98da8b 2005-07-13 devnull static int
67 0c98da8b 2005-07-13 devnull diskfilesync(Disk *dd)
69 0c98da8b 2005-07-13 devnull USED(dd);
70 0c98da8b 2005-07-13 devnull return 0;
73 0c98da8b 2005-07-13 devnull static void
74 0c98da8b 2005-07-13 devnull diskfileclose(Disk *dd)
76 0c98da8b 2005-07-13 devnull DiskFile *d = (DiskFile*)dd;
78 0c98da8b 2005-07-13 devnull close(d->fd);
83 0c98da8b 2005-07-13 devnull diskopenfile(char *file)
86 0c98da8b 2005-07-13 devnull DiskFile *d;
88 0c98da8b 2005-07-13 devnull if((fd = open(file, OREAD)) < 0)
89 0c98da8b 2005-07-13 devnull return nil;
90 0c98da8b 2005-07-13 devnull d = mallocz(sizeof(DiskFile), 1);
91 0c98da8b 2005-07-13 devnull if(d == nil){
92 0c98da8b 2005-07-13 devnull close(fd);
93 0c98da8b 2005-07-13 devnull return nil;
95 0c98da8b 2005-07-13 devnull d->disk._read = diskfileread;
96 0c98da8b 2005-07-13 devnull d->disk._sync = diskfilesync;
97 0c98da8b 2005-07-13 devnull d->disk._close = diskfileclose;
98 0c98da8b 2005-07-13 devnull d->fd = fd;
99 0c98da8b 2005-07-13 devnull return &d->disk;