plan9port

[fork] Plan 9 from user space
git clone git://src.adamsgaard.dk/plan9port # fast
git clone https://src.adamsgaard.dk/plan9port.git # slow
Log | Files | Refs | README | LICENSE Back to index

commit 51d1a81c38d5ac3f89d2f22e11545b786040f198
parent 27c1d3a4367ddc499d79183b33bacdd0542ed30f
Author: rsc <devnull@localhost>
Date:   Mon, 28 May 2007 17:34:27 +0000

add disk partitions (David Swasey)

Diffstat:
Minclude/diskfs.h | 1+
Asrc/libdiskfs/part.c | 60++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
2 files changed, 61 insertions(+), 0 deletions(-)

diff --git a/include/diskfs.h b/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); diff --git a/src/libdiskfs/part.c b/src/libdiskfs/part.c @@ -0,0 +1,60 @@ +#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 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; +}