in hfs/rawfile.c [218:272]
static int rawFileWrite(io_func* io,off_t location, size_t size, void *buffer) {
RawFile* rawFile;
Volume* volume;
Extent* extent;
size_t blockSize;
off_t fileLoc;
off_t locationInBlock;
size_t possible;
rawFile = (RawFile*) io->data;
volume = rawFile->volume;
blockSize = volume->volumeHeader->blockSize;
if(rawFile->forkData->logicalSize < (location + size)) {
ASSERT(allocate(rawFile, location + size), "allocate");
}
extent = rawFile->extents;
fileLoc = 0;
locationInBlock = location;
while(TRUE) {
fileLoc += extent->blockCount * blockSize;
if(fileLoc <= location) {
locationInBlock -= extent->blockCount * blockSize;
extent = extent->next;
if(extent == NULL)
break;
} else {
break;
}
}
while(size > 0) {
if(extent == NULL)
return FALSE;
possible = extent->blockCount * blockSize - locationInBlock;
if(size > possible) {
ASSERT(WRITE(volume->image, extent->startBlock * blockSize + locationInBlock, possible, buffer), "WRITE");
size -= possible;
buffer = (void*)(((size_t)buffer) + possible);
extent = extent->next;
} else {
ASSERT(WRITE(volume->image, extent->startBlock * blockSize + locationInBlock, size, buffer), "WRITE");
break;
}
locationInBlock = 0;
}
return TRUE;
}