#include #include #include 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 int diskpartsync(Disk *dd) { DiskPart *d = (DiskPart*)dd; if(d->subdisk) return disksync(d->subdisk); return 0; } static void diskpartclose(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; } void diskpartabandon(Disk *d) { if(d->_read != diskpartread) abort(); ((DiskPart*)d)->subdisk = nil; }