libaaruformat 1.0
Aaru Data Preservation Suite - Format Library
Loading...
Searching...
No Matches
metadata.c
Go to the documentation of this file.
1/*
2 * This file is part of the Aaru Data Preservation Suite.
3 * Copyright (c) 2019-2026 Natalia Portillo.
4 *
5 * This library is free software; you can redistribute it and/or modify
6 * it under the terms of the GNU Lesser General Public License as
7 * published by the Free Software Foundation; either version 2.1 of the
8 * License, or (at your option) any later version.
9 *
10 * This library is distributed in the hope that it will be useful, but
11 * WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 * Lesser General Public License for more details.
14 *
15 * You should have received a copy of the GNU Lesser General Public
16 * License along with this library; if not, see <http://www.gnu.org/licenses/>.
17 */
28
29#include <stddef.h>
30#include <stdint.h>
31
32#include "aaruformat.h"
33#include "log.h"
34
104AARU_EXPORT int32_t AARU_CALL aaruf_get_geometry(const void *context, uint32_t *cylinders, uint32_t *heads,
105 uint32_t *sectors_per_track)
106{
107 TRACE("Entering aaruf_get_geometry(%p, %p, %p, %p)", context, cylinders, heads, sectors_per_track);
108
109 const aaruformat_context *ctx = NULL;
110
111 if(context == NULL)
112 {
113 FATAL("Invalid context");
114
115 TRACE("Exiting aaruf_get_geometry() = AARUF_ERROR_NOT_AARUFORMAT");
117 }
118
119 ctx = context;
120
121 // Not a libaaruformat context
122 if(ctx->magic != AARU_MAGIC)
123 {
124 FATAL("Invalid context");
125
126 TRACE("Exiting aaruf_get_geometry() = AARUF_ERROR_NOT_AARUFORMAT");
128 }
129
131 {
132 FATAL("No geometry block present");
133
134 TRACE("Exiting aaruf_get_geometry() = AARUF_ERROR_CANNOT_READ_BLOCK");
136 }
137
138 *cylinders = ctx->geometry_block.cylinders;
139 *heads = ctx->geometry_block.heads;
140 *sectors_per_track = ctx->geometry_block.sectorsPerTrack;
141
142 TRACE("Exiting aaruf_get_geometry(%p, %u, %u, %u) = AARUF_STATUS_OK", context, *cylinders, *heads,
143 *sectors_per_track);
144 return AARUF_STATUS_OK;
145}
146
244AARU_EXPORT int32_t AARU_CALL aaruf_get_cicm_metadata(const void *context, uint8_t *buffer, size_t *length)
245{
246 TRACE("Entering aaruf_get_cicm_metadata(%p, %p, %p)", context, buffer, length);
247
248 // Check context is correct AaruFormat context
249 if(context == NULL)
250 {
251 FATAL("Invalid context");
252
253 TRACE("Exiting aaruf_get_cicm_metadata() = AARUF_ERROR_NOT_AARUFORMAT");
255 }
256
257 const aaruformat_context *ctx = context;
258
259 // Not a libaaruformat context
260 if(ctx->magic != AARU_MAGIC)
261 {
262 FATAL("Invalid context");
263
264 TRACE("Exiting aaruf_get_cicm_metadata() = AARUF_ERROR_NOT_AARUFORMAT");
266 }
267
268 if(ctx->cicm_block == NULL || ctx->cicm_block_header.length == 0 || ctx->cicm_block_header.identifier != CicmBlock)
269 {
270 TRACE("No CICM XML metadata present");
271 *length = 0;
272
273 TRACE("Exiting aaruf_get_cicm_metadata() = AARUF_ERROR_CANNOT_READ_BLOCK");
275 }
276
277 if(*length < ctx->cicm_block_header.length)
278 {
279 TRACE("Buffer too small for CICM XML metadata, required %u bytes", ctx->cicm_block_header.length);
280 *length = ctx->cicm_block_header.length;
281
282 TRACE("Exiting aaruf_get_cicm_metadata() = AARUF_ERROR_BUFFER_TOO_SMALL");
284 }
285
286 *length = ctx->cicm_block_header.length;
287 memcpy(buffer, ctx->cicm_block, ctx->cicm_block_header.length);
288
289 TRACE("CICM XML metadata read successfully, length %u", *length);
290 TRACE("Exiting aaruf_get_cicm_metadata(%p, %p, %d) = AARUF_STATUS_OK", context, buffer, *length);
291 return AARUF_STATUS_OK;
292}
293
399AARU_EXPORT int32_t AARU_CALL aaruf_get_aaru_json_metadata(const void *context, uint8_t *buffer, size_t *length)
400{
401 TRACE("Entering aaruf_get_aaru_json_metadata(%p, %p, %p)", context, buffer, length);
402
403 // Check context is correct AaruFormat context
404 if(context == NULL)
405 {
406 FATAL("Invalid context");
407
408 TRACE("Exiting aaruf_get_aaru_json_metadata() = AARUF_ERROR_NOT_AARUFORMAT");
410 }
411
412 const aaruformat_context *ctx = context;
413
414 // Not a libaaruformat context
415 if(ctx->magic != AARU_MAGIC)
416 {
417 FATAL("Invalid context");
418
419 TRACE("Exiting aaruf_get_aaru_json_metadata() = AARUF_ERROR_NOT_AARUFORMAT");
421 }
422
423 if(ctx->json_block == NULL || ctx->json_block_header.length == 0 ||
425 {
426 TRACE("No Aaru metadata JSON present");
427 *length = 0;
428
429 TRACE("Exiting aaruf_get_aaru_json_metadata() = AARUF_ERROR_CANNOT_READ_BLOCK");
431 }
432
433 if(*length < ctx->json_block_header.length)
434 {
435 TRACE("Buffer too small for Aaru metadata JSON, required %u bytes", ctx->json_block_header.length);
436 *length = ctx->json_block_header.length;
437
438 TRACE("Exiting aaruf_get_aaru_json_metadata() = AARUF_ERROR_BUFFER_TOO_SMALL");
440 }
441
442 *length = ctx->json_block_header.length;
443 memcpy(buffer, ctx->json_block, ctx->json_block_header.length);
444
445 TRACE("Aaru metadata JSON read successfully, length %u", *length);
446 TRACE("Exiting aaruf_get_aaru_json_metadata(%p, %p, %d) = AARUF_STATUS_OK", context, buffer, *length);
447 return AARUF_STATUS_OK;
448}
449
477AARU_EXPORT int32_t AARU_CALL aaruf_get_media_sequence(const void *context, int32_t *sequence, int32_t *last_sequence)
478{
479 TRACE("Entering aaruf_get_media_sequence(%p, %p, %p)", context, sequence, last_sequence);
480
481 // Check context is correct AaruFormat context
482 if(context == NULL)
483 {
484 FATAL("Invalid context");
485
486 TRACE("Exiting aaruf_set_media_sequence() = AARUF_ERROR_NOT_AARUFORMAT");
488 }
489
490 const aaruformat_context *ctx = context;
491
492 // Not a libaaruformat context
493 if(ctx->magic != AARU_MAGIC)
494 {
495 FATAL("Invalid context");
496
497 TRACE("Exiting aaruf_set_media_sequence() = AARUF_ERROR_NOT_AARUFORMAT");
499 }
500
502 {
503 FATAL("No metadata block present");
504
505 TRACE("Exiting aaruf_set_media_sequence() = AARUF_ERROR_METADATA_NOT_PRESENT");
507 }
508
509 *sequence = ctx->metadata_block_header.mediaSequence;
510 *last_sequence = ctx->metadata_block_header.lastMediaSequence;
511
512 TRACE("Exiting aaruf_set_media_sequence(%p, %d, %d) = AARUF_STATUS_OK", context, *sequence, *last_sequence);
513 return AARUF_STATUS_OK;
514}
515
544AARU_EXPORT int32_t AARU_CALL aaruf_get_creator(const void *context, uint8_t *buffer, int32_t *length)
545{
546 TRACE("Entering aaruf_get_creator(%p, %p, %p)", context, buffer, length);
547
548 // Check context is correct AaruFormat context
549 if(context == NULL)
550 {
551 FATAL("Invalid context");
552
553 TRACE("Exiting aaruf_get_creator() = AARUF_ERROR_NOT_AARUFORMAT");
555 }
556
557 const aaruformat_context *ctx = context;
558
559 // Not a libaaruformat context
560 if(ctx->magic != AARU_MAGIC)
561 {
562 FATAL("Invalid context");
563
564 TRACE("Exiting aaruf_get_creator() = AARUF_ERROR_NOT_AARUFORMAT");
566 }
567
568 if(ctx->metadata_block_header.identifier != MetadataBlock || ctx->creator == NULL ||
570 {
571 FATAL("No metadata block present");
572
573 TRACE("Exiting aaruf_get_creator() = AARUF_ERROR_METADATA_NOT_PRESENT");
575 }
576
577 if(buffer == NULL || *length < ctx->metadata_block_header.creatorLength)
578 {
580
581 TRACE("Exiting aaruf_get_creator() = AARUF_ERROR_BUFFER_TOO_SMALL");
583 }
584
585 // Copy opaque UTF-16LE string
586 memcpy(buffer, ctx->creator, ctx->metadata_block_header.creatorLength);
588
589 TRACE("Exiting aaruf_get_creator(%p, %p, %d) = AARUF_STATUS_OK", context, buffer, *length);
590 return AARUF_STATUS_OK;
591}
592
616AARU_EXPORT int32_t AARU_CALL aaruf_get_comments(const void *context, uint8_t *buffer, int32_t *length)
617{
618 TRACE("Entering aaruf_get_comments(%p, %p, %p)", context, buffer, length);
619
620 // Check context is correct AaruFormat context
621 if(context == NULL)
622 {
623 FATAL("Invalid context");
624
625 TRACE("Exiting aaruf_get_comments() = AARUF_ERROR_NOT_AARUFORMAT");
627 }
628
629 const aaruformat_context *ctx = context;
630
631 // Not a libaaruformat context
632 if(ctx->magic != AARU_MAGIC)
633 {
634 FATAL("Invalid context");
635
636 TRACE("Exiting aaruf_get_comments() = AARUF_ERROR_NOT_AARUFORMAT");
638 }
639
640 if(ctx->metadata_block_header.identifier != MetadataBlock || ctx->comments == NULL ||
642 {
643 FATAL("No metadata block present");
644
645 TRACE("Exiting aaruf_get_comments() = AARUF_ERROR_METADATA_NOT_PRESENT");
647 }
648
649 if(buffer == NULL || *length < ctx->metadata_block_header.commentsLength)
650 {
652
653 TRACE("Exiting aaruf_get_comments() = AARUF_ERROR_BUFFER_TOO_SMALL");
655 }
656
657 // Copy opaque UTF-16LE string
658 memcpy(buffer, ctx->comments, ctx->metadata_block_header.commentsLength);
660
661 TRACE("Exiting aaruf_get_comments(%p, %p, %d) = AARUF_STATUS_OK", context, buffer, *length);
662 return AARUF_STATUS_OK;
663}
664
686AARU_EXPORT int32_t AARU_CALL aaruf_get_media_title(const void *context, uint8_t *buffer, int32_t *length)
687{
688 TRACE("Entering aaruf_get_media_title(%p, %p, %p)", context, buffer, length);
689
690 // Check context is correct AaruFormat context
691 if(context == NULL)
692 {
693 FATAL("Invalid context");
694
695 TRACE("Exiting aaruf_get_media_title() = AARUF_ERROR_NOT_AARUFORMAT");
697 }
698
699 const aaruformat_context *ctx = context;
700
701 // Not a libaaruformat context
702 if(ctx->magic != AARU_MAGIC)
703 {
704 FATAL("Invalid context");
705
706 TRACE("Exiting aaruf_get_media_title() = AARUF_ERROR_NOT_AARUFORMAT");
708 }
709
710 if(ctx->metadata_block_header.identifier != MetadataBlock || ctx->media_title == NULL ||
712 {
713 FATAL("No metadata block present");
714
715 TRACE("Exiting aaruf_get_media_title() = AARUF_ERROR_METADATA_NOT_PRESENT");
717 }
718
719 if(buffer == NULL || *length < ctx->metadata_block_header.mediaTitleLength)
720 {
722
723 TRACE("Exiting aaruf_get_media_title() = AARUF_ERROR_BUFFER_TOO_SMALL");
725 }
726
727 // Copy opaque UTF-16LE string
728 memcpy(buffer, ctx->media_title, ctx->metadata_block_header.mediaTitleLength);
730
731 TRACE("Exiting aaruf_get_media_title(%p, %p, %d) = AARUF_STATUS_OK", context, buffer, *length);
732 return AARUF_STATUS_OK;
733}
734
756AARU_EXPORT int32_t AARU_CALL aaruf_get_media_manufacturer(const void *context, uint8_t *buffer, int32_t *length)
757{
758 TRACE("Entering aaruf_get_media_manufacturer(%p, %p, %p)", context, buffer, length);
759
760 // Check context is correct AaruFormat context
761 if(context == NULL)
762 {
763 FATAL("Invalid context");
764
765 TRACE("Exiting aaruf_get_media_manufacturer() = AARUF_ERROR_NOT_AARUFORMAT");
767 }
768
769 const aaruformat_context *ctx = context;
770
771 // Not a libaaruformat context
772 if(ctx->magic != AARU_MAGIC)
773 {
774 FATAL("Invalid context");
775
776 TRACE("Exiting aaruf_get_media_manufacturer() = AARUF_ERROR_NOT_AARUFORMAT");
778 }
779
782 {
783 FATAL("No metadata block present");
784
785 TRACE("Exiting aaruf_get_media_manufacturer() = AARUF_ERROR_METADATA_NOT_PRESENT");
787 }
788
789 if(buffer == NULL || *length < ctx->metadata_block_header.mediaManufacturerLength)
790 {
792
793 TRACE("Exiting aaruf_get_media_manufacturer() = AARUF_ERROR_BUFFER_TOO_SMALL");
795 }
796
797 // Copy opaque UTF-16LE string
800
801 TRACE("Exiting aaruf_get_media_manufacturer(%p, %p, %d) = AARUF_STATUS_OK", context, buffer, *length);
802 return AARUF_STATUS_OK;
803}
804
826AARU_EXPORT int32_t AARU_CALL aaruf_get_media_model(const void *context, uint8_t *buffer, int32_t *length)
827{
828 TRACE("Entering aaruf_get_media_model(%p, %p, %p)", context, buffer, length);
829
830 // Check context is correct AaruFormat context
831 if(context == NULL)
832 {
833 FATAL("Invalid context");
834
835 TRACE("Exiting aaruf_get_media_model() = AARUF_ERROR_NOT_AARUFORMAT");
837 }
838
839 const aaruformat_context *ctx = context;
840
841 // Not a libaaruformat context
842 if(ctx->magic != AARU_MAGIC)
843 {
844 FATAL("Invalid context");
845
846 TRACE("Exiting aaruf_get_media_model() = AARUF_ERROR_NOT_AARUFORMAT");
848 }
849
850 if(ctx->metadata_block_header.identifier != MetadataBlock || ctx->media_model == NULL ||
852 {
853 FATAL("No metadata block present");
854
855 TRACE("Exiting aaruf_get_media_model() = AARUF_ERROR_METADATA_NOT_PRESENT");
857 }
858
859 if(buffer == NULL || *length < ctx->metadata_block_header.mediaModelLength)
860 {
862
863 TRACE("Exiting aaruf_get_media_model() = AARUF_ERROR_BUFFER_TOO_SMALL");
865 }
866
867 // Copy opaque UTF-16LE string
868 memcpy(buffer, ctx->media_model, ctx->metadata_block_header.mediaModelLength);
870
871 TRACE("Exiting aaruf_get_media_model(%p, %p, %d) = AARUF_STATUS_OK", context, buffer, *length);
872 return AARUF_STATUS_OK;
873}
874
896AARU_EXPORT int32_t AARU_CALL aaruf_get_media_serial_number(const void *context, uint8_t *buffer, int32_t *length)
897{
898 TRACE("Entering aaruf_get_media_serial_number(%p, %p, %p)", context, buffer, length);
899
900 // Check context is correct AaruFormat context
901 if(context == NULL)
902 {
903 FATAL("Invalid context");
904
905 TRACE("Exiting aaruf_get_media_serial_number() = AARUF_ERROR_NOT_AARUFORMAT");
907 }
908
909 const aaruformat_context *ctx = context;
910
911 // Not a libaaruformat context
912 if(ctx->magic != AARU_MAGIC)
913 {
914 FATAL("Invalid context");
915
916 TRACE("Exiting aaruf_get_media_serial_number() = AARUF_ERROR_NOT_AARUFORMAT");
918 }
919
922 {
923 FATAL("No metadata block present");
924
925 TRACE("Exiting aaruf_get_media_serial_number() = AARUF_ERROR_METADATA_NOT_PRESENT");
927 }
928
929 if(buffer == NULL || *length < ctx->metadata_block_header.mediaSerialNumberLength)
930 {
932
933 TRACE("Exiting aaruf_get_media_serial_number() = AARUF_ERROR_BUFFER_TOO_SMALL");
935 }
936
937 // Copy opaque UTF-16LE string
940
941 TRACE("Exiting aaruf_get_media_serial_number(%p, %p, %d) = AARUF_STATUS_OK", context, buffer, *length);
942 return AARUF_STATUS_OK;
943}
944
965AARU_EXPORT int32_t AARU_CALL aaruf_get_media_barcode(const void *context, uint8_t *buffer, int32_t *length)
966{
967 TRACE("Entering aaruf_get_media_barcode(%p, %p, %p)", context, buffer, length);
968
969 // Check context is correct AaruFormat context
970 if(context == NULL)
971 {
972 FATAL("Invalid context");
973
974 TRACE("Exiting aaruf_get_media_barcode() = AARUF_ERROR_NOT_AARUFORMAT");
976 }
977
978 const aaruformat_context *ctx = context;
979
980 // Not a libaaruformat context
981 if(ctx->magic != AARU_MAGIC)
982 {
983 FATAL("Invalid context");
984
985 TRACE("Exiting aaruf_get_media_barcode() = AARUF_ERROR_NOT_AARUFORMAT");
987 }
988
989 if(ctx->metadata_block_header.identifier != MetadataBlock || ctx->media_barcode == NULL ||
991 {
992 FATAL("No metadata block present");
993
994 TRACE("Exiting aaruf_get_media_barcode() = AARUF_ERROR_METADATA_NOT_PRESENT");
996 }
997
998 if(buffer == NULL || *length < ctx->metadata_block_header.mediaBarcodeLength)
999 {
1001
1002 TRACE("Exiting aaruf_get_media_barcode() = AARUF_ERROR_BUFFER_TOO_SMALL");
1004 }
1005
1006 // Copy opaque UTF-16LE string
1007 memcpy(buffer, ctx->media_barcode, ctx->metadata_block_header.mediaBarcodeLength);
1009
1010 TRACE("Exiting aaruf_get_media_barcode(%p, %p, %d) = AARUF_STATUS_OK", context, buffer, *length);
1011 return AARUF_STATUS_OK;
1012}
1013
1036AARU_EXPORT int32_t AARU_CALL aaruf_get_media_part_number(const void *context, uint8_t *buffer, int32_t *length)
1037{
1038 TRACE("Entering aaruf_get_media_part_number(%p, %p, %p)", context, buffer, length);
1039
1040 // Check context is correct AaruFormat context
1041 if(context == NULL)
1042 {
1043 FATAL("Invalid context");
1044
1045 TRACE("Exiting aaruf_get_media_part_number() = AARUF_ERROR_NOT_AARUFORMAT");
1047 }
1048
1049 const aaruformat_context *ctx = context;
1050
1051 // Not a libaaruformat context
1052 if(ctx->magic != AARU_MAGIC)
1053 {
1054 FATAL("Invalid context");
1055
1056 TRACE("Exiting aaruf_get_media_part_number() = AARUF_ERROR_NOT_AARUFORMAT");
1058 }
1059
1062 {
1063 FATAL("No metadata block present");
1064
1065 TRACE("Exiting aaruf_get_media_part_number() = AARUF_ERROR_METADATA_NOT_PRESENT");
1067 }
1068
1069 if(buffer == NULL || *length < ctx->metadata_block_header.mediaPartNumberLength)
1070 {
1072
1073 TRACE("Exiting aaruf_get_media_part_number() = AARUF_ERROR_BUFFER_TOO_SMALL");
1075 }
1076
1077 // Copy opaque UTF-16LE string
1080
1081 TRACE("Exiting aaruf_get_media_part_number(%p, %p, %d) = AARUF_STATUS_OK", context, buffer, *length);
1082 return AARUF_STATUS_OK;
1083}
1084
1108AARU_EXPORT int32_t AARU_CALL aaruf_get_drive_manufacturer(const void *context, uint8_t *buffer, int32_t *length)
1109{
1110 TRACE("Entering aaruf_get_drive_manufacturer(%p, %p, %p)", context, buffer, length);
1111
1112 // Check context is correct AaruFormat context
1113 if(context == NULL)
1114 {
1115 FATAL("Invalid context");
1116
1117 TRACE("Exiting aaruf_get_drive_manufacturer() = AARUF_ERROR_NOT_AARUFORMAT");
1119 }
1120
1121 const aaruformat_context *ctx = context;
1122
1123 // Not a libaaruformat context
1124 if(ctx->magic != AARU_MAGIC)
1125 {
1126 FATAL("Invalid context");
1127
1128 TRACE("Exiting aaruf_get_drive_manufacturer() = AARUF_ERROR_NOT_AARUFORMAT");
1130 }
1131
1134 {
1135 FATAL("No metadata block present");
1136
1137 TRACE("Exiting aaruf_get_drive_manufacturer() = AARUF_ERROR_METADATA_NOT_PRESENT");
1139 }
1140
1141 if(buffer == NULL || *length < ctx->metadata_block_header.driveManufacturerLength)
1142 {
1144
1145 TRACE("Exiting aaruf_get_drive_manufacturer() = AARUF_ERROR_BUFFER_TOO_SMALL");
1147 }
1148
1149 // Copy opaque UTF-16LE string
1152
1153 TRACE("Exiting aaruf_get_drive_manufacturer(%p, %p, %d) = AARUF_STATUS_OK", context, buffer, *length);
1154 return AARUF_STATUS_OK;
1155}
1156
1178AARU_EXPORT int32_t AARU_CALL aaruf_get_drive_model(const void *context, uint8_t *buffer, int32_t *length)
1179{
1180 TRACE("Entering aaruf_get_drive_model(%p, %p, %p)", context, buffer, length);
1181
1182 // Check context is correct AaruFormat context
1183 if(context == NULL)
1184 {
1185 FATAL("Invalid context");
1186
1187 TRACE("Exiting aaruf_get_drive_model() = AARUF_ERROR_NOT_AARUFORMAT");
1189 }
1190
1191 const aaruformat_context *ctx = context;
1192
1193 // Not a libaaruformat context
1194 if(ctx->magic != AARU_MAGIC)
1195 {
1196 FATAL("Invalid context");
1197
1198 TRACE("Exiting aaruf_get_drive_model() = AARUF_ERROR_NOT_AARUFORMAT");
1200 }
1201
1202 if(ctx->metadata_block_header.identifier != MetadataBlock || ctx->drive_model == NULL ||
1204 {
1205 FATAL("No metadata block present");
1206
1207 TRACE("Exiting aaruf_get_drive_model() = AARUF_ERROR_METADATA_NOT_PRESENT");
1209 }
1210
1211 if(buffer == NULL || *length < ctx->metadata_block_header.driveModelLength)
1212 {
1214
1215 TRACE("Exiting aaruf_get_drive_model() = AARUF_ERROR_BUFFER_TOO_SMALL");
1217 }
1218
1219 // Copy opaque UTF-16LE string
1220 memcpy(buffer, ctx->drive_model, ctx->metadata_block_header.driveModelLength);
1222
1223 TRACE("Exiting aaruf_get_drive_model(%p, %p, %d) = AARUF_STATUS_OK", context, buffer, *length);
1224 return AARUF_STATUS_OK;
1225}
1226
1248AARU_EXPORT int32_t AARU_CALL aaruf_get_drive_serial_number(const void *context, uint8_t *buffer, int32_t *length)
1249{
1250 TRACE("Entering aaruf_get_drive_serial_number(%p, %p, %p)", context, buffer, length);
1251
1252 // Check context is correct AaruFormat context
1253 if(context == NULL)
1254 {
1255 FATAL("Invalid context");
1256
1257 TRACE("Exiting aaruf_get_drive_serial_number() = AARUF_ERROR_NOT_AARUFORMAT");
1259 }
1260
1261 const aaruformat_context *ctx = context;
1262
1263 // Not a libaaruformat context
1264 if(ctx->magic != AARU_MAGIC)
1265 {
1266 FATAL("Invalid context");
1267
1268 TRACE("Exiting aaruf_get_drive_serial_number() = AARUF_ERROR_NOT_AARUFORMAT");
1270 }
1271
1274 {
1275 FATAL("No metadata block present");
1276
1277 TRACE("Exiting aaruf_get_drive_serial_number() = AARUF_ERROR_METADATA_NOT_PRESENT");
1279 }
1280
1281 if(buffer == NULL || *length < ctx->metadata_block_header.driveSerialNumberLength)
1282 {
1284
1285 TRACE("Exiting aaruf_get_drive_serial_number() = AARUF_ERROR_BUFFER_TOO_SMALL");
1287 }
1288
1289 // Copy opaque UTF-16LE string
1292
1293 TRACE("Exiting aaruf_get_drive_serial_number(%p, %p, %d) = AARUF_STATUS_OK", context, buffer, *length);
1294 return AARUF_STATUS_OK;
1295}
1296
1318AARU_EXPORT int32_t AARU_CALL aaruf_get_drive_firmware_revision(const void *context, uint8_t *buffer, int32_t *length)
1319{
1320 TRACE("Entering aaruf_get_drive_firmware_revision(%p, %p, %p)", context, buffer, length);
1321
1322 // Check context is correct AaruFormat context
1323 if(context == NULL)
1324 {
1325 FATAL("Invalid context");
1326
1327 TRACE("Exiting aaruf_get_drive_firmware_revision() = AARUF_ERROR_NOT_AARUFORMAT");
1329 }
1330
1331 const aaruformat_context *ctx = context;
1332
1333 // Not a libaaruformat context
1334 if(ctx->magic != AARU_MAGIC)
1335 {
1336 FATAL("Invalid context");
1337
1338 TRACE("Exiting aaruf_get_drive_firmware_revision() = AARUF_ERROR_NOT_AARUFORMAT");
1340 }
1341
1344 {
1345 FATAL("No metadata block present");
1346
1347 TRACE("Exiting aaruf_get_drive_firmware_revision() = AARUF_ERROR_METADATA_NOT_PRESENT");
1349 }
1350
1351 if(buffer == NULL || *length < ctx->metadata_block_header.driveFirmwareRevisionLength)
1352 {
1354
1355 TRACE("Exiting aaruf_get_drive_firmware_revision() = AARUF_ERROR_BUFFER_TOO_SMALL");
1357 }
1358
1359 // Copy opaque UTF-16LE string
1362
1363 TRACE("Exiting aaruf_get_drive_firmware_revision(%p, %p, %d) = AARUF_STATUS_OK", context, buffer, *length);
1364 return AARUF_STATUS_OK;
1365}
1366
1432AARU_EXPORT int32_t AARU_CALL aaruf_get_user_sectors(const void *context, uint64_t *sectors)
1433{
1434 TRACE("Entering aaruf_get_user_sectors(%p, %p)", context, sectors);
1435
1436 // Check context is correct AaruFormat context
1437 if(context == NULL)
1438 {
1439 FATAL("Invalid context");
1440
1441 TRACE("Exiting aaruf_get_user_sectors() = AARUF_ERROR_NOT_AARUFORMAT");
1443 }
1444
1445 const aaruformat_context *ctx = context;
1446
1447 // Not a libaaruformat context
1448 if(ctx->magic != AARU_MAGIC)
1449 {
1450 FATAL("Invalid context");
1451
1452 TRACE("Exiting aaruf_get_user_sectors() = AARUF_ERROR_NOT_AARUFORMAT");
1454 }
1455
1456 *sectors = ctx->user_data_ddt_header.blocks;
1457
1458 TRACE("Exiting aaruf_get_user_sectors(%p, %llu) = AARUF_STATUS_OK", context, *sectors);
1459 return AARUF_STATUS_OK;
1460}
1461
1557AARU_EXPORT int32_t AARU_CALL aaruf_get_negative_sectors(const void *context, uint32_t *sectors)
1558{
1559 TRACE("Entering aaruf_get_negative_sectors(%p, %p)", context, sectors);
1560
1561 // Check context is correct AaruFormat context
1562 if(context == NULL)
1563 {
1564 FATAL("Invalid context");
1565
1566 TRACE("Exiting aaruf_get_negative_sectors() = AARUF_ERROR_NOT_AARUFORMAT");
1568 }
1569
1570 const aaruformat_context *ctx = context;
1571
1572 // Not a libaaruformat context
1573 if(ctx->magic != AARU_MAGIC)
1574 {
1575 FATAL("Invalid context");
1576
1577 TRACE("Exiting aaruf_get_negative_sectors() = AARUF_ERROR_NOT_AARUFORMAT");
1579 }
1580
1581 *sectors = ctx->user_data_ddt_header.negative;
1582
1583 TRACE("Exiting aaruf_get_negative_sectors(%p, %u) = AARUF_STATUS_OK", context, *sectors);
1584 return AARUF_STATUS_OK;
1585}
1586
1692AARU_EXPORT int32_t AARU_CALL aaruf_get_overflow_sectors(const void *context, uint32_t *sectors)
1693{
1694 TRACE("Entering aaruf_get_overflow_sectors(%p, %p)", context, sectors);
1695
1696 // Check context is correct AaruFormat context
1697 if(context == NULL)
1698 {
1699 FATAL("Invalid context");
1700
1701 TRACE("Exiting aaruf_get_overflow_sectors() = AARUF_ERROR_NOT_AARUFORMAT");
1703 }
1704
1705 const aaruformat_context *ctx = context;
1706
1707 // Not a libaaruformat context
1708 if(ctx->magic != AARU_MAGIC)
1709 {
1710 FATAL("Invalid context");
1711
1712 TRACE("Exiting aaruf_get_overflow_sectors() = AARUF_ERROR_NOT_AARUFORMAT");
1714 }
1715
1716 *sectors = ctx->user_data_ddt_header.overflow;
1717
1718 TRACE("Exiting aaruf_get_overflow_sectors(%p, %u) = AARUF_STATUS_OK", context, *sectors);
1719 return AARUF_STATUS_OK;
1720}
1721
1774AARU_EXPORT int32_t AARU_CALL aaruf_get_image_info(const void *context, ImageInfo *image_info)
1775{
1776 TRACE("Entering aaruf_get_image_info(%p, %p)", context, image_info);
1777
1778 // Check context is correct AaruFormat context
1779 if(context == NULL)
1780 {
1781 FATAL("Invalid context");
1782
1783 TRACE("Exiting aaruf_get_image_info() = AARUF_ERROR_NOT_AARUFORMAT");
1785 }
1786
1787 const aaruformat_context *ctx = context;
1788
1789 // Not a libaaruformat context
1790 if(ctx->magic != AARU_MAGIC)
1791 {
1792 FATAL("Invalid context");
1793
1794 TRACE("Exiting aaruf_get_image_info() = AARUF_ERROR_NOT_AARUFORMAT");
1796 }
1797
1798 if(image_info == NULL)
1799 {
1800 FATAL("image_info parameter is NULL");
1801
1802 TRACE("Exiting aaruf_get_image_info() = AARUF_ERROR_INCORRECT_DATA_SIZE");
1804 }
1805
1806 // Perform deep copy of the image_info structure
1807 memcpy(image_info, &ctx->image_info, sizeof(ImageInfo));
1808
1809 TRACE("Exiting aaruf_get_image_info() = AARUF_STATUS_OK");
1810 return AARUF_STATUS_OK;
1811}
1812
#define AARU_MAGIC
Magic identifier for AaruFormat container (ASCII "AARUFRMT").
Definition consts.h:64
#define AARU_CALL
Definition decls.h:46
#define AARU_EXPORT
Definition decls.h:55
@ GeometryBlock
Block containing logical geometry.
Definition enums.h:172
@ AaruMetadataJsonBlock
Block containing JSON version of Aaru Metadata.
Definition enums.h:183
@ CicmBlock
Block containing CICM XML metadata.
Definition enums.h:175
@ MetadataBlock
Block containing metadata.
Definition enums.h:173
#define AARUF_STATUS_OK
Sector present and read without uncorrectable errors.
Definition errors.h:81
#define AARUF_ERROR_CANNOT_READ_BLOCK
Generic block read failure (seek/read error).
Definition errors.h:46
#define AARUF_ERROR_INCORRECT_DATA_SIZE
Data size does not match expected size.
Definition errors.h:65
#define AARUF_ERROR_METADATA_NOT_PRESENT
Requested metadata not present in image.
Definition errors.h:69
#define AARUF_ERROR_NOT_AARUFORMAT
Input file/stream failed magic or structural validation.
Definition errors.h:40
#define AARUF_ERROR_BUFFER_TOO_SMALL
Caller-supplied buffer insufficient for data.
Definition errors.h:49
#define FATAL(fmt,...)
Definition log.h:40
#define TRACE(fmt,...)
Definition log.h:25
int32_t aaruf_get_aaru_json_metadata(const void *context, uint8_t *buffer, size_t *length)
Retrieves the embedded Aaru metadata JSON from the image.
Definition metadata.c:399
int32_t aaruf_get_overflow_sectors(const void *context, uint32_t *sectors)
Retrieves the number of overflow (post-gap) sectors in the AaruFormat image.
Definition metadata.c:1692
int32_t aaruf_get_drive_serial_number(const void *context, uint8_t *buffer, int32_t *length)
Retrieves the imaging drive's serial number metadata.
Definition metadata.c:1248
int32_t aaruf_get_negative_sectors(const void *context, uint32_t *sectors)
Retrieves the number of negative (pre-gap) sectors in the AaruFormat image.
Definition metadata.c:1557
int32_t aaruf_get_creator(const void *context, uint8_t *buffer, int32_t *length)
Retrieves the recorded creator (operator) name from the MetadataBlock.
Definition metadata.c:544
int32_t aaruf_get_drive_firmware_revision(const void *context, uint8_t *buffer, int32_t *length)
Retrieves the firmware revision metadata for the imaging drive.
Definition metadata.c:1318
int32_t aaruf_get_cicm_metadata(const void *context, uint8_t *buffer, size_t *length)
Retrieves the embedded CICM XML metadata sidecar from the image.
Definition metadata.c:244
int32_t aaruf_get_media_serial_number(const void *context, uint8_t *buffer, int32_t *length)
Retrieves the media serial number recorded in the image metadata.
Definition metadata.c:896
int32_t aaruf_get_media_part_number(const void *context, uint8_t *buffer, int32_t *length)
Retrieves the media part number recorded in the MetadataBlock.
Definition metadata.c:1036
int32_t aaruf_get_media_model(const void *context, uint8_t *buffer, int32_t *length)
Retrieves the media model or product designation metadata.
Definition metadata.c:826
int32_t aaruf_get_media_manufacturer(const void *context, uint8_t *buffer, int32_t *length)
Retrieves the recorded media manufacturer name.
Definition metadata.c:756
int32_t aaruf_get_drive_model(const void *context, uint8_t *buffer, int32_t *length)
Retrieves the device model information for the imaging drive.
Definition metadata.c:1178
int32_t aaruf_get_media_barcode(const void *context, uint8_t *buffer, int32_t *length)
Retrieves the barcode assigned to the physical media or its packaging.
Definition metadata.c:965
int32_t aaruf_get_drive_manufacturer(const void *context, uint8_t *buffer, int32_t *length)
Retrieves the drive manufacturer metadata captured during imaging.
Definition metadata.c:1108
int32_t aaruf_get_image_info(const void *context, ImageInfo *image_info)
Retrieves a deep copy of the ImageInfo structure from the AaruFormat image.
Definition metadata.c:1774
int32_t aaruf_get_user_sectors(const void *context, uint64_t *sectors)
Retrieves the total number of user-accessible sectors in the AaruFormat image.
Definition metadata.c:1432
int32_t aaruf_get_comments(const void *context, uint8_t *buffer, int32_t *length)
Retrieves the user comments or notes stored in the MetadataBlock.
Definition metadata.c:616
int32_t aaruf_get_media_sequence(const void *context, int32_t *sequence, int32_t *last_sequence)
Retrieves the media sequence metadata for multi-volume image sets.
Definition metadata.c:477
int32_t aaruf_get_geometry(const void *context, uint32_t *cylinders, uint32_t *heads, uint32_t *sectors_per_track)
Retrieves the logical CHS geometry from the AaruFormat image.
Definition metadata.c:104
int32_t aaruf_get_media_title(const void *context, uint8_t *buffer, int32_t *length)
Retrieves the media title or label captured during image creation.
Definition metadata.c:686
uint32_t identifier
Block identifier, must be BlockType::AaruMetadataJsonBlock.
Definition metadata.h:121
uint32_t length
Length in bytes of the Aaru metadata JSON payload that follows.
Definition metadata.h:122
uint32_t length
Length in bytes of the CICM metadata payload that follows.
Definition metadata.h:110
uint32_t identifier
Block identifier, must be BlockType::CicmBlock.
Definition metadata.h:109
uint64_t blocks
Total internal span (negative + usable + overflow) in logical sectors.
Definition ddt.h:150
uint32_t overflow
Trailing dumped sectors beyond user area (overflow range), still mapped with entries.
Definition ddt.h:151
uint32_t negative
Leading negative LBA count; added to external L to build internal index.
Definition ddt.h:149
uint32_t identifier
Block identifier, must be BlockType::GeometryBlock.
Definition data.h:92
uint32_t cylinders
Number of cylinders.
Definition data.h:93
uint32_t heads
Number of heads (tracks per cylinder).
Definition data.h:94
uint32_t sectorsPerTrack
Number of sectors per track.
Definition data.h:95
High-level summary of an opened Aaru image containing metadata and media characteristics.
Definition aaru.h:934
uint32_t commentsLength
Length in bytes (including null) of comments string.
Definition metadata.h:78
int32_t mediaSequence
Sequence number within a multi-disc / multi-volume set (0-based or 1-based as producer defines).
Definition metadata.h:72
uint32_t identifier
Block identifier, must be BlockType::MetadataBlock.
Definition metadata.h:70
uint32_t driveModelLength
Length in bytes (including null) of drive model string.
Definition metadata.h:94
uint32_t driveManufacturerLength
Length in bytes (including null) of drive manufacturer string.
Definition metadata.h:92
uint32_t mediaTitleLength
Length in bytes (including null) of media title string.
Definition metadata.h:80
uint32_t driveSerialNumberLength
Length in bytes (including null) of drive serial number string.
Definition metadata.h:96
uint32_t mediaManufacturerLength
Length in bytes (including null) of media manufacturer string.
Definition metadata.h:82
uint32_t mediaModelLength
Length in bytes (including null) of media model string.
Definition metadata.h:84
int32_t lastMediaSequence
Total number of media in the set; 0 or 1 if single item.
Definition metadata.h:74
uint32_t mediaSerialNumberLength
Length in bytes (including null) of media serial number string.
Definition metadata.h:86
uint32_t mediaPartNumberLength
Length in bytes (including null) of media part number string.
Definition metadata.h:90
uint32_t mediaBarcodeLength
Length in bytes (including null) of media barcode string.
Definition metadata.h:88
uint32_t creatorLength
Length in bytes (including null) of creator string (0 if absent).
Definition metadata.h:76
uint32_t driveFirmwareRevisionLength
Length in bytes (including null) of drive firmware revision string.
Definition metadata.h:98
Master context representing an open or in‑creation Aaru image.
Definition context.h:175
uint8_t * media_barcode
Barcode of the media represented by the image.
Definition context.h:225
DdtHeader2 user_data_ddt_header
Active user data DDT v2 header (primary table meta).
Definition context.h:192
uint8_t * creator
Who (person) created the image?
Definition context.h:219
uint8_t * cicm_block
CICM XML payload.
Definition context.h:217
uint8_t * drive_firmware_revision
Firmware revision of the drive used to read the media represented by the image.
Definition context.h:231
uint8_t * media_serial_number
Serial number of the media represented by the image.
Definition context.h:224
MetadataBlockHeader metadata_block_header
Metadata block header.
Definition context.h:233
uint8_t * media_model
Model of the media represented by the image.
Definition context.h:223
uint8_t * drive_serial_number
Serial number of the drive used to read the media represented by the image.
Definition context.h:229
uint8_t * drive_manufacturer
Manufacturer of the drive used to read the media represented by the image.
Definition context.h:227
CicmMetadataBlock cicm_block_header
CICM metadata header (if present).
Definition context.h:234
uint8_t * drive_model
Model of the drive used to read the media represented by the image.
Definition context.h:228
uint64_t magic
File magic (AARU_MAGIC) post-open.
Definition context.h:177
GeometryBlockHeader geometry_block
Logical geometry block (if present).
Definition context.h:232
uint8_t * json_block
JSON metadata block payload (UTF-8).
Definition context.h:218
uint8_t * media_part_number
Part number of the media represented by the image.
Definition context.h:226
AaruMetadataJsonBlockHeader json_block_header
JSON metadata block header (if present).
Definition context.h:236
uint8_t * comments
Image comments.
Definition context.h:221
ImageInfo image_info
Exposed high-level image info summary.
Definition context.h:263
uint8_t * media_title
Title of the media represented by the image.
Definition context.h:220
uint8_t * media_manufacturer
Manufacturer of the media represented by the image.
Definition context.h:222