mirror of
https://github.com/aaru-dps/libaaruformat.git
synced 2025-12-16 19:24:40 +00:00
Initialize primary DDT and calculate data block start position
This commit is contained in:
39
src/create.c
39
src/create.c
@@ -165,6 +165,45 @@ void *aaruf_create(const char *filepath, uint32_t mediaType, uint32_t sectorSize
|
|||||||
|
|
||||||
if(ctx->userDataDdtHeader.blocks % (1 << ctx->userDataDdtHeader.tableShift) != 0) ctx->userDataDdtHeader.entries++;
|
if(ctx->userDataDdtHeader.blocks % (1 << ctx->userDataDdtHeader.tableShift) != 0) ctx->userDataDdtHeader.entries++;
|
||||||
|
|
||||||
|
TRACE("Initializing primary/single DDT");
|
||||||
|
if(ctx->userDataDdtHeader.sizeType == SmallDdtSizeType)
|
||||||
|
ctx->userDataDdtMini =
|
||||||
|
(uint16_t *)calloc(ctx->userDataDdtHeader.entries, sizeof(uint16_t)); // All entries to zero
|
||||||
|
else if(ctx->userDataDdtHeader.sizeType == BigDdtSizeType)
|
||||||
|
ctx->userDataDdtBig =
|
||||||
|
(uint32_t *)calloc(ctx->userDataDdtHeader.entries, sizeof(uint32_t)); // All entries to zero
|
||||||
|
|
||||||
|
// Set the primary DDT offset (just after the header, block aligned)
|
||||||
|
ctx->primaryDdtOffset = sizeof(AaruHeaderV2); // Start just after the header
|
||||||
|
uint64_t alignmentMask = (1ULL << ctx->userDataDdtHeader.blockAlignmentShift) - 1;
|
||||||
|
ctx->primaryDdtOffset = (ctx->primaryDdtOffset + alignmentMask) & ~alignmentMask;
|
||||||
|
|
||||||
|
TRACE("Primary DDT will be placed at offset %" PRIu64, ctx->primaryDdtOffset);
|
||||||
|
|
||||||
|
// Calculate size of primary DDT table
|
||||||
|
uint64_t primaryTableSize = ctx->userDataDdtHeader.sizeType == SmallDdtSizeType
|
||||||
|
? ctx->userDataDdtHeader.entries * sizeof(uint16_t)
|
||||||
|
: ctx->userDataDdtHeader.entries * sizeof(uint32_t);
|
||||||
|
|
||||||
|
// Calculate where data blocks can start (after primary DDT + header)
|
||||||
|
uint64_t dataStartPosition = ctx->primaryDdtOffset + sizeof(DdtHeader2) + primaryTableSize;
|
||||||
|
ctx->nextBlockPosition = (dataStartPosition + alignmentMask) & ~alignmentMask;
|
||||||
|
|
||||||
|
TRACE("Data blocks will start at position %" PRIu64, ctx->nextBlockPosition);
|
||||||
|
|
||||||
|
// Position file pointer at the data start position
|
||||||
|
if(fseek(ctx->imageStream, (long)ctx->nextBlockPosition, SEEK_SET) != 0)
|
||||||
|
{
|
||||||
|
FATAL("Could not seek to data start position");
|
||||||
|
free(ctx->readableSectorTags);
|
||||||
|
if(ctx->userDataDdtMini) free(ctx->userDataDdtMini);
|
||||||
|
if(ctx->userDataDdtBig) free(ctx->userDataDdtBig);
|
||||||
|
utarray_free(ctx->indexEntries);
|
||||||
|
free(ctx);
|
||||||
|
errno = AARUF_ERROR_CANNOT_CREATE_FILE;
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
// Initialize index entries array
|
// Initialize index entries array
|
||||||
TRACE("Initializing index entries array");
|
TRACE("Initializing index entries array");
|
||||||
UT_icd index_entry_icd = {sizeof(IndexEntry), NULL, NULL, NULL};
|
UT_icd index_entry_icd = {sizeof(IndexEntry), NULL, NULL, NULL};
|
||||||
|
|||||||
Reference in New Issue
Block a user