diff --git a/include/aaru.h b/include/aaru.h index 5902db4..97252ed 100644 --- a/include/aaru.h +++ b/include/aaru.h @@ -915,7 +915,7 @@ typedef enum DvdSectorEdcAaru = 19, ///< DVD sector EDC, 4 bytes AppleProfileTagAaru = 20, ///< Apple's Profile sector tags, 20 bytes PriamDataTowerTagAaru = 21, ///< Priam DataTower sector tags, 24 bytes - MaxSectorTag = DvdSectorEdcAaru + MaxSectorTag = PriamDataTowerTagAaru } SectorTagType; /** @} */ /* end of SectorTags group */ diff --git a/include/aaruformat/decls.h b/include/aaruformat/decls.h index 0bb03d1..9a85bf3 100644 --- a/include/aaruformat/decls.h +++ b/include/aaruformat/decls.h @@ -195,6 +195,7 @@ AARU_EXPORT int32_t AARU_CALL aaruf_clear_drive_manufacturer(void *context); AARU_EXPORT int32_t AARU_CALL aaruf_clear_drive_model(void *context); AARU_EXPORT int32_t AARU_CALL aaruf_clear_drive_serial_number(void *context); AARU_EXPORT int32_t AARU_CALL aaruf_clear_drive_firmware_revision(void *context); +AARU_EXPORT int32_t AARU_CALL aaruf_get_readable_sector_tags(const void *context, uint8_t *buffer, size_t *length); AARU_EXPORT int32_t AARU_CALL aaruf_get_tape_file(const void *context, uint8_t partition, uint32_t file, uint64_t *starting_block, uint64_t *ending_block); diff --git a/src/blocks/metadata.c b/src/blocks/metadata.c index a6e1ed9..20e93a7 100644 --- a/src/blocks/metadata.c +++ b/src/blocks/metadata.c @@ -537,4 +537,54 @@ void process_aaru_metadata_json_block(aaruformat_context *ctx, const IndexEntry TRACE("Found Aaru metadata JSON block %" PRIu64 ".", entry->offset); TRACE("Exiting process_aaru_metadata_json_block()"); +} + +AARU_EXPORT int32_t AARU_CALL aaruf_get_readable_sector_tags(const void *context, uint8_t *buffer, size_t *length) +{ + TRACE("Entering aaruf_get_readable_sector_tags(%p, %p, %zu)", context, buffer, (length ? *length : 0)); + + // Check context is correct AaruFormat context + if(context == NULL) + { + FATAL("Invalid context"); + + TRACE("Exiting aaruf_get_readable_sector_tags() = AARUF_ERROR_NOT_AARUFORMAT"); + return AARUF_ERROR_NOT_AARUFORMAT; + } + + const aaruformat_context *ctx = context; + + // Not a libaaruformat context + if(ctx->magic != AARU_MAGIC) + { + FATAL("Invalid context"); + + TRACE("Exiting aaruf_get_readable_sector_tags() = AARUF_ERROR_NOT_AARUFORMAT"); + return AARUF_ERROR_NOT_AARUFORMAT; + } + + if(ctx->readableSectorTags == NULL) + { + FATAL("Image contains no readable sector tags"); + + TRACE("Exiting aaruf_get_readable_sector_tags() = AARUF_ERROR_METADATA_NOT_PRESENT"); + return AARUF_ERROR_METADATA_NOT_PRESENT; + } + + size_t required_length = sizeof(bool) * (MaxSectorTag + 1); + + if(buffer == NULL || length == NULL || *length < required_length) + { + if(length) *length = required_length; + + TRACE("Buffer too small for readable sector tags, required %zu bytes", required_length); + TRACE("Exiting aaruf_get_readable_sector_tags() = AARUF_ERROR_BUFFER_TOO_SMALL"); + return AARUF_ERROR_BUFFER_TOO_SMALL; + } + + memcpy(buffer, ctx->readableSectorTags, required_length); + *length = required_length; + + TRACE("Exiting aaruf_get_readable_sector_tags(%p, %p, %zu) = AARUF_STATUS_OK", context, buffer, *length); + return AARUF_STATUS_OK; } \ No newline at end of file