Blob


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