int removeExtents()

in hfs/rawfile.c [292:351]


int removeExtents(RawFile* rawFile) {
	uint32_t blocksLeft;
	HFSPlusForkData* forkData;
	uint32_t currentBlock;

	uint32_t startBlock;
	uint32_t blockCount;

	HFSPlusExtentDescriptor* descriptor;
	int currentExtent;
	HFSPlusExtentKey extentKey;
	int exact;

	extentKey.keyLength = sizeof(HFSPlusExtentKey) - sizeof(extentKey.keyLength);
	extentKey.forkType = 0;
	extentKey.fileID = rawFile->id;

	forkData = rawFile->forkData;
	blocksLeft = forkData->totalBlocks;
	currentExtent = 0;
	currentBlock = 0;
	descriptor = (HFSPlusExtentDescriptor*) forkData->extents;

	while(blocksLeft > 0) {       
		if(currentExtent == 8) {
			if(rawFile->volume->extentsTree == NULL) {
				hfs_panic("no extents overflow file loaded yet!");
				return FALSE;
			}

			if(descriptor != ((HFSPlusExtentDescriptor*) forkData->extents)) {
				free(descriptor);
			}

			extentKey.startBlock = currentBlock;
			descriptor = (HFSPlusExtentDescriptor*) search(rawFile->volume->extentsTree, (BTKey*)(&extentKey), &exact, NULL, NULL);
			if(descriptor == NULL || exact == FALSE) {
				hfs_panic("inconsistent extents information!");
				return FALSE;
			} else {
				removeFromBTree(rawFile->volume->extentsTree, (BTKey*)(&extentKey));
				currentExtent = 0;
				continue;
			}
		}

		startBlock = descriptor[currentExtent].startBlock;
		blockCount = descriptor[currentExtent].blockCount;

		currentBlock += blockCount;
		blocksLeft -= blockCount;
		currentExtent++;
	}

	if(descriptor != ((HFSPlusExtentDescriptor*) forkData->extents)) {
		free(descriptor);
	}

	return TRUE;
}