From 7ed10022733effbf29fd534abd557b39ff49f56a Mon Sep 17 00:00:00 2001 From: Natalia Portillo Date: Sat, 2 Aug 2025 16:11:26 +0100 Subject: [PATCH] Split geometry block processing from open to a separate file. --- include/internal.h | 3 ++- src/blocks/metadata.c | 46 +++++++++++++++++++++++++++++++++++++++++++ src/open.c | 23 ++-------------------- 3 files changed, 50 insertions(+), 22 deletions(-) diff --git a/include/internal.h b/include/internal.h index 89a9e30..70e733b 100644 --- a/include/internal.h +++ b/include/internal.h @@ -27,6 +27,7 @@ UT_array *process_index_v2(aaruformatContext *ctx); int32_t verify_index_v2(aaruformatContext *ctx); int32_t process_data_block(aaruformatContext *ctx, IndexEntry *entry); int32_t process_ddt_v1(aaruformatContext *ctx, IndexEntry *entry, bool *foundUserDataDdt); -void process_metadata_block(aaruformatContext *ctx, IndexEntry *entry); +void process_metadata_block(aaruformatContext *ctx, const IndexEntry *entry); +void process_geometry_block(aaruformatContext *ctx, const IndexEntry *entry); #endif // LIBAARUFORMAT_INTERNAL_H diff --git a/src/blocks/metadata.c b/src/blocks/metadata.c index 75457f6..1598686 100644 --- a/src/blocks/metadata.c +++ b/src/blocks/metadata.c @@ -239,4 +239,50 @@ void process_metadata_block(aaruformatContext *ctx, const IndexEntry *entry) ctx->metadataBlockHeader.driveFirmwareRevisionLength); } } +} + +// Logical geometry block. It doesn't have a CRC coz, well, it's not so important +void process_geometry_block(aaruformatContext *ctx, const IndexEntry *entry) +{ + size_t readBytes = 0; + + // Check if the context and image stream are valid + if(ctx == NULL || ctx->imageStream == NULL) + { + fprintf(stderr, "Invalid context or image stream.\n"); + return; + } + + // Seek to block + if(fseek(ctx->imageStream, entry->offset, SEEK_SET) != 0) + { + fprintf(stderr, "libaaruformat: Could not seek to %" PRIu64 " as indicated by index entry...\n", entry->offset); + return; + } + + readBytes = fread(&ctx->geometryBlock, 1, sizeof(GeometryBlockHeader), ctx->imageStream); + + if(readBytes != sizeof(GeometryBlockHeader)) + { + memset(&ctx->geometryBlock, 0, sizeof(GeometryBlockHeader)); + fprintf(stderr, "libaaruformat: Could not read geometry block header, continuing...\n"); + return; + } + + if(ctx->geometryBlock.identifier != GeometryBlock) + { + memset(&ctx->geometryBlock, 0, sizeof(GeometryBlockHeader)); + fprintf(stderr, "libaaruformat: Incorrect identifier for geometry block at position %" PRIu64 "\n", + entry->offset); + return; + } + + ctx->imageInfo.ImageSize += sizeof(GeometryBlockHeader); + + fprintf(stderr, "libaaruformat: Geometry set to %d cylinders %d heads %d sectors per track\n", + ctx->geometryBlock.cylinders, ctx->geometryBlock.heads, ctx->geometryBlock.sectorsPerTrack); + + ctx->imageInfo.Cylinders = ctx->geometryBlock.cylinders; + ctx->imageInfo.Heads = ctx->geometryBlock.heads; + ctx->imageInfo.SectorsPerTrack = ctx->geometryBlock.sectorsPerTrack; } \ No newline at end of file diff --git a/src/open.c b/src/open.c index 650b8db..d34ed44 100644 --- a/src/open.c +++ b/src/open.c @@ -222,28 +222,9 @@ void *aaruf_open(const char *filepath) return NULL; } - break; // Logical geometry block. It doesn't have a CRC coz, well, it's not so important + break; case GeometryBlock: - readBytes = fread(&ctx->geometryBlock, 1, sizeof(GeometryBlockHeader), ctx->imageStream); - - if(readBytes != sizeof(GeometryBlockHeader)) - { - memset(&ctx->geometryBlock, 0, sizeof(GeometryBlockHeader)); - fprintf(stderr, "libaaruformat: Could not read geometry block, continuing...\n"); - break; - } - - if(ctx->geometryBlock.identifier == GeometryBlock) - { - fprintf(stderr, "libaaruformat: Geometry set to %d cylinders %d heads %d sectors per track\n", - ctx->geometryBlock.cylinders, ctx->geometryBlock.heads, ctx->geometryBlock.sectorsPerTrack); - - ctx->imageInfo.Cylinders = ctx->geometryBlock.cylinders; - ctx->imageInfo.Heads = ctx->geometryBlock.heads; - ctx->imageInfo.SectorsPerTrack = ctx->geometryBlock.sectorsPerTrack; - } - else - memset(&ctx->geometryBlock, 0, sizeof(GeometryBlockHeader)); + process_geometry_block(ctx, entry); break; // Metadata block