mirror of
https://github.com/aaru-dps/libaaruformat.git
synced 2025-12-16 19:24:40 +00:00
Split metadata block processing from open to a separate file.
This commit is contained in:
@@ -111,7 +111,8 @@ add_library(aaruformat SHARED include/aaruformat/consts.h include/aaruformat/enu
|
|||||||
include/internal.h
|
include/internal.h
|
||||||
src/index/index_v2.c
|
src/index/index_v2.c
|
||||||
src/blocks/data.c
|
src/blocks/data.c
|
||||||
src/ddt/ddt_v1.c)
|
src/ddt/ddt_v1.c
|
||||||
|
src/blocks/metadata.c)
|
||||||
|
|
||||||
include_directories(include include/aaruformat)
|
include_directories(include include/aaruformat)
|
||||||
|
|
||||||
|
|||||||
@@ -27,5 +27,6 @@ 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);
|
||||||
|
|
||||||
#endif // LIBAARUFORMAT_INTERNAL_H
|
#endif // LIBAARUFORMAT_INTERNAL_H
|
||||||
|
|||||||
242
src/blocks/metadata.c
Normal file
242
src/blocks/metadata.c
Normal file
@@ -0,0 +1,242 @@
|
|||||||
|
/*
|
||||||
|
* This file is part of the Aaru Data Preservation Suite.
|
||||||
|
* Copyright (c) 2019-2025 Natalia Portillo.
|
||||||
|
*
|
||||||
|
* This library is free software; you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU Lesser General Public License as
|
||||||
|
* published by the Free Software Foundation; either version 2.1 of the
|
||||||
|
* License, or (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This library is distributed in the hope that it will be useful, but
|
||||||
|
* WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
|
* Lesser General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU Lesser General Public
|
||||||
|
* License along with this library; if not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <inttypes.h>
|
||||||
|
#include <stdint.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
|
||||||
|
#include "aaruformat.h"
|
||||||
|
|
||||||
|
// Process the metadata block found while opening an AaruFormat file
|
||||||
|
void process_metadata_block(aaruformatContext *ctx, const IndexEntry *entry)
|
||||||
|
{
|
||||||
|
int pos = 0;
|
||||||
|
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
|
||||||
|
pos = fseek(ctx->imageStream, entry->offset, SEEK_SET);
|
||||||
|
if(pos < 0 || ftell(ctx->imageStream) != entry->offset)
|
||||||
|
{
|
||||||
|
fprintf(stderr, "libaaruformat: Could not seek to %" PRIu64 " as indicated by index entry...\n", entry->offset);
|
||||||
|
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Even if those two checks shall have been done before
|
||||||
|
|
||||||
|
readBytes = fread(&ctx->metadataBlockHeader, 1, sizeof(MetadataBlockHeader), ctx->imageStream);
|
||||||
|
|
||||||
|
if(readBytes != sizeof(MetadataBlockHeader))
|
||||||
|
{
|
||||||
|
memset(&ctx->metadataBlockHeader, 0, sizeof(MetadataBlockHeader));
|
||||||
|
fprintf(stderr, "libaaruformat: Could not read metadata block header, continuing...\n");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(ctx->metadataBlockHeader.identifier != entry->blockType)
|
||||||
|
{
|
||||||
|
memset(&ctx->metadataBlockHeader, 0, sizeof(MetadataBlockHeader));
|
||||||
|
fprintf(stderr, "libaaruformat: Incorrect identifier for data block at position %" PRIu64 "\n", entry->offset);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
ctx->imageInfo.ImageSize += ctx->metadataBlockHeader.blockSize;
|
||||||
|
|
||||||
|
ctx->metadataBlock = (uint8_t *)malloc(ctx->metadataBlockHeader.blockSize);
|
||||||
|
|
||||||
|
if(ctx->metadataBlock == NULL)
|
||||||
|
{
|
||||||
|
memset(&ctx->metadataBlockHeader, 0, sizeof(MetadataBlockHeader));
|
||||||
|
fprintf(stderr, "libaaruformat: Could not allocate memory for metadata block, continuing...\n");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
readBytes = fread(ctx->metadataBlock, 1, ctx->metadataBlockHeader.blockSize, ctx->imageStream);
|
||||||
|
|
||||||
|
if(readBytes != ctx->metadataBlockHeader.blockSize)
|
||||||
|
{
|
||||||
|
memset(&ctx->metadataBlockHeader, 0, sizeof(MetadataBlockHeader));
|
||||||
|
free(ctx->metadataBlock);
|
||||||
|
fprintf(stderr, "libaaruformat: Could not read metadata block, continuing...\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
if(ctx->metadataBlockHeader.mediaSequence > 0 && ctx->metadataBlockHeader.lastMediaSequence > 0)
|
||||||
|
{
|
||||||
|
ctx->imageInfo.MediaSequence = ctx->metadataBlockHeader.mediaSequence;
|
||||||
|
ctx->imageInfo.LastMediaSequence = ctx->metadataBlockHeader.lastMediaSequence;
|
||||||
|
fprintf(stderr, "libaaruformat: Setting media sequence as %d of %d\n", ctx->imageInfo.MediaSequence,
|
||||||
|
ctx->imageInfo.LastMediaSequence);
|
||||||
|
}
|
||||||
|
|
||||||
|
if(ctx->metadataBlockHeader.creatorLength > 0 &&
|
||||||
|
ctx->metadataBlockHeader.creatorOffset + ctx->metadataBlockHeader.creatorLength <=
|
||||||
|
ctx->metadataBlockHeader.blockSize)
|
||||||
|
{
|
||||||
|
ctx->imageInfo.Creator = (uint8_t *)malloc(ctx->metadataBlockHeader.creatorLength);
|
||||||
|
if(ctx->imageInfo.Creator != NULL)
|
||||||
|
{
|
||||||
|
memcpy(ctx->imageInfo.Creator, ctx->metadataBlock + ctx->metadataBlockHeader.creatorOffset,
|
||||||
|
ctx->metadataBlockHeader.creatorLength);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if(ctx->metadataBlockHeader.commentsLength > 0 &&
|
||||||
|
ctx->metadataBlockHeader.commentsOffset + ctx->metadataBlockHeader.commentsLength <=
|
||||||
|
ctx->metadataBlockHeader.blockSize)
|
||||||
|
{
|
||||||
|
ctx->imageInfo.Comments = (uint8_t *)malloc(ctx->metadataBlockHeader.commentsLength);
|
||||||
|
if(ctx->imageInfo.Comments != NULL)
|
||||||
|
{
|
||||||
|
memcpy(ctx->imageInfo.Comments, ctx->metadataBlock + ctx->metadataBlockHeader.commentsOffset,
|
||||||
|
ctx->metadataBlockHeader.commentsLength);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if(ctx->metadataBlockHeader.mediaTitleLength > 0 &&
|
||||||
|
ctx->metadataBlockHeader.mediaTitleOffset + ctx->metadataBlockHeader.mediaTitleLength <=
|
||||||
|
ctx->metadataBlockHeader.blockSize)
|
||||||
|
{
|
||||||
|
ctx->imageInfo.MediaTitle = (uint8_t *)malloc(ctx->metadataBlockHeader.mediaTitleLength);
|
||||||
|
if(ctx->imageInfo.MediaTitle != NULL)
|
||||||
|
{
|
||||||
|
memcpy(ctx->imageInfo.MediaTitle, ctx->metadataBlock + ctx->metadataBlockHeader.mediaTitleOffset,
|
||||||
|
ctx->metadataBlockHeader.mediaTitleLength);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if(ctx->metadataBlockHeader.mediaManufacturerLength > 0 &&
|
||||||
|
ctx->metadataBlockHeader.mediaManufacturerOffset + ctx->metadataBlockHeader.mediaManufacturerLength <=
|
||||||
|
ctx->metadataBlockHeader.blockSize)
|
||||||
|
{
|
||||||
|
ctx->imageInfo.MediaManufacturer = (uint8_t *)malloc(ctx->metadataBlockHeader.mediaManufacturerLength);
|
||||||
|
if(ctx->imageInfo.MediaManufacturer != NULL)
|
||||||
|
{
|
||||||
|
memcpy(ctx->imageInfo.MediaManufacturer,
|
||||||
|
ctx->metadataBlock + ctx->metadataBlockHeader.mediaManufacturerOffset,
|
||||||
|
ctx->metadataBlockHeader.mediaManufacturerLength);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if(ctx->metadataBlockHeader.mediaModelLength > 0 &&
|
||||||
|
ctx->metadataBlockHeader.mediaModelOffset + ctx->metadataBlockHeader.mediaModelLength <=
|
||||||
|
ctx->metadataBlockHeader.blockSize)
|
||||||
|
{
|
||||||
|
ctx->imageInfo.MediaModel = (uint8_t *)malloc(ctx->metadataBlockHeader.mediaModelOffset);
|
||||||
|
if(ctx->imageInfo.MediaModel != NULL)
|
||||||
|
{
|
||||||
|
memcpy(ctx->imageInfo.MediaModel, ctx->metadataBlock + ctx->metadataBlockHeader.mediaModelOffset,
|
||||||
|
ctx->metadataBlockHeader.mediaModelLength);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if(ctx->metadataBlockHeader.mediaSerialNumberLength > 0 &&
|
||||||
|
ctx->metadataBlockHeader.mediaSerialNumberOffset + ctx->metadataBlockHeader.mediaSerialNumberLength <=
|
||||||
|
ctx->metadataBlockHeader.blockSize)
|
||||||
|
{
|
||||||
|
ctx->imageInfo.MediaSerialNumber = (uint8_t *)malloc(ctx->metadataBlockHeader.mediaSerialNumberLength);
|
||||||
|
if(ctx->imageInfo.MediaSerialNumber != NULL)
|
||||||
|
{
|
||||||
|
memcpy(ctx->imageInfo.MediaSerialNumber,
|
||||||
|
ctx->metadataBlock + ctx->metadataBlockHeader.mediaSerialNumberOffset,
|
||||||
|
ctx->metadataBlockHeader.mediaManufacturerLength);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if(ctx->metadataBlockHeader.mediaBarcodeLength > 0 &&
|
||||||
|
ctx->metadataBlockHeader.mediaBarcodeOffset + ctx->metadataBlockHeader.mediaBarcodeLength <=
|
||||||
|
ctx->metadataBlockHeader.blockSize)
|
||||||
|
{
|
||||||
|
ctx->imageInfo.MediaBarcode = (uint8_t *)malloc(ctx->metadataBlockHeader.mediaBarcodeLength);
|
||||||
|
if(ctx->imageInfo.MediaBarcode != NULL)
|
||||||
|
{
|
||||||
|
memcpy(ctx->imageInfo.MediaBarcode, ctx->metadataBlock + ctx->metadataBlockHeader.mediaBarcodeOffset,
|
||||||
|
ctx->metadataBlockHeader.mediaBarcodeLength);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if(ctx->metadataBlockHeader.mediaPartNumberLength > 0 &&
|
||||||
|
ctx->metadataBlockHeader.mediaPartNumberOffset + ctx->metadataBlockHeader.mediaPartNumberLength <=
|
||||||
|
ctx->metadataBlockHeader.blockSize)
|
||||||
|
{
|
||||||
|
ctx->imageInfo.MediaPartNumber = (uint8_t *)malloc(ctx->metadataBlockHeader.mediaPartNumberLength);
|
||||||
|
if(ctx->imageInfo.MediaPartNumber != NULL)
|
||||||
|
{
|
||||||
|
memcpy(ctx->imageInfo.MediaPartNumber, ctx->metadataBlock + ctx->metadataBlockHeader.mediaPartNumberOffset,
|
||||||
|
ctx->metadataBlockHeader.mediaPartNumberLength);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if(ctx->metadataBlockHeader.driveManufacturerLength > 0 &&
|
||||||
|
ctx->metadataBlockHeader.driveManufacturerOffset + ctx->metadataBlockHeader.driveManufacturerLength <=
|
||||||
|
ctx->metadataBlockHeader.blockSize)
|
||||||
|
{
|
||||||
|
ctx->imageInfo.DriveManufacturer = (uint8_t *)malloc(ctx->metadataBlockHeader.driveManufacturerLength);
|
||||||
|
if(ctx->imageInfo.DriveManufacturer != NULL)
|
||||||
|
{
|
||||||
|
memcpy(ctx->imageInfo.DriveManufacturer,
|
||||||
|
ctx->metadataBlock + ctx->metadataBlockHeader.driveManufacturerOffset,
|
||||||
|
ctx->metadataBlockHeader.driveManufacturerLength);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if(ctx->metadataBlockHeader.driveModelLength > 0 &&
|
||||||
|
ctx->metadataBlockHeader.driveModelOffset + ctx->metadataBlockHeader.driveModelLength <=
|
||||||
|
ctx->metadataBlockHeader.blockSize)
|
||||||
|
{
|
||||||
|
ctx->imageInfo.DriveModel = (uint8_t *)malloc(ctx->metadataBlockHeader.driveModelLength);
|
||||||
|
if(ctx->imageInfo.DriveModel != NULL)
|
||||||
|
{
|
||||||
|
memcpy(ctx->imageInfo.DriveModel, ctx->metadataBlock + ctx->metadataBlockHeader.driveModelOffset,
|
||||||
|
ctx->metadataBlockHeader.driveModelLength);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if(ctx->metadataBlockHeader.driveSerialNumberLength > 0 &&
|
||||||
|
ctx->metadataBlockHeader.driveSerialNumberOffset + ctx->metadataBlockHeader.driveSerialNumberLength <=
|
||||||
|
ctx->metadataBlockHeader.blockSize)
|
||||||
|
{
|
||||||
|
ctx->imageInfo.DriveSerialNumber = (uint8_t *)malloc(ctx->metadataBlockHeader.driveSerialNumberLength);
|
||||||
|
if(ctx->imageInfo.DriveSerialNumber != NULL)
|
||||||
|
{
|
||||||
|
memcpy(ctx->imageInfo.DriveSerialNumber,
|
||||||
|
ctx->metadataBlock + ctx->metadataBlockHeader.driveSerialNumberOffset,
|
||||||
|
ctx->metadataBlockHeader.driveSerialNumberLength);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if(ctx->metadataBlockHeader.driveManufacturerLength > 0 &&
|
||||||
|
ctx->metadataBlockHeader.driveFirmwareRevisionOffset + ctx->metadataBlockHeader.driveManufacturerLength <=
|
||||||
|
ctx->metadataBlockHeader.blockSize)
|
||||||
|
{
|
||||||
|
ctx->imageInfo.DriveFirmwareRevision = (uint8_t *)malloc(ctx->metadataBlockHeader.driveFirmwareRevisionLength);
|
||||||
|
if(ctx->imageInfo.DriveFirmwareRevision != NULL)
|
||||||
|
{
|
||||||
|
memcpy(ctx->imageInfo.DriveFirmwareRevision,
|
||||||
|
ctx->metadataBlock + ctx->metadataBlockHeader.driveFirmwareRevisionLength,
|
||||||
|
ctx->metadataBlockHeader.driveFirmwareRevisionLength);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
209
src/open.c
209
src/open.c
@@ -248,214 +248,7 @@ void *aaruf_open(const char *filepath)
|
|||||||
break;
|
break;
|
||||||
// Metadata block
|
// Metadata block
|
||||||
case MetadataBlock:
|
case MetadataBlock:
|
||||||
readBytes = fread(&ctx->metadataBlockHeader, 1, sizeof(MetadataBlockHeader), ctx->imageStream);
|
process_metadata_block(ctx, entry);
|
||||||
|
|
||||||
if(readBytes != sizeof(MetadataBlockHeader))
|
|
||||||
{
|
|
||||||
memset(&ctx->metadataBlockHeader, 0, sizeof(MetadataBlockHeader));
|
|
||||||
fprintf(stderr, "libaaruformat: Could not read metadata block header, continuing...\n");
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
if(ctx->metadataBlockHeader.identifier != entry->blockType)
|
|
||||||
{
|
|
||||||
memset(&ctx->metadataBlockHeader, 0, sizeof(MetadataBlockHeader));
|
|
||||||
fprintf(stderr, "libaaruformat: Incorrect identifier for data block at position %" PRIu64 "\n",
|
|
||||||
entry->offset);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
ctx->imageInfo.ImageSize += ctx->metadataBlockHeader.blockSize;
|
|
||||||
|
|
||||||
ctx->metadataBlock = (uint8_t *)malloc(ctx->metadataBlockHeader.blockSize);
|
|
||||||
|
|
||||||
if(ctx->metadataBlock == NULL)
|
|
||||||
{
|
|
||||||
memset(&ctx->metadataBlockHeader, 0, sizeof(MetadataBlockHeader));
|
|
||||||
fprintf(stderr, "libaaruformat: Could not allocate memory for metadata block, continuing...\n");
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
readBytes = fread(ctx->metadataBlock, 1, ctx->metadataBlockHeader.blockSize, ctx->imageStream);
|
|
||||||
|
|
||||||
if(readBytes != ctx->metadataBlockHeader.blockSize)
|
|
||||||
{
|
|
||||||
memset(&ctx->metadataBlockHeader, 0, sizeof(MetadataBlockHeader));
|
|
||||||
free(ctx->metadataBlock);
|
|
||||||
fprintf(stderr, "libaaruformat: Could not read metadata block, continuing...\n");
|
|
||||||
}
|
|
||||||
|
|
||||||
if(ctx->metadataBlockHeader.mediaSequence > 0 && ctx->metadataBlockHeader.lastMediaSequence > 0)
|
|
||||||
{
|
|
||||||
ctx->imageInfo.MediaSequence = ctx->metadataBlockHeader.mediaSequence;
|
|
||||||
ctx->imageInfo.LastMediaSequence = ctx->metadataBlockHeader.lastMediaSequence;
|
|
||||||
fprintf(stderr, "libaaruformat: Setting media sequence as %d of %d\n", ctx->imageInfo.MediaSequence,
|
|
||||||
ctx->imageInfo.LastMediaSequence);
|
|
||||||
}
|
|
||||||
|
|
||||||
if(ctx->metadataBlockHeader.creatorLength > 0 &&
|
|
||||||
ctx->metadataBlockHeader.creatorOffset + ctx->metadataBlockHeader.creatorLength <=
|
|
||||||
ctx->metadataBlockHeader.blockSize)
|
|
||||||
{
|
|
||||||
ctx->imageInfo.Creator = (uint8_t *)malloc(ctx->metadataBlockHeader.creatorLength);
|
|
||||||
if(ctx->imageInfo.Creator != NULL)
|
|
||||||
{
|
|
||||||
memcpy(ctx->imageInfo.Creator, ctx->metadataBlock + ctx->metadataBlockHeader.creatorOffset,
|
|
||||||
ctx->metadataBlockHeader.creatorLength);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if(ctx->metadataBlockHeader.commentsLength > 0 &&
|
|
||||||
ctx->metadataBlockHeader.commentsOffset + ctx->metadataBlockHeader.commentsLength <=
|
|
||||||
ctx->metadataBlockHeader.blockSize)
|
|
||||||
{
|
|
||||||
ctx->imageInfo.Comments = (uint8_t *)malloc(ctx->metadataBlockHeader.commentsLength);
|
|
||||||
if(ctx->imageInfo.Comments != NULL)
|
|
||||||
{
|
|
||||||
memcpy(ctx->imageInfo.Comments, ctx->metadataBlock + ctx->metadataBlockHeader.commentsOffset,
|
|
||||||
ctx->metadataBlockHeader.commentsLength);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if(ctx->metadataBlockHeader.mediaTitleLength > 0 &&
|
|
||||||
ctx->metadataBlockHeader.mediaTitleOffset + ctx->metadataBlockHeader.mediaTitleLength <=
|
|
||||||
ctx->metadataBlockHeader.blockSize)
|
|
||||||
{
|
|
||||||
ctx->imageInfo.MediaTitle = (uint8_t *)malloc(ctx->metadataBlockHeader.mediaTitleLength);
|
|
||||||
if(ctx->imageInfo.MediaTitle != NULL)
|
|
||||||
{
|
|
||||||
memcpy(ctx->imageInfo.MediaTitle,
|
|
||||||
ctx->metadataBlock + ctx->metadataBlockHeader.mediaTitleOffset,
|
|
||||||
ctx->metadataBlockHeader.mediaTitleLength);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if(ctx->metadataBlockHeader.mediaManufacturerLength > 0 &&
|
|
||||||
ctx->metadataBlockHeader.mediaManufacturerOffset +
|
|
||||||
ctx->metadataBlockHeader.mediaManufacturerLength <=
|
|
||||||
ctx->metadataBlockHeader.blockSize)
|
|
||||||
{
|
|
||||||
ctx->imageInfo.MediaManufacturer =
|
|
||||||
(uint8_t *)malloc(ctx->metadataBlockHeader.mediaManufacturerLength);
|
|
||||||
if(ctx->imageInfo.MediaManufacturer != NULL)
|
|
||||||
{
|
|
||||||
memcpy(ctx->imageInfo.MediaManufacturer,
|
|
||||||
ctx->metadataBlock + ctx->metadataBlockHeader.mediaManufacturerOffset,
|
|
||||||
ctx->metadataBlockHeader.mediaManufacturerLength);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if(ctx->metadataBlockHeader.mediaModelLength > 0 &&
|
|
||||||
ctx->metadataBlockHeader.mediaModelOffset + ctx->metadataBlockHeader.mediaModelLength <=
|
|
||||||
ctx->metadataBlockHeader.blockSize)
|
|
||||||
{
|
|
||||||
ctx->imageInfo.MediaModel = (uint8_t *)malloc(ctx->metadataBlockHeader.mediaModelOffset);
|
|
||||||
if(ctx->imageInfo.MediaModel != NULL)
|
|
||||||
{
|
|
||||||
memcpy(ctx->imageInfo.MediaModel,
|
|
||||||
ctx->metadataBlock + ctx->metadataBlockHeader.mediaModelOffset,
|
|
||||||
ctx->metadataBlockHeader.mediaModelLength);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if(ctx->metadataBlockHeader.mediaSerialNumberLength > 0 &&
|
|
||||||
ctx->metadataBlockHeader.mediaSerialNumberOffset +
|
|
||||||
ctx->metadataBlockHeader.mediaSerialNumberLength <=
|
|
||||||
ctx->metadataBlockHeader.blockSize)
|
|
||||||
{
|
|
||||||
ctx->imageInfo.MediaSerialNumber =
|
|
||||||
(uint8_t *)malloc(ctx->metadataBlockHeader.mediaSerialNumberLength);
|
|
||||||
if(ctx->imageInfo.MediaSerialNumber != NULL)
|
|
||||||
{
|
|
||||||
memcpy(ctx->imageInfo.MediaSerialNumber,
|
|
||||||
ctx->metadataBlock + ctx->metadataBlockHeader.mediaSerialNumberOffset,
|
|
||||||
ctx->metadataBlockHeader.mediaManufacturerLength);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if(ctx->metadataBlockHeader.mediaBarcodeLength > 0 &&
|
|
||||||
ctx->metadataBlockHeader.mediaBarcodeOffset + ctx->metadataBlockHeader.mediaBarcodeLength <=
|
|
||||||
ctx->metadataBlockHeader.blockSize)
|
|
||||||
{
|
|
||||||
ctx->imageInfo.MediaBarcode = (uint8_t *)malloc(ctx->metadataBlockHeader.mediaBarcodeLength);
|
|
||||||
if(ctx->imageInfo.MediaBarcode != NULL)
|
|
||||||
{
|
|
||||||
memcpy(ctx->imageInfo.MediaBarcode,
|
|
||||||
ctx->metadataBlock + ctx->metadataBlockHeader.mediaBarcodeOffset,
|
|
||||||
ctx->metadataBlockHeader.mediaBarcodeLength);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if(ctx->metadataBlockHeader.mediaPartNumberLength > 0 &&
|
|
||||||
ctx->metadataBlockHeader.mediaPartNumberOffset + ctx->metadataBlockHeader.mediaPartNumberLength <=
|
|
||||||
ctx->metadataBlockHeader.blockSize)
|
|
||||||
{
|
|
||||||
ctx->imageInfo.MediaPartNumber = (uint8_t *)malloc(ctx->metadataBlockHeader.mediaPartNumberLength);
|
|
||||||
if(ctx->imageInfo.MediaPartNumber != NULL)
|
|
||||||
{
|
|
||||||
memcpy(ctx->imageInfo.MediaPartNumber,
|
|
||||||
ctx->metadataBlock + ctx->metadataBlockHeader.mediaPartNumberOffset,
|
|
||||||
ctx->metadataBlockHeader.mediaPartNumberLength);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if(ctx->metadataBlockHeader.driveManufacturerLength > 0 &&
|
|
||||||
ctx->metadataBlockHeader.driveManufacturerOffset +
|
|
||||||
ctx->metadataBlockHeader.driveManufacturerLength <=
|
|
||||||
ctx->metadataBlockHeader.blockSize)
|
|
||||||
{
|
|
||||||
ctx->imageInfo.DriveManufacturer =
|
|
||||||
(uint8_t *)malloc(ctx->metadataBlockHeader.driveManufacturerLength);
|
|
||||||
if(ctx->imageInfo.DriveManufacturer != NULL)
|
|
||||||
{
|
|
||||||
memcpy(ctx->imageInfo.DriveManufacturer,
|
|
||||||
ctx->metadataBlock + ctx->metadataBlockHeader.driveManufacturerOffset,
|
|
||||||
ctx->metadataBlockHeader.driveManufacturerLength);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if(ctx->metadataBlockHeader.driveModelLength > 0 &&
|
|
||||||
ctx->metadataBlockHeader.driveModelOffset + ctx->metadataBlockHeader.driveModelLength <=
|
|
||||||
ctx->metadataBlockHeader.blockSize)
|
|
||||||
{
|
|
||||||
ctx->imageInfo.DriveModel = (uint8_t *)malloc(ctx->metadataBlockHeader.driveModelLength);
|
|
||||||
if(ctx->imageInfo.DriveModel != NULL)
|
|
||||||
{
|
|
||||||
memcpy(ctx->imageInfo.DriveModel,
|
|
||||||
ctx->metadataBlock + ctx->metadataBlockHeader.driveModelOffset,
|
|
||||||
ctx->metadataBlockHeader.driveModelLength);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if(ctx->metadataBlockHeader.driveSerialNumberLength > 0 &&
|
|
||||||
ctx->metadataBlockHeader.driveSerialNumberOffset +
|
|
||||||
ctx->metadataBlockHeader.driveSerialNumberLength <=
|
|
||||||
ctx->metadataBlockHeader.blockSize)
|
|
||||||
{
|
|
||||||
ctx->imageInfo.DriveSerialNumber =
|
|
||||||
(uint8_t *)malloc(ctx->metadataBlockHeader.driveSerialNumberLength);
|
|
||||||
if(ctx->imageInfo.DriveSerialNumber != NULL)
|
|
||||||
{
|
|
||||||
memcpy(ctx->imageInfo.DriveSerialNumber,
|
|
||||||
ctx->metadataBlock + ctx->metadataBlockHeader.driveSerialNumberOffset,
|
|
||||||
ctx->metadataBlockHeader.driveSerialNumberLength);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if(ctx->metadataBlockHeader.driveManufacturerLength > 0 &&
|
|
||||||
ctx->metadataBlockHeader.driveFirmwareRevisionOffset +
|
|
||||||
ctx->metadataBlockHeader.driveManufacturerLength <=
|
|
||||||
ctx->metadataBlockHeader.blockSize)
|
|
||||||
{
|
|
||||||
ctx->imageInfo.DriveFirmwareRevision =
|
|
||||||
(uint8_t *)malloc(ctx->metadataBlockHeader.driveFirmwareRevisionLength);
|
|
||||||
if(ctx->imageInfo.DriveFirmwareRevision != NULL)
|
|
||||||
{
|
|
||||||
memcpy(ctx->imageInfo.DriveFirmwareRevision,
|
|
||||||
ctx->metadataBlock + ctx->metadataBlockHeader.driveFirmwareRevisionLength,
|
|
||||||
ctx->metadataBlockHeader.driveFirmwareRevisionLength);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
break;
|
break;
|
||||||
case TracksBlock:
|
case TracksBlock:
|
||||||
|
|||||||
Reference in New Issue
Block a user