Blob
1 #include <u.h>2 #include <libc.h>3 #include <diskfs.h>5 int nfilereads;7 typedef struct DiskFile DiskFile;8 struct DiskFile9 {10 Disk disk;11 int fd;12 };14 static long15 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 void37 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 int66 diskfilesync(Disk *dd)67 {68 USED(dd);69 return 0;70 }72 static void73 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 }