blob: b72f053daa70f6ff5170c198403c2ca088262384 [file] [log] [blame]
rsc0c98da82005-07-13 03:48:35 +00001#include <u.h>
2#include <libc.h>
3#include <diskfs.h>
4
5typedef struct DiskFile DiskFile;
6struct DiskFile
7{
8 Disk disk;
9 int fd;
10};
11
12int nfilereads;
13
14static long
15preadn(int fd, void *vdata, u32int ulen, u64int offset)
16{
17 long n;
18 uchar *data;
19 long len;
20
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}
35
36static void
37diskfileblockput(Block *b)
38{
39 free(b);
40}
41
42uvlong nreadx;
43static Block*
44diskfileread(Disk *dd, u32int len, u64int offset)
45{
46 int n;
47 Block *b;
48 DiskFile *d = (DiskFile*)dd;
49
50 b = mallocz(sizeof(Block)+len, 1);
51 if(b == nil)
52 return nil;
53 b->data = (uchar*)&b[1];
54nreadx += 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}
64
65static int
66diskfilesync(Disk *dd)
67{
68 USED(dd);
69 return 0;
70}
71
72static void
73diskfileclose(Disk *dd)
74{
75 DiskFile *d = (DiskFile*)dd;
76
77 close(d->fd);
78 free(d);
79}
80
81Disk*
82diskopenfile(char *file)
83{
84 int fd;
85 DiskFile *d;
86
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}