112 lines · 1.6 KB · C
RawDownload
#include <u.h>#include <libc.h>#include <diskfs.h> int nfilereads;void _nfilereads_darwin_sucks(void) { } typedef struct DiskFile DiskFile;struct DiskFile{	Disk disk;	int fd;}; static longpreadn(int fd, void *vdata, u32int ulen, u64int offset){	long n;	uchar *data;	long len; 	nfilereads++;	len = ulen;	data = vdata;/*	fprint(2, "readn 0x%llux 0x%ux\n", offset, ulen); */	while(len > 0){		n = pread(fd, data, len, offset);		if(n <= 0)			break;		data += n;		offset += n;		len -= n;	}	return data-(uchar*)vdata;} static voiddiskfileblockput(Block *b){	free(b);} uvlong nreadx;static Block*diskfileread(Disk *dd, u32int len, u64int offset){	int n;	Block *b;	DiskFile *d = (DiskFile*)dd; 	b = mallocz(sizeof(Block)+len, 1);	if(b == nil)		return nil;	b->data = (uchar*)&b[1];nreadx += len;	n = preadn(d->fd, b->data, len, offset);	if(n <= 0){		free(b);		return nil;	}	b->_close = diskfileblockput;	b->len = n;	return b;} static intdiskfilesync(Disk *dd){	USED(dd);	return 0;} static voiddiskfileclose(Disk *dd){	DiskFile *d = (DiskFile*)dd; 	close(d->fd);	free(d);} static u64intdiskfilesize(Disk *dd){	DiskFile *d =  (DiskFile*)dd;	struct stat s; 	fstat(d->fd, &s); 	return s.st_size;} Disk*diskopenfile(char *file){	int fd;	DiskFile *d; 	if((fd = open(file, OREAD)) < 0)		return nil;	d = mallocz(sizeof(DiskFile), 1);	if(d == nil){		close(fd);		return nil;	}	d->disk._read = diskfileread;	d->disk._sync = diskfilesync;	d->disk._close = diskfileclose;	d->disk._size = diskfilesize;	d->fd = fd;	return &d->disk;}