Blob


1 #include <u.h>
2 #include <libc.h>
3 #include <diskfs.h>
5 int nfilereads;
6 void _nfilereads_darwin_sucks(void) { }
8 typedef struct DiskFile DiskFile;
9 struct DiskFile
10 {
11 Disk disk;
12 int fd;
13 };
15 static long
16 preadn(int fd, void *vdata, u32int ulen, u64int offset)
17 {
18 long n;
19 uchar *data;
20 long len;
22 nfilereads++;
23 len = ulen;
24 data = vdata;
25 /* fprint(2, "readn 0x%llux 0x%ux\n", offset, ulen); */
26 while(len > 0){
27 n = pread(fd, data, len, offset);
28 if(n <= 0)
29 break;
30 data += n;
31 offset += n;
32 len -= n;
33 }
34 return data-(uchar*)vdata;
35 }
37 static void
38 diskfileblockput(Block *b)
39 {
40 free(b);
41 }
43 uvlong nreadx;
44 static Block*
45 diskfileread(Disk *dd, u32int len, u64int offset)
46 {
47 int n;
48 Block *b;
49 DiskFile *d = (DiskFile*)dd;
51 b = mallocz(sizeof(Block)+len, 1);
52 if(b == nil)
53 return nil;
54 b->data = (uchar*)&b[1];
55 nreadx += len;
56 n = preadn(d->fd, b->data, len, offset);
57 if(n <= 0){
58 free(b);
59 return nil;
60 }
61 b->_close = diskfileblockput;
62 b->len = n;
63 return b;
64 }
66 static int
67 diskfilesync(Disk *dd)
68 {
69 USED(dd);
70 return 0;
71 }
73 static void
74 diskfileclose(Disk *dd)
75 {
76 DiskFile *d = (DiskFile*)dd;
78 close(d->fd);
79 free(d);
80 }
82 Disk*
83 diskopenfile(char *file)
84 {
85 int fd;
86 DiskFile *d;
88 if((fd = open(file, OREAD)) < 0)
89 return nil;
90 d = mallocz(sizeof(DiskFile), 1);
91 if(d == nil){
92 close(fd);
93 return nil;
94 }
95 d->disk._read = diskfileread;
96 d->disk._sync = diskfilesync;
97 d->disk._close = diskfileclose;
98 d->fd = fd;
99 return &d->disk;