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 DiskFile10 {11 Disk disk;12 int fd;13 };15 static long16 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 void38 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 int67 diskfilesync(Disk *dd)68 {69 USED(dd);70 return 0;71 }73 static void74 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;100 }