mirror of
https://github.com/aaru-dps/libaaruformat.git
synced 2025-12-16 19:24:40 +00:00
Implement tracks block writing in close.c with alignment and index management
This commit is contained in:
38
src/close.c
38
src/close.c
@@ -629,6 +629,44 @@ int aaruf_close(void *context)
|
|||||||
TRACE("Added checksum block index entry at offset %" PRIu64, checksum_position);
|
TRACE("Added checksum block index entry at offset %" PRIu64, checksum_position);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Write tracks block
|
||||||
|
if(ctx->tracksHeader.entries > 0 && ctx->trackEntries != NULL)
|
||||||
|
{
|
||||||
|
fseek(ctx->imageStream, 0, SEEK_END);
|
||||||
|
long tracks_position = ftell(ctx->imageStream);
|
||||||
|
// Align index position to block boundary if needed
|
||||||
|
alignment_mask = (1ULL << ctx->userDataDdtHeader.blockAlignmentShift) - 1;
|
||||||
|
if(tracks_position & alignment_mask)
|
||||||
|
{
|
||||||
|
aligned_position = tracks_position + alignment_mask & ~alignment_mask;
|
||||||
|
fseek(ctx->imageStream, aligned_position, SEEK_SET);
|
||||||
|
tracks_position = aligned_position;
|
||||||
|
}
|
||||||
|
|
||||||
|
TRACE("Writing tracks block at position %ld", tracks_position);
|
||||||
|
// Write header
|
||||||
|
if(fwrite(&ctx->tracksHeader, sizeof(TracksHeader), 1, ctx->imageStream) == 1)
|
||||||
|
{
|
||||||
|
// Write entries
|
||||||
|
size_t written_entries =
|
||||||
|
fwrite(ctx->trackEntries, sizeof(TrackEntry), ctx->tracksHeader.entries, ctx->imageStream);
|
||||||
|
|
||||||
|
if(written_entries == ctx->tracksHeader.entries)
|
||||||
|
{
|
||||||
|
TRACE("Successfully wrote tracks block with %u entries", ctx->tracksHeader.entries);
|
||||||
|
// Add tracks block to index
|
||||||
|
TRACE("Adding tracks block to index");
|
||||||
|
|
||||||
|
IndexEntry tracks_index_entry;
|
||||||
|
tracks_index_entry.blockType = TracksBlock;
|
||||||
|
tracks_index_entry.dataType = 0;
|
||||||
|
tracks_index_entry.offset = tracks_position;
|
||||||
|
utarray_push_back(ctx->indexEntries, &tracks_index_entry);
|
||||||
|
TRACE("Added tracks block index entry at offset %" PRIu64, tracks_position);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// Write the complete index at the end of the file
|
// Write the complete index at the end of the file
|
||||||
TRACE("Writing index at the end of the file");
|
TRACE("Writing index at the end of the file");
|
||||||
fseek(ctx->imageStream, 0, SEEK_END);
|
fseek(ctx->imageStream, 0, SEEK_END);
|
||||||
|
|||||||
Reference in New Issue
Block a user