mirror of
https://github.com/aaru-dps/libaaruformat.git
synced 2025-12-16 19:24:40 +00:00
Split geometry block processing from open to a separate file.
This commit is contained in:
@@ -27,6 +27,7 @@ UT_array *process_index_v2(aaruformatContext *ctx);
|
|||||||
int32_t verify_index_v2(aaruformatContext *ctx);
|
int32_t verify_index_v2(aaruformatContext *ctx);
|
||||||
int32_t process_data_block(aaruformatContext *ctx, IndexEntry *entry);
|
int32_t process_data_block(aaruformatContext *ctx, IndexEntry *entry);
|
||||||
int32_t process_ddt_v1(aaruformatContext *ctx, IndexEntry *entry, bool *foundUserDataDdt);
|
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
|
#endif // LIBAARUFORMAT_INTERNAL_H
|
||||||
|
|||||||
@@ -239,4 +239,50 @@ void process_metadata_block(aaruformatContext *ctx, const IndexEntry *entry)
|
|||||||
ctx->metadataBlockHeader.driveFirmwareRevisionLength);
|
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;
|
||||||
}
|
}
|
||||||
23
src/open.c
23
src/open.c
@@ -222,28 +222,9 @@ void *aaruf_open(const char *filepath)
|
|||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
break; // Logical geometry block. It doesn't have a CRC coz, well, it's not so important
|
break;
|
||||||
case GeometryBlock:
|
case GeometryBlock:
|
||||||
readBytes = fread(&ctx->geometryBlock, 1, sizeof(GeometryBlockHeader), ctx->imageStream);
|
process_geometry_block(ctx, entry);
|
||||||
|
|
||||||
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));
|
|
||||||
|
|
||||||
break;
|
break;
|
||||||
// Metadata block
|
// Metadata block
|
||||||
|
|||||||
Reference in New Issue
Block a user