file.c (1444B)
1 #include <u.h> 2 #include <libc.h> 3 #include <diskfs.h> 4 5 int nfilereads; 6 void _nfilereads_darwin_sucks(void) { } 7 8 typedef struct DiskFile DiskFile; 9 struct DiskFile 10 { 11 Disk disk; 12 int fd; 13 }; 14 15 static long 16 preadn(int fd, void *vdata, u32int ulen, u64int offset) 17 { 18 long n; 19 uchar *data; 20 long len; 21 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 } 36 37 static void 38 diskfileblockput(Block *b) 39 { 40 free(b); 41 } 42 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; 50 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 } 65 66 static int 67 diskfilesync(Disk *dd) 68 { 69 USED(dd); 70 return 0; 71 } 72 73 static void 74 diskfileclose(Disk *dd) 75 { 76 DiskFile *d = (DiskFile*)dd; 77 78 close(d->fd); 79 free(d); 80 } 81 82 Disk* 83 diskopenfile(char *file) 84 { 85 int fd; 86 DiskFile *d; 87 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; 100 }