part.c (1124B)
1 #include <u.h> 2 #include <libc.h> 3 #include <diskfs.h> 4 5 typedef struct DiskPart DiskPart; 6 struct DiskPart 7 { 8 Disk disk; 9 Disk *subdisk; 10 u64int offset; 11 u64int size; 12 }; 13 14 static Block* 15 diskpartread(Disk *dd, u32int len, u64int offset) 16 { 17 DiskPart *d = (DiskPart*)dd; 18 19 if(offset+len > d->size){ 20 werrstr("read past end of partition %llud + %lud > %llud", offset, len, d->size); 21 return nil; 22 } 23 return diskread(d->subdisk, len, offset+d->offset); 24 } 25 26 static int 27 diskpartsync(Disk *dd) 28 { 29 DiskPart *d = (DiskPart*)dd; 30 31 if(d->subdisk) 32 return disksync(d->subdisk); 33 return 0; 34 } 35 36 static void 37 diskpartclose(Disk *dd) 38 { 39 DiskPart *d = (DiskPart*)dd; 40 41 if(d->subdisk) 42 diskclose(d->subdisk); 43 free(d); 44 } 45 46 Disk* 47 diskpart(Disk *subdisk, u64int offset, u64int size) 48 { 49 DiskPart *d; 50 51 d = mallocz(sizeof(DiskPart), 1); 52 if(d == nil) 53 return nil; 54 55 d->subdisk = subdisk; 56 d->offset = offset; 57 d->size = size; 58 d->disk._read = diskpartread; 59 d->disk._sync = diskpartsync; 60 d->disk._close = diskpartclose; 61 62 return &d->disk; 63 } 64 65 void 66 diskpartabandon(Disk *d) 67 { 68 if(d->_read != diskpartread) 69 abort(); 70 ((DiskPart*)d)->subdisk = nil; 71 }