rscfix commentf4ee73619 years agoHistory
71 lines · 1.1 KB · C
RawDownload
#include <u.h>#include <libc.h>#include <diskfs.h> typedef struct DiskPart DiskPart;struct DiskPart{	Disk disk;	Disk *subdisk;	u64int offset;	u64int size;}; static Block*diskpartread(Disk *dd, u32int len, u64int offset){	DiskPart *d = (DiskPart*)dd; 	if(offset+len > d->size){		werrstr("read past end of partition %llud + %lud > %llud", offset, len, d->size);		return nil;	}	return diskread(d->subdisk, len, offset+d->offset);} static intdiskpartsync(Disk *dd){	DiskPart *d = (DiskPart*)dd;		if(d->subdisk)		return disksync(d->subdisk);	return 0;} static voiddiskpartclose(Disk *dd){	DiskPart *d = (DiskPart*)dd;		if(d->subdisk)		diskclose(d->subdisk);	free(d);} Disk*diskpart(Disk *subdisk, u64int offset, u64int size){	DiskPart *d;		d = mallocz(sizeof(DiskPart), 1);	if(d == nil)		return nil;		d->subdisk = subdisk;	d->offset = offset;	d->size = size;	d->disk._read = diskpartread;	d->disk._sync = diskpartsync;	d->disk._close = diskpartclose;		return &d->disk;} voiddiskpartabandon(Disk *d){	if(d->_read != diskpartread)		abort();	((DiskPart*)d)->subdisk = nil;}