#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 end of partition %llud + %lud > %llud", offset, len, d->size); return nil; } return diskread(d->subdisk, len, offset+d->offset);} static intdiskpartsync(Disk *dd){ DiskPart *d = (DiskPart*)dd; if(d->subdisk) return disksync(d->subdisk); return 0;} static voiddiskpartclose(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;} voiddiskpartabandon(Disk *d){ if(d->_read != diskpartread) abort(); ((DiskPart*)d)->subdisk = nil;}
#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 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;
}