commit 51d1a81c38d5ac3f89d2f22e11545b786040f198 from: rsc date: Mon May 28 17:34:27 2007 UTC add disk partitions (David Swasey) commit - 27c1d3a4367ddc499d79183b33bacdd0542ed30f commit + 51d1a81c38d5ac3f89d2f22e11545b786040f198 blob - df28e606f7b417cc132f8e8a323b94e2be60a203 blob + 50366ef2b0dc67f1ea69929fb202cfb9d50065d8 --- include/diskfs.h +++ include/diskfs.h @@ -68,6 +68,7 @@ void blockput(Block *b); Disk* diskcache(Disk*, uint, uint); Disk* diskopenventi(struct VtCache*, uchar*); Disk* diskopenfile(char *file); +Disk* diskpart(Disk*, u64int offset, u64int count); Disk* diskopen(char *file); void diskclose(Disk *disk); blob - /dev/null blob + d156457d5fcbad85f29a430a012bc39e6a1384c7 (mode 644) --- /dev/null +++ src/libdiskfs/part.c @@ -0,0 +1,60 @@ +#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 region %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; + + return disksync(d->subdisk); +} + +static void +diskpartclose(Disk *dd) +{ + DiskPart *d = (DiskPart*)dd; + + diskclose(d->subdisk); + free(d); +} + +Disk* +diskpart(Disk *subdisk, u64int size, u64int offset) +{ + 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; +}