plan9port

fork of plan9port with libvec, libstr and libsdb
Log | Files | Refs | README | LICENSE

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 }