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-2025 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 */
18
19#include <stddef.h>
20#include <stdint.h>
21
22#include "aaruformat.h"
23#include "log.h"
24
94int32_t aaruf_get_geometry(const void *context, uint32_t *cylinders, uint32_t *heads, uint32_t *sectors_per_track)
95{
96 TRACE("Entering aaruf_get_geometry(%p, %p, %p, %p)", context, cylinders, heads, sectors_per_track);
97
98 const aaruformat_context *ctx = NULL;
99
100 if(context == NULL)
101 {
102 FATAL("Invalid context");
103
104 TRACE("Exiting aaruf_get_geometry() = AARUF_ERROR_NOT_AARUFORMAT");
106 }
107
108 ctx = context;
109
110 // Not a libaaruformat context
111 if(ctx->magic != AARU_MAGIC)
112 {
113 FATAL("Invalid context");
114
115 TRACE("Exiting aaruf_get_geometry() = AARUF_ERROR_NOT_AARUFORMAT");
117 }
118
120 {
121 FATAL("No geometry block present");
122
123 TRACE("Exiting aaruf_get_geometry() = AARUF_ERROR_CANNOT_READ_BLOCK");
125 }
126
127 *cylinders = ctx->geometry_block.cylinders;
128 *heads = ctx->geometry_block.heads;
129 *sectors_per_track = ctx->geometry_block.sectorsPerTrack;
130
131 TRACE("Exiting aaruf_get_geometry(%p, %u, %u, %u) = AARUF_STATUS_OK", context, *cylinders, *heads,
132 *sectors_per_track);
133 return AARUF_STATUS_OK;
134}
135
229int32_t aaruf_set_geometry(void *context, const uint32_t cylinders, const uint32_t heads,
230 const uint32_t sectors_per_track)
231{
232 TRACE("Entering aaruf_set_geometry(%p, %u, %u, %u)", context, cylinders, heads, sectors_per_track);
233
234 aaruformat_context *ctx = NULL;
235
236 if(context == NULL)
237 {
238 FATAL("Invalid context");
239
240 TRACE("Exiting aaruf_set_geometry() = AARUF_ERROR_NOT_AARUFORMAT");
242 }
243
244 ctx = context;
245
246 // Not a libaaruformat context
247 if(ctx->magic != AARU_MAGIC)
248 {
249 FATAL("Invalid context");
250
251 TRACE("Exiting aaruf_set_geometry() = AARUF_ERROR_NOT_AARUFORMAT");
253 }
254
255 // Check we are writing
256 if(!ctx->is_writing)
257 {
258 FATAL("Trying to write a read-only image");
259
260 TRACE("Exiting aaruf_write_sector() = AARUF_READ_ONLY");
261 return AARUF_READ_ONLY;
262 }
263
265 ctx->geometry_block.cylinders = cylinders;
266 ctx->geometry_block.heads = heads;
267 ctx->geometry_block.sectorsPerTrack = sectors_per_track;
268 ctx->cylinders = cylinders;
269 ctx->heads = heads;
270 ctx->sectors_per_track = sectors_per_track;
271
272 TRACE("Exiting aaruf_set_geometry(%p, %u, %u, %u) = AARUF_STATUS_OK", context, cylinders, heads, sectors_per_track);
273 return AARUF_STATUS_OK;
274}
275
363int32_t aaruf_set_media_sequence(void *context, const int32_t sequence, const int32_t last_sequence)
364{
365 TRACE("Entering aaruf_set_media_sequence(%p, %d, %d)", context, sequence, last_sequence);
366
367 // Check context is correct AaruFormat context
368 if(context == NULL)
369 {
370 FATAL("Invalid context");
371
372 TRACE("Exiting aaruf_set_media_sequence() = AARUF_ERROR_NOT_AARUFORMAT");
374 }
375
376 aaruformat_context *ctx = context;
377
378 // Not a libaaruformat context
379 if(ctx->magic != AARU_MAGIC)
380 {
381 FATAL("Invalid context");
382
383 TRACE("Exiting aaruf_set_media_sequence() = AARUF_ERROR_NOT_AARUFORMAT");
385 }
386
387 // Check we are writing
388 if(!ctx->is_writing)
389 {
390 FATAL("Trying to write a read-only image");
391
392 TRACE("Exiting aaruf_set_media_sequence() = AARUF_READ_ONLY");
393 return AARUF_READ_ONLY;
394 }
395
396 // Initialize
398
399 ctx->metadata_block_header.mediaSequence = sequence;
400 ctx->metadata_block_header.lastMediaSequence = last_sequence;
401
402 TRACE("Exiting aaruf_set_media_sequence(%p, %d, %d) = AARUF_STATUS_OK", context, sequence, last_sequence);
403 return AARUF_STATUS_OK;
404}
405
493int32_t aaruf_set_creator(void *context, const uint8_t *data, const int32_t length)
494{
495 TRACE("Entering aaruf_set_creator(%p, %p, %d)", context, data, length);
496
497 // Check context is correct AaruFormat context
498 if(context == NULL)
499 {
500 FATAL("Invalid context");
501
502 TRACE("Exiting aaruf_set_creator() = AARUF_ERROR_NOT_AARUFORMAT");
504 }
505
506 aaruformat_context *ctx = context;
507
508 // Not a libaaruformat context
509 if(ctx->magic != AARU_MAGIC)
510 {
511 FATAL("Invalid context");
512
513 TRACE("Exiting aaruf_set_creator() = AARUF_ERROR_NOT_AARUFORMAT");
515 }
516
517 // Check we are writing
518 if(!ctx->is_writing)
519 {
520 FATAL("Trying to write a read-only image");
521
522 TRACE("Exiting aaruf_set_creator() = AARUF_READ_ONLY");
523 return AARUF_READ_ONLY;
524 }
525
526 // Initialize
528
529 // Reserve memory
530 uint8_t *copy = malloc(length);
531 if(copy == NULL)
532 {
533 FATAL("Could not allocate memory for creator");
535 }
536
537 // Copy opaque UTF-16LE string
538 memcpy(copy, data, length);
539 if(ctx->creator != NULL) free(ctx->creator);
540 ctx->creator = copy;
542
543 TRACE("Exiting aaruf_set_creator(%p, %p, %d) = AARUF_STATUS_OK", context, data, length);
544 return AARUF_STATUS_OK;
545}
546
607int32_t aaruf_set_comments(void *context, const uint8_t *data, const int32_t length)
608{
609 TRACE("Entering aaruf_set_comments(%p, %p, %d)", context, data, length);
610
611 // Check context is correct AaruFormat context
612 if(context == NULL)
613 {
614 FATAL("Invalid context");
615
616 TRACE("Exiting aaruf_set_comments() = AARUF_ERROR_NOT_AARUFORMAT");
618 }
619
620 aaruformat_context *ctx = context;
621
622 // Not a libaaruformat context
623 if(ctx->magic != AARU_MAGIC)
624 {
625 FATAL("Invalid context");
626
627 TRACE("Exiting aaruf_set_comments() = AARUF_ERROR_NOT_AARUFORMAT");
629 }
630
631 // Check we are writing
632 if(!ctx->is_writing)
633 {
634 FATAL("Trying to write a read-only image");
635
636 TRACE("Exiting aaruf_set_comments() = AARUF_READ_ONLY");
637 return AARUF_READ_ONLY;
638 }
639
640 // Initialize
642
643 // Reserve memory
644 uint8_t *copy = malloc(length);
645 if(copy == NULL)
646 {
647 FATAL("Could not allocate memory for comments");
649 }
650
651 // Copy opaque UTF-16LE string
652 memcpy(copy, data, length);
653 if(ctx->comments != NULL) free(ctx->comments);
654 ctx->comments = copy;
656
657 TRACE("Exiting aaruf_set_comments(%p, %p, %d) = AARUF_STATUS_OK", context, data, length);
658 return AARUF_STATUS_OK;
659}
660
720int32_t aaruf_set_media_title(void *context, const uint8_t *data, const int32_t length)
721{
722 TRACE("Entering aaruf_set_media_title(%p, %p, %d)", context, data, length);
723
724 // Check context is correct AaruFormat context
725 if(context == NULL)
726 {
727 FATAL("Invalid context");
728
729 TRACE("Exiting aaruf_set_media_title() = AARUF_ERROR_NOT_AARUFORMAT");
731 }
732
733 aaruformat_context *ctx = context;
734
735 // Not a libaaruformat context
736 if(ctx->magic != AARU_MAGIC)
737 {
738 FATAL("Invalid context");
739
740 TRACE("Exiting aaruf_set_media_title() = AARUF_ERROR_NOT_AARUFORMAT");
742 }
743
744 // Check we are writing
745 if(!ctx->is_writing)
746 {
747 FATAL("Trying to write a read-only image");
748
749 TRACE("Exiting aaruf_set_media_title() = AARUF_READ_ONLY");
750 return AARUF_READ_ONLY;
751 }
752
753 // Initialize
755
756 // Reserve memory
757 uint8_t *copy = malloc(length);
758 if(copy == NULL)
759 {
760 FATAL("Could not allocate memory for media title");
762 }
763
764 // Copy opaque UTF-16LE string
765 memcpy(copy, data, length);
766 if(ctx->media_title != NULL) free(ctx->media_title);
767 ctx->media_title = copy;
769
770 TRACE("Exiting aaruf_set_media_title(%p, %p, %d) = AARUF_STATUS_OK", context, data, length);
771 return AARUF_STATUS_OK;
772}
773
832int32_t aaruf_set_media_manufacturer(void *context, const uint8_t *data, const int32_t length)
833{
834 TRACE("Entering aaruf_set_media_manufacturer(%p, %p, %d)", context, data, length);
835
836 // Check context is correct AaruFormat context
837 if(context == NULL)
838 {
839 FATAL("Invalid context");
840
841 TRACE("Exiting aaruf_set_media_manufacturer() = AARUF_ERROR_NOT_AARUFORMAT");
843 }
844
845 aaruformat_context *ctx = context;
846
847 // Not a libaaruformat context
848 if(ctx->magic != AARU_MAGIC)
849 {
850 FATAL("Invalid context");
851
852 TRACE("Exiting aaruf_set_media_manufacturer() = AARUF_ERROR_NOT_AARUFORMAT");
854 }
855
856 // Check we are writing
857 if(!ctx->is_writing)
858 {
859 FATAL("Trying to write a read-only image");
860
861 TRACE("Exiting aaruf_set_media_manufacturer() = AARUF_READ_ONLY");
862 return AARUF_READ_ONLY;
863 }
864
865 // Initialize
867
868 // Reserve memory
869 uint8_t *copy = malloc(length);
870 if(copy == NULL)
871 {
872 FATAL("Could not allocate memory for media manufacturer");
874 }
875
876 // Copy opaque UTF-16LE string
877 memcpy(copy, data, length);
878 if(ctx->media_manufacturer != NULL) free(ctx->media_manufacturer);
879 ctx->media_manufacturer = copy;
881
882 TRACE("Exiting aaruf_set_media_manufacturer(%p, %p, %d) = AARUF_STATUS_OK", context, data, length);
883 return AARUF_STATUS_OK;
884}
885
939int32_t aaruf_set_media_model(void *context, const uint8_t *data, const int32_t length)
940{
941 TRACE("Entering aaruf_set_media_model(%p, %p, %d)", context, data, length);
942
943 // Check context is correct AaruFormat context
944 if(context == NULL)
945 {
946 FATAL("Invalid context");
947
948 TRACE("Exiting aaruf_set_media_model() = AARUF_ERROR_NOT_AARUFORMAT");
950 }
951
952 aaruformat_context *ctx = context;
953
954 // Not a libaaruformat context
955 if(ctx->magic != AARU_MAGIC)
956 {
957 FATAL("Invalid context");
958
959 TRACE("Exiting aaruf_set_media_model() = AARUF_ERROR_NOT_AARUFORMAT");
961 }
962
963 // Check we are writing
964 if(!ctx->is_writing)
965 {
966 FATAL("Trying to write a read-only image");
967
968 TRACE("Exiting aaruf_set_media_model() = AARUF_READ_ONLY");
969 return AARUF_READ_ONLY;
970 }
971
972 // Initialize
974
975 // Reserve memory
976 uint8_t *copy = malloc(length);
977 if(copy == NULL)
978 {
979 FATAL("Could not allocate memory for media model");
981 }
982
983 // Copy opaque UTF-16LE string
984 memcpy(copy, data, length);
985 if(ctx->media_model != NULL) free(ctx->media_model);
986 ctx->media_model = copy;
988
989 TRACE("Exiting aaruf_set_media_model(%p, %p, %d) = AARUF_STATUS_OK", context, data, length);
990 return AARUF_STATUS_OK;
991}
992
1054int32_t aaruf_set_media_serial_number(void *context, const uint8_t *data, const int32_t length)
1055{
1056 TRACE("Entering aaruf_set_media_serial_number(%p, %p, %d)", context, data, length);
1057
1058 // Check context is correct AaruFormat context
1059 if(context == NULL)
1060 {
1061 FATAL("Invalid context");
1062
1063 TRACE("Exiting aaruf_set_media_serial_number() = AARUF_ERROR_NOT_AARUFORMAT");
1065 }
1066
1067 aaruformat_context *ctx = context;
1068
1069 // Not a libaaruformat context
1070 if(ctx->magic != AARU_MAGIC)
1071 {
1072 FATAL("Invalid context");
1073
1074 TRACE("Exiting aaruf_set_media_serial_number() = AARUF_ERROR_NOT_AARUFORMAT");
1076 }
1077
1078 // Check we are writing
1079 if(!ctx->is_writing)
1080 {
1081 FATAL("Trying to write a read-only image");
1082
1083 TRACE("Exiting aaruf_set_media_serial_number() = AARUF_READ_ONLY");
1084 return AARUF_READ_ONLY;
1085 }
1086
1087 // Initialize
1089
1090 // Reserve memory
1091 uint8_t *copy = malloc(length);
1092 if(copy == NULL)
1093 {
1094 FATAL("Could not allocate memory for media serial number");
1096 }
1097
1098 // Copy opaque UTF-16LE string
1099 memcpy(copy, data, length);
1100 if(ctx->media_serial_number != NULL) free(ctx->media_serial_number);
1101 ctx->media_serial_number = copy;
1103
1104 TRACE("Exiting aaruf_set_media_serial_number(%p, %p, %d) = AARUF_STATUS_OK", context, data, length);
1105 return AARUF_STATUS_OK;
1106}
1107
1176int32_t aaruf_set_media_barcode(void *context, const uint8_t *data, const int32_t length)
1177{
1178 TRACE("Entering aaruf_set_media_barcode(%p, %p, %d)", context, data, length);
1179
1180 // Check context is correct AaruFormat context
1181 if(context == NULL)
1182 {
1183 FATAL("Invalid context");
1184
1185 TRACE("Exiting aaruf_set_media_barcode() = AARUF_ERROR_NOT_AARUFORMAT");
1187 }
1188
1189 aaruformat_context *ctx = context;
1190
1191 // Not a libaaruformat context
1192 if(ctx->magic != AARU_MAGIC)
1193 {
1194 FATAL("Invalid context");
1195
1196 TRACE("Exiting aaruf_set_media_barcode() = AARUF_ERROR_NOT_AARUFORMAT");
1198 }
1199
1200 // Check we are writing
1201 if(!ctx->is_writing)
1202 {
1203 FATAL("Trying to write a read-only image");
1204
1205 TRACE("Exiting aaruf_set_media_barcode() = AARUF_READ_ONLY");
1206 return AARUF_READ_ONLY;
1207 }
1208
1209 // Initialize
1211
1212 // Reserve memory
1213 uint8_t *copy = malloc(length);
1214 if(copy == NULL)
1215 {
1216 FATAL("Could not allocate memory for media barcode");
1218 }
1219
1220 // Copy opaque UTF-16LE string
1221 memcpy(copy, data, length);
1222 if(ctx->media_barcode != NULL) free(ctx->media_barcode);
1223 ctx->media_barcode = copy;
1225
1226 TRACE("Exiting aaruf_set_media_barcode(%p, %p, %d) = AARUF_STATUS_OK", context, data, length);
1227 return AARUF_STATUS_OK;
1228}
1229
1297int32_t aaruf_set_media_part_number(void *context, const uint8_t *data, const int32_t length)
1298{
1299 TRACE("Entering aaruf_set_media_part_number(%p, %p, %d)", context, data, length);
1300
1301 // Check context is correct AaruFormat context
1302 if(context == NULL)
1303 {
1304 FATAL("Invalid context");
1305
1306 TRACE("Exiting aaruf_set_media_part_number() = AARUF_ERROR_NOT_AARUFORMAT");
1308 }
1309
1310 aaruformat_context *ctx = context;
1311
1312 // Not a libaaruformat context
1313 if(ctx->magic != AARU_MAGIC)
1314 {
1315 FATAL("Invalid context");
1316
1317 TRACE("Exiting aaruf_set_media_part_number() = AARUF_ERROR_NOT_AARUFORMAT");
1319 }
1320
1321 // Check we are writing
1322 if(!ctx->is_writing)
1323 {
1324 FATAL("Trying to write a read-only image");
1325
1326 TRACE("Exiting aaruf_set_media_part_number() = AARUF_READ_ONLY");
1327 return AARUF_READ_ONLY;
1328 }
1329
1330 // Initialize
1332
1333 // Reserve memory
1334 uint8_t *copy = malloc(length);
1335 if(copy == NULL)
1336 {
1337 FATAL("Could not allocate memory for creator");
1339 }
1340
1341 // Copy opaque UTF-16LE string
1342 memcpy(copy, data, length);
1343 if(ctx->media_part_number != NULL) free(ctx->media_part_number);
1344 ctx->media_part_number = copy;
1346
1347 TRACE("Exiting aaruf_set_media_part_number(%p, %p, %d) = AARUF_STATUS_OK", context, data, length);
1348 return AARUF_STATUS_OK;
1349}
1350
1412int32_t aaruf_set_drive_manufacturer(void *context, const uint8_t *data, const int32_t length)
1413{
1414 TRACE("Entering aaruf_set_drive_manufacturer(%p, %p, %d)", context, data, length);
1415
1416 // Check context is correct AaruFormat context
1417 if(context == NULL)
1418 {
1419 FATAL("Invalid context");
1420
1421 TRACE("Exiting aaruf_set_drive_manufacturer() = AARUF_ERROR_NOT_AARUFORMAT");
1423 }
1424
1425 aaruformat_context *ctx = context;
1426
1427 // Not a libaaruformat context
1428 if(ctx->magic != AARU_MAGIC)
1429 {
1430 FATAL("Invalid context");
1431
1432 TRACE("Exiting aaruf_set_drive_manufacturer() = AARUF_ERROR_NOT_AARUFORMAT");
1434 }
1435
1436 // Check we are writing
1437 if(!ctx->is_writing)
1438 {
1439 FATAL("Trying to write a read-only image");
1440
1441 TRACE("Exiting aaruf_set_drive_manufacturer() = AARUF_READ_ONLY");
1442 return AARUF_READ_ONLY;
1443 }
1444
1445 // Initialize
1447
1448 // Reserve memory
1449 uint8_t *copy = malloc(length);
1450 if(copy == NULL)
1451 {
1452 FATAL("Could not allocate memory for drive manufacturer");
1454 }
1455
1456 // Copy opaque UTF-16LE string
1457 memcpy(copy, data, length);
1458 if(ctx->drive_manufacturer != NULL) free(ctx->drive_manufacturer);
1459 ctx->drive_manufacturer = copy;
1461
1462 TRACE("Exiting aaruf_set_drive_manufacturer(%p, %p, %d) = AARUF_STATUS_OK", context, data, length);
1463 return AARUF_STATUS_OK;
1464}
1465
1534int32_t aaruf_set_drive_model(void *context, const uint8_t *data, const int32_t length)
1535{
1536 TRACE("Entering aaruf_set_drive_model(%p, %p, %d)", context, data, length);
1537
1538 // Check context is correct AaruFormat context
1539 if(context == NULL)
1540 {
1541 FATAL("Invalid context");
1542
1543 TRACE("Exiting aaruf_set_drive_model() = AARUF_ERROR_NOT_AARUFORMAT");
1545 }
1546
1547 aaruformat_context *ctx = context;
1548
1549 // Not a libaaruformat context
1550 if(ctx->magic != AARU_MAGIC)
1551 {
1552 FATAL("Invalid context");
1553
1554 TRACE("Exiting aaruf_set_drive_model() = AARUF_ERROR_NOT_AARUFORMAT");
1556 }
1557
1558 // Check we are writing
1559 if(!ctx->is_writing)
1560 {
1561 FATAL("Trying to write a read-only image");
1562
1563 TRACE("Exiting aaruf_set_drive_model() = AARUF_READ_ONLY");
1564 return AARUF_READ_ONLY;
1565 }
1566
1567 // Initialize
1569
1570 // Reserve memory
1571 uint8_t *copy = malloc(length);
1572 if(copy == NULL)
1573 {
1574 FATAL("Could not allocate memory for media model");
1576 }
1577
1578 // Copy opaque UTF-16LE string
1579 memcpy(copy, data, length);
1580 if(ctx->drive_model != NULL) free(ctx->drive_model);
1581 ctx->drive_model = copy;
1583
1584 TRACE("Exiting aaruf_set_drive_model(%p, %p, %d) = AARUF_STATUS_OK", context, data, length);
1585 return AARUF_STATUS_OK;
1586}
1587
1658int32_t aaruf_set_drive_serial_number(void *context, const uint8_t *data, const int32_t length)
1659{
1660 TRACE("Entering aaruf_set_drive_serial_number(%p, %p, %d)", context, data, length);
1661
1662 // Check context is correct AaruFormat context
1663 if(context == NULL)
1664 {
1665 FATAL("Invalid context");
1666
1667 TRACE("Exiting aaruf_set_drive_serial_number() = AARUF_ERROR_NOT_AARUFORMAT");
1669 }
1670
1671 aaruformat_context *ctx = context;
1672
1673 // Not a libaaruformat context
1674 if(ctx->magic != AARU_MAGIC)
1675 {
1676 FATAL("Invalid context");
1677
1678 TRACE("Exiting aaruf_set_drive_serial_number() = AARUF_ERROR_NOT_AARUFORMAT");
1680 }
1681
1682 // Check we are writing
1683 if(!ctx->is_writing)
1684 {
1685 FATAL("Trying to write a read-only image");
1686
1687 TRACE("Exiting aaruf_set_drive_serial_number() = AARUF_READ_ONLY");
1688 return AARUF_READ_ONLY;
1689 }
1690
1691 // Initialize
1693
1694 // Reserve memory
1695 uint8_t *copy = malloc(length);
1696 if(copy == NULL)
1697 {
1698 FATAL("Could not allocate memory for drive serial number");
1700 }
1701
1702 // Copy opaque UTF-16LE string
1703 memcpy(copy, data, length);
1704 if(ctx->drive_serial_number != NULL) free(ctx->drive_serial_number);
1705 ctx->drive_serial_number = copy;
1707
1708 TRACE("Exiting aaruf_set_drive_serial_number(%p, %p, %d) = AARUF_STATUS_OK", context, data, length);
1709 return AARUF_STATUS_OK;
1710}
1711
1793int32_t aaruf_set_drive_firmware_revision(void *context, const uint8_t *data, const int32_t length)
1794{
1795 TRACE("Entering aaruf_set_drive_firmware_revision(%p, %p, %d)", context, data, length);
1796
1797 // Check context is correct AaruFormat context
1798 if(context == NULL)
1799 {
1800 FATAL("Invalid context");
1801
1802 TRACE("Exiting aaruf_set_drive_firmware_revision() = AARUF_ERROR_NOT_AARUFORMAT");
1804 }
1805
1806 aaruformat_context *ctx = context;
1807
1808 // Not a libaaruformat context
1809 if(ctx->magic != AARU_MAGIC)
1810 {
1811 FATAL("Invalid context");
1812
1813 TRACE("Exiting aaruf_set_drive_firmware_revision() = AARUF_ERROR_NOT_AARUFORMAT");
1815 }
1816
1817 // Check we are writing
1818 if(!ctx->is_writing)
1819 {
1820 FATAL("Trying to write a read-only image");
1821
1822 TRACE("Exiting aaruf_set_drive_firmware_revision() = AARUF_READ_ONLY");
1823 return AARUF_READ_ONLY;
1824 }
1825
1826 // Initialize
1828
1829 // Reserve memory
1830 uint8_t *copy = malloc(length);
1831 if(copy == NULL)
1832 {
1833 FATAL("Could not allocate memory for creator");
1835 }
1836
1837 // Copy opaque UTF-16LE string
1838 memcpy(copy, data, length);
1839 if(ctx->drive_firmware_revision != NULL) free(ctx->drive_firmware_revision);
1840 ctx->drive_firmware_revision = copy;
1842
1843 TRACE("Exiting aaruf_set_drive_firmware_revision(%p, %p, %d) = AARUF_STATUS_OK", context, data, length);
1844 return AARUF_STATUS_OK;
1845}
1846
1944int32_t aaruf_get_cicm_metadata(const void *context, uint8_t *buffer, size_t *length)
1945{
1946 TRACE("Entering aaruf_get_cicm_metadata(%p, %p, %p)", context, buffer, length);
1947
1948 // Check context is correct AaruFormat context
1949 if(context == NULL)
1950 {
1951 FATAL("Invalid context");
1952
1953 TRACE("Exiting aaruf_get_cicm_metadata() = AARUF_ERROR_NOT_AARUFORMAT");
1955 }
1956
1957 const aaruformat_context *ctx = context;
1958
1959 // Not a libaaruformat context
1960 if(ctx->magic != AARU_MAGIC)
1961 {
1962 FATAL("Invalid context");
1963
1964 TRACE("Exiting aaruf_get_cicm_metadata() = AARUF_ERROR_NOT_AARUFORMAT");
1966 }
1967
1968 if(ctx->cicm_block == NULL || ctx->cicm_block_header.length == 0 || ctx->cicm_block_header.identifier != CicmBlock)
1969 {
1970 TRACE("No CICM XML metadata present");
1971 *length = 0;
1972
1973 TRACE("Exiting aaruf_get_cicm_metadata() = AARUF_ERROR_CANNOT_READ_BLOCK");
1975 }
1976
1977 if(*length < ctx->cicm_block_header.length)
1978 {
1979 TRACE("Buffer too small for CICM XML metadata, required %u bytes", ctx->cicm_block_header.length);
1980 *length = ctx->cicm_block_header.length;
1981
1982 TRACE("Exiting aaruf_get_cicm_metadata() = AARUF_ERROR_BUFFER_TOO_SMALL");
1984 }
1985
1986 *length = ctx->cicm_block_header.length;
1987 memcpy(buffer, ctx->cicm_block, ctx->cicm_block_header.length);
1988
1989 TRACE("CICM XML metadata read successfully, length %u", *length);
1990 TRACE("Exiting aaruf_get_cicm_metadata(%p, %p, %d) = AARUF_STATUS_OK", context, buffer, *length);
1991 return AARUF_STATUS_OK;
1992}
1993
2099int32_t aaruf_get_aaru_json_metadata(const void *context, uint8_t *buffer, size_t *length)
2100{
2101 TRACE("Entering aaruf_get_aaru_json_metadata(%p, %p, %p)", context, buffer, length);
2102
2103 // Check context is correct AaruFormat context
2104 if(context == NULL)
2105 {
2106 FATAL("Invalid context");
2107
2108 TRACE("Exiting aaruf_get_aaru_json_metadata() = AARUF_ERROR_NOT_AARUFORMAT");
2110 }
2111
2112 const aaruformat_context *ctx = context;
2113
2114 // Not a libaaruformat context
2115 if(ctx->magic != AARU_MAGIC)
2116 {
2117 FATAL("Invalid context");
2118
2119 TRACE("Exiting aaruf_get_aaru_json_metadata() = AARUF_ERROR_NOT_AARUFORMAT");
2121 }
2122
2123 if(ctx->json_block == NULL || ctx->json_block_header.length == 0 ||
2125 {
2126 TRACE("No Aaru metadata JSON present");
2127 *length = 0;
2128
2129 TRACE("Exiting aaruf_get_aaru_json_metadata() = AARUF_ERROR_CANNOT_READ_BLOCK");
2131 }
2132
2133 if(*length < ctx->json_block_header.length)
2134 {
2135 TRACE("Buffer too small for Aaru metadata JSON, required %u bytes", ctx->json_block_header.length);
2136 *length = ctx->json_block_header.length;
2137
2138 TRACE("Exiting aaruf_get_aaru_json_metadata() = AARUF_ERROR_BUFFER_TOO_SMALL");
2140 }
2141
2142 *length = ctx->json_block_header.length;
2143 memcpy(buffer, ctx->json_block, ctx->json_block_header.length);
2144
2145 TRACE("Aaru metadata JSON read successfully, length %u", *length);
2146 TRACE("Exiting aaruf_get_aaru_json_metadata(%p, %p, %d) = AARUF_STATUS_OK", context, buffer, *length);
2147 return AARUF_STATUS_OK;
2148}
2149
2258int32_t aaruf_set_aaru_json_metadata(void *context, uint8_t *data, size_t length)
2259{
2260 TRACE("Entering aaruf_set_aaru_json_metadata(%p, %p, %d)", context, data, length);
2261
2262 // Check context is correct AaruFormat context
2263 if(context == NULL)
2264 {
2265 FATAL("Invalid context");
2266
2267 TRACE("Exiting aaruf_set_aaru_json_metadata() = AARUF_ERROR_NOT_AARUFORMAT");
2269 }
2270
2271 aaruformat_context *ctx = context;
2272
2273 // Not a libaaruformat context
2274 if(ctx->magic != AARU_MAGIC)
2275 {
2276 FATAL("Invalid context");
2277
2278 TRACE("Exiting aaruf_set_aaru_json_metadata() = AARUF_ERROR_NOT_AARUFORMAT");
2280 }
2281
2282 // Check we are writing
2283 if(!ctx->is_writing)
2284 {
2285 FATAL("Trying to write a read-only image");
2286
2287 TRACE("Exiting aaruf_set_aaru_json_metadata() = AARUF_READ_ONLY");
2288 return AARUF_READ_ONLY;
2289 }
2290
2291 // Reserve memory
2292 uint8_t *copy = malloc(length);
2293 if(copy == NULL)
2294 {
2295 FATAL("Could not allocate memory for Aaru metadata JSON");
2297 }
2298
2299 // Copy opaque UTF-8 string
2300 memcpy(copy, data, length);
2301 if(ctx->json_block != NULL) free(ctx->json_block);
2302 ctx->json_block = copy;
2304 ctx->json_block_header.length = (uint32_t)length;
2305
2306 TRACE("Exiting aaruf_set_aaru_json_metadata(%p, %p, %d) = AARUF_STATUS_OK", context, data, length);
2307 return AARUF_STATUS_OK;
2308}
2309
2337int32_t aaruf_get_media_sequence(const void *context, int32_t *sequence, int32_t *last_sequence)
2338{
2339 TRACE("Entering aaruf_get_media_sequence(%p, %p, %p)", context, sequence, last_sequence);
2340
2341 // Check context is correct AaruFormat context
2342 if(context == NULL)
2343 {
2344 FATAL("Invalid context");
2345
2346 TRACE("Exiting aaruf_set_media_sequence() = AARUF_ERROR_NOT_AARUFORMAT");
2348 }
2349
2350 const aaruformat_context *ctx = context;
2351
2352 // Not a libaaruformat context
2353 if(ctx->magic != AARU_MAGIC)
2354 {
2355 FATAL("Invalid context");
2356
2357 TRACE("Exiting aaruf_set_media_sequence() = AARUF_ERROR_NOT_AARUFORMAT");
2359 }
2360
2362 {
2363 FATAL("No metadata block present");
2364
2365 TRACE("Exiting aaruf_set_media_sequence() = AARUF_ERROR_METADATA_NOT_PRESENT");
2367 }
2368
2369 *sequence = ctx->metadata_block_header.mediaSequence;
2370 *last_sequence = ctx->metadata_block_header.lastMediaSequence;
2371
2372 TRACE("Exiting aaruf_set_media_sequence(%p, %d, %d) = AARUF_STATUS_OK", context, *sequence, *last_sequence);
2373 return AARUF_STATUS_OK;
2374}
2375
2404int32_t aaruf_get_creator(const void *context, uint8_t *buffer, int32_t *length)
2405{
2406 TRACE("Entering aaruf_get_creator(%p, %p, %p)", context, buffer, length);
2407
2408 // Check context is correct AaruFormat context
2409 if(context == NULL)
2410 {
2411 FATAL("Invalid context");
2412
2413 TRACE("Exiting aaruf_get_creator() = AARUF_ERROR_NOT_AARUFORMAT");
2415 }
2416
2417 const aaruformat_context *ctx = context;
2418
2419 // Not a libaaruformat context
2420 if(ctx->magic != AARU_MAGIC)
2421 {
2422 FATAL("Invalid context");
2423
2424 TRACE("Exiting aaruf_get_creator() = AARUF_ERROR_NOT_AARUFORMAT");
2426 }
2427
2428 if(ctx->metadata_block_header.identifier != MetadataBlock || ctx->creator == NULL ||
2430 {
2431 FATAL("No metadata block present");
2432
2433 TRACE("Exiting aaruf_get_creator() = AARUF_ERROR_METADATA_NOT_PRESENT");
2435 }
2436
2437 if(buffer == NULL || *length < ctx->metadata_block_header.creatorLength)
2438 {
2439 *length = ctx->metadata_block_header.creatorLength;
2440
2441 TRACE("Exiting aaruf_get_creator() = AARUF_ERROR_BUFFER_TOO_SMALL");
2443 }
2444
2445 // Copy opaque UTF-16LE string
2446 memcpy(buffer, ctx->creator, ctx->metadata_block_header.creatorLength);
2447 *length = ctx->metadata_block_header.creatorLength;
2448
2449 TRACE("Exiting aaruf_get_creator(%p, %p, %d) = AARUF_STATUS_OK", context, buffer, *length);
2450 return AARUF_STATUS_OK;
2451}
2452
2476int32_t aaruf_get_comments(const void *context, uint8_t *buffer, int32_t *length)
2477{
2478 TRACE("Entering aaruf_get_comments(%p, %p, %p)", context, buffer, length);
2479
2480 // Check context is correct AaruFormat context
2481 if(context == NULL)
2482 {
2483 FATAL("Invalid context");
2484
2485 TRACE("Exiting aaruf_get_comments() = AARUF_ERROR_NOT_AARUFORMAT");
2487 }
2488
2489 const aaruformat_context *ctx = context;
2490
2491 // Not a libaaruformat context
2492 if(ctx->magic != AARU_MAGIC)
2493 {
2494 FATAL("Invalid context");
2495
2496 TRACE("Exiting aaruf_get_comments() = AARUF_ERROR_NOT_AARUFORMAT");
2498 }
2499
2500 if(ctx->metadata_block_header.identifier != MetadataBlock || ctx->comments == NULL ||
2502 {
2503 FATAL("No metadata block present");
2504
2505 TRACE("Exiting aaruf_get_comments() = AARUF_ERROR_METADATA_NOT_PRESENT");
2507 }
2508
2509 if(buffer == NULL || *length < ctx->metadata_block_header.commentsLength)
2510 {
2512
2513 TRACE("Exiting aaruf_get_comments() = AARUF_ERROR_BUFFER_TOO_SMALL");
2515 }
2516
2517 // Copy opaque UTF-16LE string
2518 memcpy(buffer, ctx->comments, ctx->metadata_block_header.commentsLength);
2520
2521 TRACE("Exiting aaruf_get_comments(%p, %p, %d) = AARUF_STATUS_OK", context, buffer, *length);
2522 return AARUF_STATUS_OK;
2523}
2524
2546int32_t aaruf_get_media_title(const void *context, uint8_t *buffer, int32_t *length)
2547{
2548 TRACE("Entering aaruf_get_media_title(%p, %p, %p)", context, buffer, length);
2549
2550 // Check context is correct AaruFormat context
2551 if(context == NULL)
2552 {
2553 FATAL("Invalid context");
2554
2555 TRACE("Exiting aaruf_get_media_title() = AARUF_ERROR_NOT_AARUFORMAT");
2557 }
2558
2559 const aaruformat_context *ctx = context;
2560
2561 // Not a libaaruformat context
2562 if(ctx->magic != AARU_MAGIC)
2563 {
2564 FATAL("Invalid context");
2565
2566 TRACE("Exiting aaruf_get_media_title() = AARUF_ERROR_NOT_AARUFORMAT");
2568 }
2569
2570 if(ctx->metadata_block_header.identifier != MetadataBlock || ctx->media_title == NULL ||
2572 {
2573 FATAL("No metadata block present");
2574
2575 TRACE("Exiting aaruf_get_media_title() = AARUF_ERROR_METADATA_NOT_PRESENT");
2577 }
2578
2579 if(buffer == NULL || *length < ctx->metadata_block_header.mediaTitleLength)
2580 {
2582
2583 TRACE("Exiting aaruf_get_media_title() = AARUF_ERROR_BUFFER_TOO_SMALL");
2585 }
2586
2587 // Copy opaque UTF-16LE string
2588 memcpy(buffer, ctx->media_title, ctx->metadata_block_header.mediaTitleLength);
2590
2591 TRACE("Exiting aaruf_get_media_title(%p, %p, %d) = AARUF_STATUS_OK", context, buffer, *length);
2592 return AARUF_STATUS_OK;
2593}
2594
2616int32_t aaruf_get_media_manufacturer(const void *context, uint8_t *buffer, int32_t *length)
2617{
2618 TRACE("Entering aaruf_get_media_manufacturer(%p, %p, %p)", context, buffer, length);
2619
2620 // Check context is correct AaruFormat context
2621 if(context == NULL)
2622 {
2623 FATAL("Invalid context");
2624
2625 TRACE("Exiting aaruf_get_media_manufacturer() = AARUF_ERROR_NOT_AARUFORMAT");
2627 }
2628
2629 const aaruformat_context *ctx = context;
2630
2631 // Not a libaaruformat context
2632 if(ctx->magic != AARU_MAGIC)
2633 {
2634 FATAL("Invalid context");
2635
2636 TRACE("Exiting aaruf_get_media_manufacturer() = AARUF_ERROR_NOT_AARUFORMAT");
2638 }
2639
2642 {
2643 FATAL("No metadata block present");
2644
2645 TRACE("Exiting aaruf_get_media_manufacturer() = AARUF_ERROR_METADATA_NOT_PRESENT");
2647 }
2648
2649 if(buffer == NULL || *length < ctx->metadata_block_header.mediaManufacturerLength)
2650 {
2652
2653 TRACE("Exiting aaruf_get_media_manufacturer() = AARUF_ERROR_BUFFER_TOO_SMALL");
2655 }
2656
2657 // Copy opaque UTF-16LE string
2660
2661 TRACE("Exiting aaruf_get_media_manufacturer(%p, %p, %d) = AARUF_STATUS_OK", context, buffer, *length);
2662 return AARUF_STATUS_OK;
2663}
2664
2686int32_t aaruf_get_media_model(const void *context, uint8_t *buffer, int32_t *length)
2687{
2688 TRACE("Entering aaruf_get_media_model(%p, %p, %p)", context, buffer, length);
2689
2690 // Check context is correct AaruFormat context
2691 if(context == NULL)
2692 {
2693 FATAL("Invalid context");
2694
2695 TRACE("Exiting aaruf_get_media_model() = AARUF_ERROR_NOT_AARUFORMAT");
2697 }
2698
2699 const aaruformat_context *ctx = context;
2700
2701 // Not a libaaruformat context
2702 if(ctx->magic != AARU_MAGIC)
2703 {
2704 FATAL("Invalid context");
2705
2706 TRACE("Exiting aaruf_get_media_model() = AARUF_ERROR_NOT_AARUFORMAT");
2708 }
2709
2710 if(ctx->metadata_block_header.identifier != MetadataBlock || ctx->media_model == NULL ||
2712 {
2713 FATAL("No metadata block present");
2714
2715 TRACE("Exiting aaruf_get_media_model() = AARUF_ERROR_METADATA_NOT_PRESENT");
2717 }
2718
2719 if(buffer == NULL || *length < ctx->metadata_block_header.mediaModelLength)
2720 {
2722
2723 TRACE("Exiting aaruf_get_media_model() = AARUF_ERROR_BUFFER_TOO_SMALL");
2725 }
2726
2727 // Copy opaque UTF-16LE string
2728 memcpy(buffer, ctx->media_model, ctx->metadata_block_header.mediaModelLength);
2730
2731 TRACE("Exiting aaruf_get_media_model(%p, %p, %d) = AARUF_STATUS_OK", context, buffer, *length);
2732 return AARUF_STATUS_OK;
2733}
2734
2756int32_t aaruf_get_media_serial_number(const void *context, uint8_t *buffer, int32_t *length)
2757{
2758 TRACE("Entering aaruf_get_media_serial_number(%p, %p, %p)", context, buffer, length);
2759
2760 // Check context is correct AaruFormat context
2761 if(context == NULL)
2762 {
2763 FATAL("Invalid context");
2764
2765 TRACE("Exiting aaruf_get_media_serial_number() = AARUF_ERROR_NOT_AARUFORMAT");
2767 }
2768
2769 const aaruformat_context *ctx = context;
2770
2771 // Not a libaaruformat context
2772 if(ctx->magic != AARU_MAGIC)
2773 {
2774 FATAL("Invalid context");
2775
2776 TRACE("Exiting aaruf_get_media_serial_number() = AARUF_ERROR_NOT_AARUFORMAT");
2778 }
2779
2782 {
2783 FATAL("No metadata block present");
2784
2785 TRACE("Exiting aaruf_get_media_serial_number() = AARUF_ERROR_METADATA_NOT_PRESENT");
2787 }
2788
2789 if(buffer == NULL || *length < ctx->metadata_block_header.mediaSerialNumberLength)
2790 {
2792
2793 TRACE("Exiting aaruf_get_media_serial_number() = AARUF_ERROR_BUFFER_TOO_SMALL");
2795 }
2796
2797 // Copy opaque UTF-16LE string
2800
2801 TRACE("Exiting aaruf_get_media_serial_number(%p, %p, %d) = AARUF_STATUS_OK", context, buffer, *length);
2802 return AARUF_STATUS_OK;
2803}
2804
2825int32_t aaruf_get_media_barcode(const void *context, uint8_t *buffer, int32_t *length)
2826{
2827 TRACE("Entering aaruf_get_media_barcode(%p, %p, %p)", context, buffer, length);
2828
2829 // Check context is correct AaruFormat context
2830 if(context == NULL)
2831 {
2832 FATAL("Invalid context");
2833
2834 TRACE("Exiting aaruf_get_media_barcode() = AARUF_ERROR_NOT_AARUFORMAT");
2836 }
2837
2838 const aaruformat_context *ctx = context;
2839
2840 // Not a libaaruformat context
2841 if(ctx->magic != AARU_MAGIC)
2842 {
2843 FATAL("Invalid context");
2844
2845 TRACE("Exiting aaruf_get_media_barcode() = AARUF_ERROR_NOT_AARUFORMAT");
2847 }
2848
2849 if(ctx->metadata_block_header.identifier != MetadataBlock || ctx->media_barcode == NULL ||
2851 {
2852 FATAL("No metadata block present");
2853
2854 TRACE("Exiting aaruf_get_media_barcode() = AARUF_ERROR_METADATA_NOT_PRESENT");
2856 }
2857
2858 if(buffer == NULL || *length < ctx->metadata_block_header.mediaBarcodeLength)
2859 {
2861
2862 TRACE("Exiting aaruf_get_media_barcode() = AARUF_ERROR_BUFFER_TOO_SMALL");
2864 }
2865
2866 // Copy opaque UTF-16LE string
2867 memcpy(buffer, ctx->media_barcode, ctx->metadata_block_header.mediaBarcodeLength);
2869
2870 TRACE("Exiting aaruf_get_media_barcode(%p, %p, %d) = AARUF_STATUS_OK", context, buffer, *length);
2871 return AARUF_STATUS_OK;
2872}
2873
2896int32_t aaruf_get_media_part_number(const void *context, uint8_t *buffer, int32_t *length)
2897{
2898 TRACE("Entering aaruf_get_media_part_number(%p, %p, %p)", context, buffer, length);
2899
2900 // Check context is correct AaruFormat context
2901 if(context == NULL)
2902 {
2903 FATAL("Invalid context");
2904
2905 TRACE("Exiting aaruf_get_media_part_number() = AARUF_ERROR_NOT_AARUFORMAT");
2907 }
2908
2909 const aaruformat_context *ctx = context;
2910
2911 // Not a libaaruformat context
2912 if(ctx->magic != AARU_MAGIC)
2913 {
2914 FATAL("Invalid context");
2915
2916 TRACE("Exiting aaruf_get_media_part_number() = AARUF_ERROR_NOT_AARUFORMAT");
2918 }
2919
2922 {
2923 FATAL("No metadata block present");
2924
2925 TRACE("Exiting aaruf_get_media_part_number() = AARUF_ERROR_METADATA_NOT_PRESENT");
2927 }
2928
2929 if(buffer == NULL || *length < ctx->metadata_block_header.mediaPartNumberLength)
2930 {
2932
2933 TRACE("Exiting aaruf_get_media_part_number() = AARUF_ERROR_BUFFER_TOO_SMALL");
2935 }
2936
2937 // Copy opaque UTF-16LE string
2940
2941 TRACE("Exiting aaruf_get_media_part_number(%p, %p, %d) = AARUF_STATUS_OK", context, buffer, *length);
2942 return AARUF_STATUS_OK;
2943}
2944
2968int32_t aaruf_get_drive_manufacturer(const void *context, uint8_t *buffer, int32_t *length)
2969{
2970 TRACE("Entering aaruf_get_drive_manufacturer(%p, %p, %p)", context, buffer, length);
2971
2972 // Check context is correct AaruFormat context
2973 if(context == NULL)
2974 {
2975 FATAL("Invalid context");
2976
2977 TRACE("Exiting aaruf_get_drive_manufacturer() = AARUF_ERROR_NOT_AARUFORMAT");
2979 }
2980
2981 const aaruformat_context *ctx = context;
2982
2983 // Not a libaaruformat context
2984 if(ctx->magic != AARU_MAGIC)
2985 {
2986 FATAL("Invalid context");
2987
2988 TRACE("Exiting aaruf_get_drive_manufacturer() = AARUF_ERROR_NOT_AARUFORMAT");
2990 }
2991
2994 {
2995 FATAL("No metadata block present");
2996
2997 TRACE("Exiting aaruf_get_drive_manufacturer() = AARUF_ERROR_METADATA_NOT_PRESENT");
2999 }
3000
3001 if(buffer == NULL || *length < ctx->metadata_block_header.driveManufacturerLength)
3002 {
3004
3005 TRACE("Exiting aaruf_get_drive_manufacturer() = AARUF_ERROR_BUFFER_TOO_SMALL");
3007 }
3008
3009 // Copy opaque UTF-16LE string
3012
3013 TRACE("Exiting aaruf_get_drive_manufacturer(%p, %p, %d) = AARUF_STATUS_OK", context, buffer, *length);
3014 return AARUF_STATUS_OK;
3015}
3016
3038int32_t aaruf_get_drive_model(const void *context, uint8_t *buffer, int32_t *length)
3039{
3040 TRACE("Entering aaruf_get_drive_model(%p, %p, %p)", context, buffer, length);
3041
3042 // Check context is correct AaruFormat context
3043 if(context == NULL)
3044 {
3045 FATAL("Invalid context");
3046
3047 TRACE("Exiting aaruf_get_drive_model() = AARUF_ERROR_NOT_AARUFORMAT");
3049 }
3050
3051 const aaruformat_context *ctx = context;
3052
3053 // Not a libaaruformat context
3054 if(ctx->magic != AARU_MAGIC)
3055 {
3056 FATAL("Invalid context");
3057
3058 TRACE("Exiting aaruf_get_drive_model() = AARUF_ERROR_NOT_AARUFORMAT");
3060 }
3061
3062 if(ctx->metadata_block_header.identifier != MetadataBlock || ctx->drive_model == NULL ||
3064 {
3065 FATAL("No metadata block present");
3066
3067 TRACE("Exiting aaruf_get_drive_model() = AARUF_ERROR_METADATA_NOT_PRESENT");
3069 }
3070
3071 if(buffer == NULL || *length < ctx->metadata_block_header.driveModelLength)
3072 {
3074
3075 TRACE("Exiting aaruf_get_drive_model() = AARUF_ERROR_BUFFER_TOO_SMALL");
3077 }
3078
3079 // Copy opaque UTF-16LE string
3080 memcpy(buffer, ctx->drive_model, ctx->metadata_block_header.driveModelLength);
3082
3083 TRACE("Exiting aaruf_get_drive_model(%p, %p, %d) = AARUF_STATUS_OK", context, buffer, *length);
3084 return AARUF_STATUS_OK;
3085}
3086
3108int32_t aaruf_get_drive_serial_number(const void *context, uint8_t *buffer, int32_t *length)
3109{
3110 TRACE("Entering aaruf_get_drive_serial_number(%p, %p, %p)", context, buffer, length);
3111
3112 // Check context is correct AaruFormat context
3113 if(context == NULL)
3114 {
3115 FATAL("Invalid context");
3116
3117 TRACE("Exiting aaruf_get_drive_serial_number() = AARUF_ERROR_NOT_AARUFORMAT");
3119 }
3120
3121 const aaruformat_context *ctx = context;
3122
3123 // Not a libaaruformat context
3124 if(ctx->magic != AARU_MAGIC)
3125 {
3126 FATAL("Invalid context");
3127
3128 TRACE("Exiting aaruf_get_drive_serial_number() = AARUF_ERROR_NOT_AARUFORMAT");
3130 }
3131
3134 {
3135 FATAL("No metadata block present");
3136
3137 TRACE("Exiting aaruf_get_drive_serial_number() = AARUF_ERROR_METADATA_NOT_PRESENT");
3139 }
3140
3141 if(buffer == NULL || *length < ctx->metadata_block_header.driveSerialNumberLength)
3142 {
3144
3145 TRACE("Exiting aaruf_get_drive_serial_number() = AARUF_ERROR_BUFFER_TOO_SMALL");
3147 }
3148
3149 // Copy opaque UTF-16LE string
3152
3153 TRACE("Exiting aaruf_get_drive_serial_number(%p, %p, %d) = AARUF_STATUS_OK", context, buffer, *length);
3154 return AARUF_STATUS_OK;
3155}
3156
3178int32_t aaruf_get_drive_firmware_revision(const void *context, uint8_t *buffer, int32_t *length)
3179{
3180 TRACE("Entering aaruf_get_drive_firmware_revision(%p, %p, %p)", context, buffer, length);
3181
3182 // Check context is correct AaruFormat context
3183 if(context == NULL)
3184 {
3185 FATAL("Invalid context");
3186
3187 TRACE("Exiting aaruf_get_drive_firmware_revision() = AARUF_ERROR_NOT_AARUFORMAT");
3189 }
3190
3191 const aaruformat_context *ctx = context;
3192
3193 // Not a libaaruformat context
3194 if(ctx->magic != AARU_MAGIC)
3195 {
3196 FATAL("Invalid context");
3197
3198 TRACE("Exiting aaruf_get_drive_firmware_revision() = AARUF_ERROR_NOT_AARUFORMAT");
3200 }
3201
3204 {
3205 FATAL("No metadata block present");
3206
3207 TRACE("Exiting aaruf_get_drive_firmware_revision() = AARUF_ERROR_METADATA_NOT_PRESENT");
3209 }
3210
3211 if(buffer == NULL || *length < ctx->metadata_block_header.driveFirmwareRevisionLength)
3212 {
3214
3215 TRACE("Exiting aaruf_get_drive_firmware_revision() = AARUF_ERROR_BUFFER_TOO_SMALL");
3217 }
3218
3219 // Copy opaque UTF-16LE string
3222
3223 TRACE("Exiting aaruf_get_drive_firmware_revision(%p, %p, %d) = AARUF_STATUS_OK", context, buffer, *length);
3224 return AARUF_STATUS_OK;
3225}
3226
3292int32_t aaruf_get_user_sectors(const void *context, uint64_t *sectors)
3293{
3294 TRACE("Entering aaruf_get_user_sectors(%p, %p)", context, sectors);
3295
3296 // Check context is correct AaruFormat context
3297 if(context == NULL)
3298 {
3299 FATAL("Invalid context");
3300
3301 TRACE("Exiting aaruf_get_user_sectors() = AARUF_ERROR_NOT_AARUFORMAT");
3303 }
3304
3305 const aaruformat_context *ctx = context;
3306
3307 // Not a libaaruformat context
3308 if(ctx->magic != AARU_MAGIC)
3309 {
3310 FATAL("Invalid context");
3311
3312 TRACE("Exiting aaruf_get_user_sectors() = AARUF_ERROR_NOT_AARUFORMAT");
3314 }
3315
3316 *sectors = ctx->user_data_ddt_header.blocks;
3317
3318 TRACE("Exiting aaruf_get_user_sectors(%p, %llu) = AARUF_STATUS_OK", context, *sectors);
3319 return AARUF_STATUS_OK;
3320}
3321
3417int32_t aaruf_get_negative_sectors(const void *context, uint16_t *sectors)
3418{
3419 TRACE("Entering aaruf_get_negative_sectors(%p, %p)", context, sectors);
3420
3421 // Check context is correct AaruFormat context
3422 if(context == NULL)
3423 {
3424 FATAL("Invalid context");
3425
3426 TRACE("Exiting aaruf_get_negative_sectors() = AARUF_ERROR_NOT_AARUFORMAT");
3428 }
3429
3430 const aaruformat_context *ctx = context;
3431
3432 // Not a libaaruformat context
3433 if(ctx->magic != AARU_MAGIC)
3434 {
3435 FATAL("Invalid context");
3436
3437 TRACE("Exiting aaruf_get_negative_sectors() = AARUF_ERROR_NOT_AARUFORMAT");
3439 }
3440
3441 *sectors = ctx->user_data_ddt_header.negative;
3442
3443 TRACE("Exiting aaruf_get_negative_sectors(%p, %u) = AARUF_STATUS_OK", context, *sectors);
3444 return AARUF_STATUS_OK;
3445}
3446
3552int32_t aaruf_get_overflow_sectors(const void *context, uint16_t *sectors)
3553{
3554 TRACE("Entering aaruf_get_overflow_sectors(%p, %p)", context, sectors);
3555
3556 // Check context is correct AaruFormat context
3557 if(context == NULL)
3558 {
3559 FATAL("Invalid context");
3560
3561 TRACE("Exiting aaruf_get_overflow_sectors() = AARUF_ERROR_NOT_AARUFORMAT");
3563 }
3564
3565 const aaruformat_context *ctx = context;
3566
3567 // Not a libaaruformat context
3568 if(ctx->magic != AARU_MAGIC)
3569 {
3570 FATAL("Invalid context");
3571
3572 TRACE("Exiting aaruf_get_overflow_sectors() = AARUF_ERROR_NOT_AARUFORMAT");
3574 }
3575
3576 *sectors = ctx->user_data_ddt_header.overflow;
3577
3578 TRACE("Exiting aaruf_get_overflow_sectors(%p, %u) = AARUF_STATUS_OK", context, *sectors);
3579 return AARUF_STATUS_OK;
3580}
3581
3634int32_t aaruf_get_image_info(const void *context, ImageInfo *image_info)
3635{
3636 TRACE("Entering aaruf_get_image_info(%p, %p)", context, image_info);
3637
3638 // Check context is correct AaruFormat context
3639 if(context == NULL)
3640 {
3641 FATAL("Invalid context");
3642
3643 TRACE("Exiting aaruf_get_image_info() = AARUF_ERROR_NOT_AARUFORMAT");
3645 }
3646
3647 const aaruformat_context *ctx = context;
3648
3649 // Not a libaaruformat context
3650 if(ctx->magic != AARU_MAGIC)
3651 {
3652 FATAL("Invalid context");
3653
3654 TRACE("Exiting aaruf_get_image_info() = AARUF_ERROR_NOT_AARUFORMAT");
3656 }
3657
3658 if(image_info == NULL)
3659 {
3660 FATAL("image_info parameter is NULL");
3661
3662 TRACE("Exiting aaruf_get_image_info() = AARUF_ERROR_INCORRECT_DATA_SIZE");
3664 }
3665
3666 // Perform deep copy of the image_info structure
3667 memcpy(image_info, &ctx->image_info, sizeof(ImageInfo));
3668
3669 TRACE("Exiting aaruf_get_image_info() = AARUF_STATUS_OK");
3670 return AARUF_STATUS_OK;
3671}
#define AARU_MAGIC
Magic identifier for AaruFormat container (ASCII "AARUFRMT").
Definition consts.h:64
@ GeometryBlock
Block containing logical geometry.
Definition enums.h:148
@ AaruMetadataJsonBlock
Block containing JSON version of Aaru Metadata.
Definition enums.h:159
@ CicmBlock
Block containing CICM XML metadata.
Definition enums.h:151
@ MetadataBlock
Block containing metadata.
Definition enums.h:149
#define AARUF_STATUS_OK
Sector present and read without uncorrectable errors.
Definition errors.h:75
#define AARUF_READ_ONLY
Operation requires write mode but context is read-only.
Definition errors.h:61
#define AARUF_ERROR_NOT_ENOUGH_MEMORY
Memory allocation failure (critical).
Definition errors.h:48
#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:2099
int32_t aaruf_set_media_barcode(void *context, const uint8_t *data, const int32_t length)
Sets the media barcode information for the image.
Definition metadata.c:1176
int32_t aaruf_set_media_model(void *context, const uint8_t *data, const int32_t length)
Sets the media model or product designation for the image.
Definition metadata.c:939
int32_t aaruf_set_media_sequence(void *context, const int32_t sequence, const int32_t last_sequence)
Sets the media sequence information for multi-volume media sets.
Definition metadata.c:363
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:3108
int32_t aaruf_set_drive_manufacturer(void *context, const uint8_t *data, const int32_t length)
Sets the drive manufacturer information for the image.
Definition metadata.c:1412
int32_t aaruf_set_drive_model(void *context, const uint8_t *data, const int32_t length)
Sets the drive model information for the image.
Definition metadata.c:1534
int32_t aaruf_set_media_title(void *context, const uint8_t *data, const int32_t length)
Sets the media title or label for the image.
Definition metadata.c:720
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:2404
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:3178
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:1944
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:2756
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:2896
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:2686
int32_t aaruf_get_media_manufacturer(const void *context, uint8_t *buffer, int32_t *length)
Retrieves the recorded media manufacturer name.
Definition metadata.c:2616
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:3038
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:2825
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:2968
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:3634
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:3292
int32_t aaruf_set_aaru_json_metadata(void *context, uint8_t *data, size_t length)
Sets the Aaru metadata JSON for the image during creation.
Definition metadata.c:2258
int32_t aaruf_get_negative_sectors(const void *context, uint16_t *sectors)
Retrieves the number of negative (pre-gap) sectors in the AaruFormat image.
Definition metadata.c:3417
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:2476
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:2337
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:94
int32_t aaruf_set_media_part_number(void *context, const uint8_t *data, const int32_t length)
Sets the media part number or model designation for the image.
Definition metadata.c:1297
int32_t aaruf_set_media_serial_number(void *context, const uint8_t *data, const int32_t length)
Sets the media serial number for the image.
Definition metadata.c:1054
int32_t aaruf_set_geometry(void *context, const uint32_t cylinders, const uint32_t heads, const uint32_t sectors_per_track)
Sets the logical CHS geometry for the AaruFormat image.
Definition metadata.c:229
int32_t aaruf_set_comments(void *context, const uint8_t *data, const int32_t length)
Sets user comments or notes for the image.
Definition metadata.c:607
int32_t aaruf_set_drive_firmware_revision(void *context, const uint8_t *data, const int32_t length)
Sets the drive firmware revision for the image.
Definition metadata.c:1793
int32_t aaruf_set_media_manufacturer(void *context, const uint8_t *data, const int32_t length)
Sets the media manufacturer information for the image.
Definition metadata.c:832
int32_t aaruf_set_drive_serial_number(void *context, const uint8_t *data, const int32_t length)
Sets the drive serial number for the image.
Definition metadata.c:1658
int32_t aaruf_get_overflow_sectors(const void *context, uint16_t *sectors)
Retrieves the number of overflow (post-gap) sectors in the AaruFormat image.
Definition metadata.c:3552
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:2546
int32_t aaruf_set_creator(void *context, const uint8_t *data, const int32_t length)
Sets the creator (person/operator) information for the image.
Definition metadata.c:493
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
uint16_t overflow
Trailing dumped sectors beyond user area (overflow range), still mapped with entries.
Definition ddt.h:151
uint64_t blocks
Total internal span (negative + usable + overflow) in logical sectors.
Definition ddt.h:150
uint16_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:870
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:172
uint8_t * media_barcode
Barcode of the media represented by the image.
Definition context.h:222
DdtHeader2 user_data_ddt_header
Active user data DDT v2 header (primary table meta).
Definition context.h:189
uint8_t * creator
Who (person) created the image?
Definition context.h:216
uint8_t * cicm_block
CICM XML payload.
Definition context.h:214
uint32_t cylinders
Cylinders of the media represented by the image.
Definition context.h:234
uint8_t * drive_firmware_revision
Firmware revision of the drive used to read the media represented by the image.
Definition context.h:228
uint8_t * media_serial_number
Serial number of the media represented by the image.
Definition context.h:221
MetadataBlockHeader metadata_block_header
Metadata block header.
Definition context.h:230
uint8_t * media_model
Model of the media represented by the image.
Definition context.h:220
uint8_t * drive_serial_number
Serial number of the drive used to read the media represented by the image.
Definition context.h:226
uint8_t * drive_manufacturer
Manufacturer of the drive used to read the media represented by the image.
Definition context.h:224
bool is_writing
True if context opened/created for writing.
Definition context.h:292
CicmMetadataBlock cicm_block_header
CICM metadata header (if present).
Definition context.h:231
uint8_t * drive_model
Model of the drive used to read the media represented by the image.
Definition context.h:225
uint64_t magic
File magic (AARU_MAGIC) post-open.
Definition context.h:174
GeometryBlockHeader geometry_block
Logical geometry block (if present).
Definition context.h:229
uint8_t * json_block
JSON metadata block payload (UTF-8).
Definition context.h:215
uint8_t * media_part_number
Part number of the media represented by the image.
Definition context.h:223
AaruMetadataJsonBlockHeader json_block_header
JSON metadata block header (if present).
Definition context.h:233
uint32_t sectors_per_track
Sectors per track of the media represented by the image (for variable image, the smallest)
Definition context.h:236
uint8_t * comments
Image comments.
Definition context.h:218
uint32_t heads
Heads of the media represented by the image.
Definition context.h:235
ImageInfo image_info
Exposed high-level image info summary.
Definition context.h:260
uint8_t * media_title
Title of the media represented by the image.
Definition context.h:217
uint8_t * media_manufacturer
Manufacturer of the media represented by the image.
Definition context.h:219