URI: 
       tadd disk partitions (David Swasey) - plan9port - [fork] Plan 9 from user space
  HTML git clone git://src.adamsgaard.dk/plan9port
   DIR Log
   DIR Files
   DIR Refs
   DIR README
   DIR LICENSE
       ---
   DIR commit 51d1a81c38d5ac3f89d2f22e11545b786040f198
   DIR parent 27c1d3a4367ddc499d79183b33bacdd0542ed30f
  HTML Author: rsc <devnull@localhost>
       Date:   Mon, 28 May 2007 17:34:27 +0000
       
       add disk partitions (David Swasey)
       
       Diffstat:
         M include/diskfs.h                    |       1 +
         A src/libdiskfs/part.c                |      60 +++++++++++++++++++++++++++++++
       
       2 files changed, 61 insertions(+), 0 deletions(-)
       ---
   DIR diff --git a/include/diskfs.h b/include/diskfs.h
       t@@ -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);
   DIR diff --git a/src/libdiskfs/part.c b/src/libdiskfs/part.c
       t@@ -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;
       +}