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
94AARU_EXPORT int32_t AARU_CALL aaruf_get_geometry(const void *context, uint32_t *cylinders, uint32_t *heads,
95 uint32_t *sectors_per_track)
96{
97 TRACE("Entering aaruf_get_geometry(%p, %p, %p, %p)", context, cylinders, heads, sectors_per_track);
98
99 const aaruformat_context *ctx = NULL;
100
101 if(context == NULL)
102 {
103 FATAL("Invalid context");
104
105 TRACE("Exiting aaruf_get_geometry() = AARUF_ERROR_NOT_AARUFORMAT");
107 }
108
109 ctx = context;
110
111 // Not a libaaruformat context
112 if(ctx->magic != AARU_MAGIC)
113 {
114 FATAL("Invalid context");
115
116 TRACE("Exiting aaruf_get_geometry() = AARUF_ERROR_NOT_AARUFORMAT");
118 }
119
121 {
122 FATAL("No geometry block present");
123
124 TRACE("Exiting aaruf_get_geometry() = AARUF_ERROR_CANNOT_READ_BLOCK");
126 }
127
128 *cylinders = ctx->geometry_block.cylinders;
129 *heads = ctx->geometry_block.heads;
130 *sectors_per_track = ctx->geometry_block.sectorsPerTrack;
131
132 TRACE("Exiting aaruf_get_geometry(%p, %u, %u, %u) = AARUF_STATUS_OK", context, *cylinders, *heads,
133 *sectors_per_track);
134 return AARUF_STATUS_OK;
135}
136
230AARU_EXPORT int32_t AARU_CALL aaruf_set_geometry(void *context, const uint32_t cylinders, const uint32_t heads,
231 const uint32_t sectors_per_track)
232{
233 TRACE("Entering aaruf_set_geometry(%p, %u, %u, %u)", context, cylinders, heads, sectors_per_track);
234
235 aaruformat_context *ctx = NULL;
236
237 if(context == NULL)
238 {
239 FATAL("Invalid context");
240
241 TRACE("Exiting aaruf_set_geometry() = AARUF_ERROR_NOT_AARUFORMAT");
243 }
244
245 ctx = context;
246
247 // Not a libaaruformat context
248 if(ctx->magic != AARU_MAGIC)
249 {
250 FATAL("Invalid context");
251
252 TRACE("Exiting aaruf_set_geometry() = AARUF_ERROR_NOT_AARUFORMAT");
254 }
255
256 // Check we are writing
257 if(!ctx->is_writing)
258 {
259 FATAL("Trying to write a read-only image");
260
261 TRACE("Exiting aaruf_write_sector() = AARUF_READ_ONLY");
262 return AARUF_READ_ONLY;
263 }
264
266 ctx->geometry_block.cylinders = cylinders;
267 ctx->geometry_block.heads = heads;
268 ctx->geometry_block.sectorsPerTrack = sectors_per_track;
269 ctx->cylinders = cylinders;
270 ctx->heads = heads;
271 ctx->sectors_per_track = sectors_per_track;
272 ctx->dirty_geometry_block = true; // Mark geometry block as dirty
273
274 TRACE("Exiting aaruf_set_geometry(%p, %u, %u, %u) = AARUF_STATUS_OK", context, cylinders, heads, sectors_per_track);
275 return AARUF_STATUS_OK;
276}
277
365AARU_EXPORT int32_t AARU_CALL aaruf_set_media_sequence(void *context, const int32_t sequence,
366 const int32_t last_sequence)
367{
368 TRACE("Entering aaruf_set_media_sequence(%p, %d, %d)", context, sequence, last_sequence);
369
370 // Check context is correct AaruFormat context
371 if(context == NULL)
372 {
373 FATAL("Invalid context");
374
375 TRACE("Exiting aaruf_set_media_sequence() = AARUF_ERROR_NOT_AARUFORMAT");
377 }
378
379 aaruformat_context *ctx = context;
380
381 // Not a libaaruformat context
382 if(ctx->magic != AARU_MAGIC)
383 {
384 FATAL("Invalid context");
385
386 TRACE("Exiting aaruf_set_media_sequence() = AARUF_ERROR_NOT_AARUFORMAT");
388 }
389
390 // Check we are writing
391 if(!ctx->is_writing)
392 {
393 FATAL("Trying to write a read-only image");
394
395 TRACE("Exiting aaruf_set_media_sequence() = AARUF_READ_ONLY");
396 return AARUF_READ_ONLY;
397 }
398
399 // Initialize
401
402 ctx->metadata_block_header.mediaSequence = sequence;
403 ctx->metadata_block_header.lastMediaSequence = last_sequence;
404
405 TRACE("Exiting aaruf_set_media_sequence(%p, %d, %d) = AARUF_STATUS_OK", context, sequence, last_sequence);
406 return AARUF_STATUS_OK;
407}
408
496AARU_EXPORT int32_t AARU_CALL aaruf_set_creator(void *context, const uint8_t *data, const int32_t length)
497{
498 TRACE("Entering aaruf_set_creator(%p, %p, %d)", context, data, length);
499
500 // Check context is correct AaruFormat context
501 if(context == NULL)
502 {
503 FATAL("Invalid context");
504
505 TRACE("Exiting aaruf_set_creator() = AARUF_ERROR_NOT_AARUFORMAT");
507 }
508
509 aaruformat_context *ctx = context;
510
511 // Not a libaaruformat context
512 if(ctx->magic != AARU_MAGIC)
513 {
514 FATAL("Invalid context");
515
516 TRACE("Exiting aaruf_set_creator() = AARUF_ERROR_NOT_AARUFORMAT");
518 }
519
520 // Check we are writing
521 if(!ctx->is_writing)
522 {
523 FATAL("Trying to write a read-only image");
524
525 TRACE("Exiting aaruf_set_creator() = AARUF_READ_ONLY");
526 return AARUF_READ_ONLY;
527 }
528
529 // Initialize
531
532 // Reserve memory
533 uint8_t *copy = malloc(length);
534 if(copy == NULL)
535 {
536 FATAL("Could not allocate memory for creator");
538 }
539
540 // Copy opaque UTF-16LE string
541 memcpy(copy, data, length);
542 if(ctx->creator != NULL) free(ctx->creator);
543 ctx->creator = copy;
545
546 TRACE("Exiting aaruf_set_creator(%p, %p, %d) = AARUF_STATUS_OK", context, data, length);
547 return AARUF_STATUS_OK;
548}
549
610AARU_EXPORT int32_t AARU_CALL aaruf_set_comments(void *context, const uint8_t *data, const int32_t length)
611{
612 TRACE("Entering aaruf_set_comments(%p, %p, %d)", context, data, length);
613
614 // Check context is correct AaruFormat context
615 if(context == NULL)
616 {
617 FATAL("Invalid context");
618
619 TRACE("Exiting aaruf_set_comments() = AARUF_ERROR_NOT_AARUFORMAT");
621 }
622
623 aaruformat_context *ctx = context;
624
625 // Not a libaaruformat context
626 if(ctx->magic != AARU_MAGIC)
627 {
628 FATAL("Invalid context");
629
630 TRACE("Exiting aaruf_set_comments() = AARUF_ERROR_NOT_AARUFORMAT");
632 }
633
634 // Check we are writing
635 if(!ctx->is_writing)
636 {
637 FATAL("Trying to write a read-only image");
638
639 TRACE("Exiting aaruf_set_comments() = AARUF_READ_ONLY");
640 return AARUF_READ_ONLY;
641 }
642
643 // Initialize
645
646 // Reserve memory
647 uint8_t *copy = malloc(length);
648 if(copy == NULL)
649 {
650 FATAL("Could not allocate memory for comments");
652 }
653
654 // Copy opaque UTF-16LE string
655 memcpy(copy, data, length);
656 if(ctx->comments != NULL) free(ctx->comments);
657 ctx->comments = copy;
659
660 TRACE("Exiting aaruf_set_comments(%p, %p, %d) = AARUF_STATUS_OK", context, data, length);
661 return AARUF_STATUS_OK;
662}
663
723AARU_EXPORT int32_t AARU_CALL aaruf_set_media_title(void *context, const uint8_t *data, const int32_t length)
724{
725 TRACE("Entering aaruf_set_media_title(%p, %p, %d)", context, data, length);
726
727 // Check context is correct AaruFormat context
728 if(context == NULL)
729 {
730 FATAL("Invalid context");
731
732 TRACE("Exiting aaruf_set_media_title() = AARUF_ERROR_NOT_AARUFORMAT");
734 }
735
736 aaruformat_context *ctx = context;
737
738 // Not a libaaruformat context
739 if(ctx->magic != AARU_MAGIC)
740 {
741 FATAL("Invalid context");
742
743 TRACE("Exiting aaruf_set_media_title() = AARUF_ERROR_NOT_AARUFORMAT");
745 }
746
747 // Check we are writing
748 if(!ctx->is_writing)
749 {
750 FATAL("Trying to write a read-only image");
751
752 TRACE("Exiting aaruf_set_media_title() = AARUF_READ_ONLY");
753 return AARUF_READ_ONLY;
754 }
755
756 // Initialize
758
759 // Reserve memory
760 uint8_t *copy = malloc(length);
761 if(copy == NULL)
762 {
763 FATAL("Could not allocate memory for media title");
765 }
766
767 // Copy opaque UTF-16LE string
768 memcpy(copy, data, length);
769 if(ctx->media_title != NULL) free(ctx->media_title);
770 ctx->media_title = copy;
772 ctx->dirty_metadata_block = true; // Mark metadata block as dirty
773
774 TRACE("Exiting aaruf_set_media_title(%p, %p, %d) = AARUF_STATUS_OK", context, data, length);
775 return AARUF_STATUS_OK;
776}
777
836AARU_EXPORT int32_t AARU_CALL aaruf_set_media_manufacturer(void *context, const uint8_t *data, const int32_t length)
837{
838 TRACE("Entering aaruf_set_media_manufacturer(%p, %p, %d)", context, data, length);
839
840 // Check context is correct AaruFormat context
841 if(context == NULL)
842 {
843 FATAL("Invalid context");
844
845 TRACE("Exiting aaruf_set_media_manufacturer() = AARUF_ERROR_NOT_AARUFORMAT");
847 }
848
849 aaruformat_context *ctx = context;
850
851 // Not a libaaruformat context
852 if(ctx->magic != AARU_MAGIC)
853 {
854 FATAL("Invalid context");
855
856 TRACE("Exiting aaruf_set_media_manufacturer() = AARUF_ERROR_NOT_AARUFORMAT");
858 }
859
860 // Check we are writing
861 if(!ctx->is_writing)
862 {
863 FATAL("Trying to write a read-only image");
864
865 TRACE("Exiting aaruf_set_media_manufacturer() = AARUF_READ_ONLY");
866 return AARUF_READ_ONLY;
867 }
868
869 // Initialize
871
872 // Reserve memory
873 uint8_t *copy = malloc(length);
874 if(copy == NULL)
875 {
876 FATAL("Could not allocate memory for media manufacturer");
878 }
879
880 // Copy opaque UTF-16LE string
881 memcpy(copy, data, length);
882 if(ctx->media_manufacturer != NULL) free(ctx->media_manufacturer);
883 ctx->media_manufacturer = copy;
885
886 TRACE("Exiting aaruf_set_media_manufacturer(%p, %p, %d) = AARUF_STATUS_OK", context, data, length);
887 return AARUF_STATUS_OK;
888}
889
943AARU_EXPORT int32_t AARU_CALL aaruf_set_media_model(void *context, const uint8_t *data, const int32_t length)
944{
945 TRACE("Entering aaruf_set_media_model(%p, %p, %d)", context, data, length);
946
947 // Check context is correct AaruFormat context
948 if(context == NULL)
949 {
950 FATAL("Invalid context");
951
952 TRACE("Exiting aaruf_set_media_model() = AARUF_ERROR_NOT_AARUFORMAT");
954 }
955
956 aaruformat_context *ctx = context;
957
958 // Not a libaaruformat context
959 if(ctx->magic != AARU_MAGIC)
960 {
961 FATAL("Invalid context");
962
963 TRACE("Exiting aaruf_set_media_model() = AARUF_ERROR_NOT_AARUFORMAT");
965 }
966
967 // Check we are writing
968 if(!ctx->is_writing)
969 {
970 FATAL("Trying to write a read-only image");
971
972 TRACE("Exiting aaruf_set_media_model() = AARUF_READ_ONLY");
973 return AARUF_READ_ONLY;
974 }
975
976 // Initialize
978
979 // Reserve memory
980 uint8_t *copy = malloc(length);
981 if(copy == NULL)
982 {
983 FATAL("Could not allocate memory for media model");
985 }
986
987 // Copy opaque UTF-16LE string
988 memcpy(copy, data, length);
989 if(ctx->media_model != NULL) free(ctx->media_model);
990 ctx->media_model = copy;
992
993 TRACE("Exiting aaruf_set_media_model(%p, %p, %d) = AARUF_STATUS_OK", context, data, length);
994 return AARUF_STATUS_OK;
995}
996
1058AARU_EXPORT int32_t AARU_CALL aaruf_set_media_serial_number(void *context, const uint8_t *data, const int32_t length)
1059{
1060 TRACE("Entering aaruf_set_media_serial_number(%p, %p, %d)", context, data, length);
1061
1062 // Check context is correct AaruFormat context
1063 if(context == NULL)
1064 {
1065 FATAL("Invalid context");
1066
1067 TRACE("Exiting aaruf_set_media_serial_number() = AARUF_ERROR_NOT_AARUFORMAT");
1069 }
1070
1071 aaruformat_context *ctx = context;
1072
1073 // Not a libaaruformat context
1074 if(ctx->magic != AARU_MAGIC)
1075 {
1076 FATAL("Invalid context");
1077
1078 TRACE("Exiting aaruf_set_media_serial_number() = AARUF_ERROR_NOT_AARUFORMAT");
1080 }
1081
1082 // Check we are writing
1083 if(!ctx->is_writing)
1084 {
1085 FATAL("Trying to write a read-only image");
1086
1087 TRACE("Exiting aaruf_set_media_serial_number() = AARUF_READ_ONLY");
1088 return AARUF_READ_ONLY;
1089 }
1090
1091 // Initialize
1093
1094 // Reserve memory
1095 uint8_t *copy = malloc(length);
1096 if(copy == NULL)
1097 {
1098 FATAL("Could not allocate memory for media serial number");
1100 }
1101
1102 // Copy opaque UTF-16LE string
1103 memcpy(copy, data, length);
1104 if(ctx->media_serial_number != NULL) free(ctx->media_serial_number);
1105 ctx->media_serial_number = copy;
1107
1108 TRACE("Exiting aaruf_set_media_serial_number(%p, %p, %d) = AARUF_STATUS_OK", context, data, length);
1109 return AARUF_STATUS_OK;
1110}
1111
1180AARU_EXPORT int32_t AARU_CALL aaruf_set_media_barcode(void *context, const uint8_t *data, const int32_t length)
1181{
1182 TRACE("Entering aaruf_set_media_barcode(%p, %p, %d)", context, data, length);
1183
1184 // Check context is correct AaruFormat context
1185 if(context == NULL)
1186 {
1187 FATAL("Invalid context");
1188
1189 TRACE("Exiting aaruf_set_media_barcode() = AARUF_ERROR_NOT_AARUFORMAT");
1191 }
1192
1193 aaruformat_context *ctx = context;
1194
1195 // Not a libaaruformat context
1196 if(ctx->magic != AARU_MAGIC)
1197 {
1198 FATAL("Invalid context");
1199
1200 TRACE("Exiting aaruf_set_media_barcode() = AARUF_ERROR_NOT_AARUFORMAT");
1202 }
1203
1204 // Check we are writing
1205 if(!ctx->is_writing)
1206 {
1207 FATAL("Trying to write a read-only image");
1208
1209 TRACE("Exiting aaruf_set_media_barcode() = AARUF_READ_ONLY");
1210 return AARUF_READ_ONLY;
1211 }
1212
1213 // Initialize
1215
1216 // Reserve memory
1217 uint8_t *copy = malloc(length);
1218 if(copy == NULL)
1219 {
1220 FATAL("Could not allocate memory for media barcode");
1222 }
1223
1224 // Copy opaque UTF-16LE string
1225 memcpy(copy, data, length);
1226 if(ctx->media_barcode != NULL) free(ctx->media_barcode);
1227 ctx->media_barcode = copy;
1229
1230 TRACE("Exiting aaruf_set_media_barcode(%p, %p, %d) = AARUF_STATUS_OK", context, data, length);
1231 return AARUF_STATUS_OK;
1232}
1233
1301AARU_EXPORT int32_t AARU_CALL aaruf_set_media_part_number(void *context, const uint8_t *data, const int32_t length)
1302{
1303 TRACE("Entering aaruf_set_media_part_number(%p, %p, %d)", context, data, length);
1304
1305 // Check context is correct AaruFormat context
1306 if(context == NULL)
1307 {
1308 FATAL("Invalid context");
1309
1310 TRACE("Exiting aaruf_set_media_part_number() = AARUF_ERROR_NOT_AARUFORMAT");
1312 }
1313
1314 aaruformat_context *ctx = context;
1315
1316 // Not a libaaruformat context
1317 if(ctx->magic != AARU_MAGIC)
1318 {
1319 FATAL("Invalid context");
1320
1321 TRACE("Exiting aaruf_set_media_part_number() = AARUF_ERROR_NOT_AARUFORMAT");
1323 }
1324
1325 // Check we are writing
1326 if(!ctx->is_writing)
1327 {
1328 FATAL("Trying to write a read-only image");
1329
1330 TRACE("Exiting aaruf_set_media_part_number() = AARUF_READ_ONLY");
1331 return AARUF_READ_ONLY;
1332 }
1333
1334 // Initialize
1336
1337 // Reserve memory
1338 uint8_t *copy = malloc(length);
1339 if(copy == NULL)
1340 {
1341 FATAL("Could not allocate memory for creator");
1343 }
1344
1345 // Copy opaque UTF-16LE string
1346 memcpy(copy, data, length);
1347 if(ctx->media_part_number != NULL) free(ctx->media_part_number);
1348 ctx->media_part_number = copy;
1350
1351 TRACE("Exiting aaruf_set_media_part_number(%p, %p, %d) = AARUF_STATUS_OK", context, data, length);
1352 return AARUF_STATUS_OK;
1353}
1354
1416AARU_EXPORT int32_t AARU_CALL aaruf_set_drive_manufacturer(void *context, const uint8_t *data, const int32_t length)
1417{
1418 TRACE("Entering aaruf_set_drive_manufacturer(%p, %p, %d)", context, data, length);
1419
1420 // Check context is correct AaruFormat context
1421 if(context == NULL)
1422 {
1423 FATAL("Invalid context");
1424
1425 TRACE("Exiting aaruf_set_drive_manufacturer() = AARUF_ERROR_NOT_AARUFORMAT");
1427 }
1428
1429 aaruformat_context *ctx = context;
1430
1431 // Not a libaaruformat context
1432 if(ctx->magic != AARU_MAGIC)
1433 {
1434 FATAL("Invalid context");
1435
1436 TRACE("Exiting aaruf_set_drive_manufacturer() = AARUF_ERROR_NOT_AARUFORMAT");
1438 }
1439
1440 // Check we are writing
1441 if(!ctx->is_writing)
1442 {
1443 FATAL("Trying to write a read-only image");
1444
1445 TRACE("Exiting aaruf_set_drive_manufacturer() = AARUF_READ_ONLY");
1446 return AARUF_READ_ONLY;
1447 }
1448
1449 // Initialize
1451
1452 // Reserve memory
1453 uint8_t *copy = malloc(length);
1454 if(copy == NULL)
1455 {
1456 FATAL("Could not allocate memory for drive manufacturer");
1458 }
1459
1460 // Copy opaque UTF-16LE string
1461 memcpy(copy, data, length);
1462 if(ctx->drive_manufacturer != NULL) free(ctx->drive_manufacturer);
1463 ctx->drive_manufacturer = copy;
1465
1466 TRACE("Exiting aaruf_set_drive_manufacturer(%p, %p, %d) = AARUF_STATUS_OK", context, data, length);
1467 return AARUF_STATUS_OK;
1468}
1469
1538AARU_EXPORT int32_t AARU_CALL aaruf_set_drive_model(void *context, const uint8_t *data, const int32_t length)
1539{
1540 TRACE("Entering aaruf_set_drive_model(%p, %p, %d)", context, data, length);
1541
1542 // Check context is correct AaruFormat context
1543 if(context == NULL)
1544 {
1545 FATAL("Invalid context");
1546
1547 TRACE("Exiting aaruf_set_drive_model() = AARUF_ERROR_NOT_AARUFORMAT");
1549 }
1550
1551 aaruformat_context *ctx = context;
1552
1553 // Not a libaaruformat context
1554 if(ctx->magic != AARU_MAGIC)
1555 {
1556 FATAL("Invalid context");
1557
1558 TRACE("Exiting aaruf_set_drive_model() = AARUF_ERROR_NOT_AARUFORMAT");
1560 }
1561
1562 // Check we are writing
1563 if(!ctx->is_writing)
1564 {
1565 FATAL("Trying to write a read-only image");
1566
1567 TRACE("Exiting aaruf_set_drive_model() = AARUF_READ_ONLY");
1568 return AARUF_READ_ONLY;
1569 }
1570
1571 // Initialize
1573
1574 // Reserve memory
1575 uint8_t *copy = malloc(length);
1576 if(copy == NULL)
1577 {
1578 FATAL("Could not allocate memory for media model");
1580 }
1581
1582 // Copy opaque UTF-16LE string
1583 memcpy(copy, data, length);
1584 if(ctx->drive_model != NULL) free(ctx->drive_model);
1585 ctx->drive_model = copy;
1587
1588 TRACE("Exiting aaruf_set_drive_model(%p, %p, %d) = AARUF_STATUS_OK", context, data, length);
1589 return AARUF_STATUS_OK;
1590}
1591
1662AARU_EXPORT int32_t AARU_CALL aaruf_set_drive_serial_number(void *context, const uint8_t *data, const int32_t length)
1663{
1664 TRACE("Entering aaruf_set_drive_serial_number(%p, %p, %d)", context, data, length);
1665
1666 // Check context is correct AaruFormat context
1667 if(context == NULL)
1668 {
1669 FATAL("Invalid context");
1670
1671 TRACE("Exiting aaruf_set_drive_serial_number() = AARUF_ERROR_NOT_AARUFORMAT");
1673 }
1674
1675 aaruformat_context *ctx = context;
1676
1677 // Not a libaaruformat context
1678 if(ctx->magic != AARU_MAGIC)
1679 {
1680 FATAL("Invalid context");
1681
1682 TRACE("Exiting aaruf_set_drive_serial_number() = AARUF_ERROR_NOT_AARUFORMAT");
1684 }
1685
1686 // Check we are writing
1687 if(!ctx->is_writing)
1688 {
1689 FATAL("Trying to write a read-only image");
1690
1691 TRACE("Exiting aaruf_set_drive_serial_number() = AARUF_READ_ONLY");
1692 return AARUF_READ_ONLY;
1693 }
1694
1695 // Initialize
1697
1698 // Reserve memory
1699 uint8_t *copy = malloc(length);
1700 if(copy == NULL)
1701 {
1702 FATAL("Could not allocate memory for drive serial number");
1704 }
1705
1706 // Copy opaque UTF-16LE string
1707 memcpy(copy, data, length);
1708 if(ctx->drive_serial_number != NULL) free(ctx->drive_serial_number);
1709 ctx->drive_serial_number = copy;
1711
1712 TRACE("Exiting aaruf_set_drive_serial_number(%p, %p, %d) = AARUF_STATUS_OK", context, data, length);
1713 return AARUF_STATUS_OK;
1714}
1715
1797AARU_EXPORT int32_t AARU_CALL aaruf_set_drive_firmware_revision(void *context, const uint8_t *data,
1798 const int32_t length)
1799{
1800 TRACE("Entering aaruf_set_drive_firmware_revision(%p, %p, %d)", context, data, length);
1801
1802 // Check context is correct AaruFormat context
1803 if(context == NULL)
1804 {
1805 FATAL("Invalid context");
1806
1807 TRACE("Exiting aaruf_set_drive_firmware_revision() = AARUF_ERROR_NOT_AARUFORMAT");
1809 }
1810
1811 aaruformat_context *ctx = context;
1812
1813 // Not a libaaruformat context
1814 if(ctx->magic != AARU_MAGIC)
1815 {
1816 FATAL("Invalid context");
1817
1818 TRACE("Exiting aaruf_set_drive_firmware_revision() = AARUF_ERROR_NOT_AARUFORMAT");
1820 }
1821
1822 // Check we are writing
1823 if(!ctx->is_writing)
1824 {
1825 FATAL("Trying to write a read-only image");
1826
1827 TRACE("Exiting aaruf_set_drive_firmware_revision() = AARUF_READ_ONLY");
1828 return AARUF_READ_ONLY;
1829 }
1830
1831 // Initialize
1833
1834 // Reserve memory
1835 uint8_t *copy = malloc(length);
1836 if(copy == NULL)
1837 {
1838 FATAL("Could not allocate memory for creator");
1840 }
1841
1842 // Copy opaque UTF-16LE string
1843 memcpy(copy, data, length);
1844 if(ctx->drive_firmware_revision != NULL) free(ctx->drive_firmware_revision);
1845 ctx->drive_firmware_revision = copy;
1847
1848 TRACE("Exiting aaruf_set_drive_firmware_revision(%p, %p, %d) = AARUF_STATUS_OK", context, data, length);
1849 return AARUF_STATUS_OK;
1850}
1851
1949AARU_EXPORT int32_t AARU_CALL aaruf_get_cicm_metadata(const void *context, uint8_t *buffer, size_t *length)
1950{
1951 TRACE("Entering aaruf_get_cicm_metadata(%p, %p, %p)", context, buffer, length);
1952
1953 // Check context is correct AaruFormat context
1954 if(context == NULL)
1955 {
1956 FATAL("Invalid context");
1957
1958 TRACE("Exiting aaruf_get_cicm_metadata() = AARUF_ERROR_NOT_AARUFORMAT");
1960 }
1961
1962 const aaruformat_context *ctx = context;
1963
1964 // Not a libaaruformat context
1965 if(ctx->magic != AARU_MAGIC)
1966 {
1967 FATAL("Invalid context");
1968
1969 TRACE("Exiting aaruf_get_cicm_metadata() = AARUF_ERROR_NOT_AARUFORMAT");
1971 }
1972
1973 if(ctx->cicm_block == NULL || ctx->cicm_block_header.length == 0 || ctx->cicm_block_header.identifier != CicmBlock)
1974 {
1975 TRACE("No CICM XML metadata present");
1976 *length = 0;
1977
1978 TRACE("Exiting aaruf_get_cicm_metadata() = AARUF_ERROR_CANNOT_READ_BLOCK");
1980 }
1981
1982 if(*length < ctx->cicm_block_header.length)
1983 {
1984 TRACE("Buffer too small for CICM XML metadata, required %u bytes", ctx->cicm_block_header.length);
1985 *length = ctx->cicm_block_header.length;
1986
1987 TRACE("Exiting aaruf_get_cicm_metadata() = AARUF_ERROR_BUFFER_TOO_SMALL");
1989 }
1990
1991 *length = ctx->cicm_block_header.length;
1992 memcpy(buffer, ctx->cicm_block, ctx->cicm_block_header.length);
1993
1994 TRACE("CICM XML metadata read successfully, length %u", *length);
1995 TRACE("Exiting aaruf_get_cicm_metadata(%p, %p, %d) = AARUF_STATUS_OK", context, buffer, *length);
1996 return AARUF_STATUS_OK;
1997}
1998
2104AARU_EXPORT int32_t AARU_CALL aaruf_get_aaru_json_metadata(const void *context, uint8_t *buffer, size_t *length)
2105{
2106 TRACE("Entering aaruf_get_aaru_json_metadata(%p, %p, %p)", context, buffer, length);
2107
2108 // Check context is correct AaruFormat context
2109 if(context == NULL)
2110 {
2111 FATAL("Invalid context");
2112
2113 TRACE("Exiting aaruf_get_aaru_json_metadata() = AARUF_ERROR_NOT_AARUFORMAT");
2115 }
2116
2117 const aaruformat_context *ctx = context;
2118
2119 // Not a libaaruformat context
2120 if(ctx->magic != AARU_MAGIC)
2121 {
2122 FATAL("Invalid context");
2123
2124 TRACE("Exiting aaruf_get_aaru_json_metadata() = AARUF_ERROR_NOT_AARUFORMAT");
2126 }
2127
2128 if(ctx->json_block == NULL || ctx->json_block_header.length == 0 ||
2130 {
2131 TRACE("No Aaru metadata JSON present");
2132 *length = 0;
2133
2134 TRACE("Exiting aaruf_get_aaru_json_metadata() = AARUF_ERROR_CANNOT_READ_BLOCK");
2136 }
2137
2138 if(*length < ctx->json_block_header.length)
2139 {
2140 TRACE("Buffer too small for Aaru metadata JSON, required %u bytes", ctx->json_block_header.length);
2141 *length = ctx->json_block_header.length;
2142
2143 TRACE("Exiting aaruf_get_aaru_json_metadata() = AARUF_ERROR_BUFFER_TOO_SMALL");
2145 }
2146
2147 *length = ctx->json_block_header.length;
2148 memcpy(buffer, ctx->json_block, ctx->json_block_header.length);
2149
2150 TRACE("Aaru metadata JSON read successfully, length %u", *length);
2151 TRACE("Exiting aaruf_get_aaru_json_metadata(%p, %p, %d) = AARUF_STATUS_OK", context, buffer, *length);
2152 return AARUF_STATUS_OK;
2153}
2154
2263AARU_EXPORT int32_t AARU_CALL aaruf_set_aaru_json_metadata(void *context, uint8_t *data, size_t length)
2264{
2265 TRACE("Entering aaruf_set_aaru_json_metadata(%p, %p, %d)", context, data, length);
2266
2267 // Check context is correct AaruFormat context
2268 if(context == NULL)
2269 {
2270 FATAL("Invalid context");
2271
2272 TRACE("Exiting aaruf_set_aaru_json_metadata() = AARUF_ERROR_NOT_AARUFORMAT");
2274 }
2275
2276 aaruformat_context *ctx = context;
2277
2278 // Not a libaaruformat context
2279 if(ctx->magic != AARU_MAGIC)
2280 {
2281 FATAL("Invalid context");
2282
2283 TRACE("Exiting aaruf_set_aaru_json_metadata() = AARUF_ERROR_NOT_AARUFORMAT");
2285 }
2286
2287 // Check we are writing
2288 if(!ctx->is_writing)
2289 {
2290 FATAL("Trying to write a read-only image");
2291
2292 TRACE("Exiting aaruf_set_aaru_json_metadata() = AARUF_READ_ONLY");
2293 return AARUF_READ_ONLY;
2294 }
2295
2296 // Reserve memory
2297 uint8_t *copy = malloc(length);
2298 if(copy == NULL)
2299 {
2300 FATAL("Could not allocate memory for Aaru metadata JSON");
2302 }
2303
2304 // Copy opaque UTF-8 string
2305 memcpy(copy, data, length);
2306 if(ctx->json_block != NULL) free(ctx->json_block);
2307 ctx->json_block = copy;
2309 ctx->json_block_header.length = (uint32_t)length;
2310 ctx->dirty_json_block = true; // Mark JSON block as dirty
2311
2312 TRACE("Exiting aaruf_set_aaru_json_metadata(%p, %p, %d) = AARUF_STATUS_OK", context, data, length);
2313 return AARUF_STATUS_OK;
2314}
2315
2343AARU_EXPORT int32_t AARU_CALL aaruf_get_media_sequence(const void *context, int32_t *sequence, int32_t *last_sequence)
2344{
2345 TRACE("Entering aaruf_get_media_sequence(%p, %p, %p)", context, sequence, last_sequence);
2346
2347 // Check context is correct AaruFormat context
2348 if(context == NULL)
2349 {
2350 FATAL("Invalid context");
2351
2352 TRACE("Exiting aaruf_set_media_sequence() = AARUF_ERROR_NOT_AARUFORMAT");
2354 }
2355
2356 const aaruformat_context *ctx = context;
2357
2358 // Not a libaaruformat context
2359 if(ctx->magic != AARU_MAGIC)
2360 {
2361 FATAL("Invalid context");
2362
2363 TRACE("Exiting aaruf_set_media_sequence() = AARUF_ERROR_NOT_AARUFORMAT");
2365 }
2366
2368 {
2369 FATAL("No metadata block present");
2370
2371 TRACE("Exiting aaruf_set_media_sequence() = AARUF_ERROR_METADATA_NOT_PRESENT");
2373 }
2374
2375 *sequence = ctx->metadata_block_header.mediaSequence;
2376 *last_sequence = ctx->metadata_block_header.lastMediaSequence;
2377
2378 TRACE("Exiting aaruf_set_media_sequence(%p, %d, %d) = AARUF_STATUS_OK", context, *sequence, *last_sequence);
2379 return AARUF_STATUS_OK;
2380}
2381
2410AARU_EXPORT int32_t AARU_CALL aaruf_get_creator(const void *context, uint8_t *buffer, int32_t *length)
2411{
2412 TRACE("Entering aaruf_get_creator(%p, %p, %p)", context, buffer, length);
2413
2414 // Check context is correct AaruFormat context
2415 if(context == NULL)
2416 {
2417 FATAL("Invalid context");
2418
2419 TRACE("Exiting aaruf_get_creator() = AARUF_ERROR_NOT_AARUFORMAT");
2421 }
2422
2423 const aaruformat_context *ctx = context;
2424
2425 // Not a libaaruformat context
2426 if(ctx->magic != AARU_MAGIC)
2427 {
2428 FATAL("Invalid context");
2429
2430 TRACE("Exiting aaruf_get_creator() = AARUF_ERROR_NOT_AARUFORMAT");
2432 }
2433
2434 if(ctx->metadata_block_header.identifier != MetadataBlock || ctx->creator == NULL ||
2436 {
2437 FATAL("No metadata block present");
2438
2439 TRACE("Exiting aaruf_get_creator() = AARUF_ERROR_METADATA_NOT_PRESENT");
2441 }
2442
2443 if(buffer == NULL || *length < ctx->metadata_block_header.creatorLength)
2444 {
2445 *length = ctx->metadata_block_header.creatorLength;
2446
2447 TRACE("Exiting aaruf_get_creator() = AARUF_ERROR_BUFFER_TOO_SMALL");
2449 }
2450
2451 // Copy opaque UTF-16LE string
2452 memcpy(buffer, ctx->creator, ctx->metadata_block_header.creatorLength);
2453 *length = ctx->metadata_block_header.creatorLength;
2454
2455 TRACE("Exiting aaruf_get_creator(%p, %p, %d) = AARUF_STATUS_OK", context, buffer, *length);
2456 return AARUF_STATUS_OK;
2457}
2458
2482AARU_EXPORT int32_t AARU_CALL aaruf_get_comments(const void *context, uint8_t *buffer, int32_t *length)
2483{
2484 TRACE("Entering aaruf_get_comments(%p, %p, %p)", context, buffer, length);
2485
2486 // Check context is correct AaruFormat context
2487 if(context == NULL)
2488 {
2489 FATAL("Invalid context");
2490
2491 TRACE("Exiting aaruf_get_comments() = AARUF_ERROR_NOT_AARUFORMAT");
2493 }
2494
2495 const aaruformat_context *ctx = context;
2496
2497 // Not a libaaruformat context
2498 if(ctx->magic != AARU_MAGIC)
2499 {
2500 FATAL("Invalid context");
2501
2502 TRACE("Exiting aaruf_get_comments() = AARUF_ERROR_NOT_AARUFORMAT");
2504 }
2505
2506 if(ctx->metadata_block_header.identifier != MetadataBlock || ctx->comments == NULL ||
2508 {
2509 FATAL("No metadata block present");
2510
2511 TRACE("Exiting aaruf_get_comments() = AARUF_ERROR_METADATA_NOT_PRESENT");
2513 }
2514
2515 if(buffer == NULL || *length < ctx->metadata_block_header.commentsLength)
2516 {
2518
2519 TRACE("Exiting aaruf_get_comments() = AARUF_ERROR_BUFFER_TOO_SMALL");
2521 }
2522
2523 // Copy opaque UTF-16LE string
2524 memcpy(buffer, ctx->comments, ctx->metadata_block_header.commentsLength);
2526
2527 TRACE("Exiting aaruf_get_comments(%p, %p, %d) = AARUF_STATUS_OK", context, buffer, *length);
2528 return AARUF_STATUS_OK;
2529}
2530
2552AARU_EXPORT int32_t AARU_CALL aaruf_get_media_title(const void *context, uint8_t *buffer, int32_t *length)
2553{
2554 TRACE("Entering aaruf_get_media_title(%p, %p, %p)", context, buffer, length);
2555
2556 // Check context is correct AaruFormat context
2557 if(context == NULL)
2558 {
2559 FATAL("Invalid context");
2560
2561 TRACE("Exiting aaruf_get_media_title() = AARUF_ERROR_NOT_AARUFORMAT");
2563 }
2564
2565 const aaruformat_context *ctx = context;
2566
2567 // Not a libaaruformat context
2568 if(ctx->magic != AARU_MAGIC)
2569 {
2570 FATAL("Invalid context");
2571
2572 TRACE("Exiting aaruf_get_media_title() = AARUF_ERROR_NOT_AARUFORMAT");
2574 }
2575
2576 if(ctx->metadata_block_header.identifier != MetadataBlock || ctx->media_title == NULL ||
2578 {
2579 FATAL("No metadata block present");
2580
2581 TRACE("Exiting aaruf_get_media_title() = AARUF_ERROR_METADATA_NOT_PRESENT");
2583 }
2584
2585 if(buffer == NULL || *length < ctx->metadata_block_header.mediaTitleLength)
2586 {
2588
2589 TRACE("Exiting aaruf_get_media_title() = AARUF_ERROR_BUFFER_TOO_SMALL");
2591 }
2592
2593 // Copy opaque UTF-16LE string
2594 memcpy(buffer, ctx->media_title, ctx->metadata_block_header.mediaTitleLength);
2596
2597 TRACE("Exiting aaruf_get_media_title(%p, %p, %d) = AARUF_STATUS_OK", context, buffer, *length);
2598 return AARUF_STATUS_OK;
2599}
2600
2622AARU_EXPORT int32_t AARU_CALL aaruf_get_media_manufacturer(const void *context, uint8_t *buffer, int32_t *length)
2623{
2624 TRACE("Entering aaruf_get_media_manufacturer(%p, %p, %p)", context, buffer, length);
2625
2626 // Check context is correct AaruFormat context
2627 if(context == NULL)
2628 {
2629 FATAL("Invalid context");
2630
2631 TRACE("Exiting aaruf_get_media_manufacturer() = AARUF_ERROR_NOT_AARUFORMAT");
2633 }
2634
2635 const aaruformat_context *ctx = context;
2636
2637 // Not a libaaruformat context
2638 if(ctx->magic != AARU_MAGIC)
2639 {
2640 FATAL("Invalid context");
2641
2642 TRACE("Exiting aaruf_get_media_manufacturer() = AARUF_ERROR_NOT_AARUFORMAT");
2644 }
2645
2648 {
2649 FATAL("No metadata block present");
2650
2651 TRACE("Exiting aaruf_get_media_manufacturer() = AARUF_ERROR_METADATA_NOT_PRESENT");
2653 }
2654
2655 if(buffer == NULL || *length < ctx->metadata_block_header.mediaManufacturerLength)
2656 {
2658
2659 TRACE("Exiting aaruf_get_media_manufacturer() = AARUF_ERROR_BUFFER_TOO_SMALL");
2661 }
2662
2663 // Copy opaque UTF-16LE string
2666
2667 TRACE("Exiting aaruf_get_media_manufacturer(%p, %p, %d) = AARUF_STATUS_OK", context, buffer, *length);
2668 return AARUF_STATUS_OK;
2669}
2670
2692AARU_EXPORT int32_t AARU_CALL aaruf_get_media_model(const void *context, uint8_t *buffer, int32_t *length)
2693{
2694 TRACE("Entering aaruf_get_media_model(%p, %p, %p)", context, buffer, length);
2695
2696 // Check context is correct AaruFormat context
2697 if(context == NULL)
2698 {
2699 FATAL("Invalid context");
2700
2701 TRACE("Exiting aaruf_get_media_model() = AARUF_ERROR_NOT_AARUFORMAT");
2703 }
2704
2705 const aaruformat_context *ctx = context;
2706
2707 // Not a libaaruformat context
2708 if(ctx->magic != AARU_MAGIC)
2709 {
2710 FATAL("Invalid context");
2711
2712 TRACE("Exiting aaruf_get_media_model() = AARUF_ERROR_NOT_AARUFORMAT");
2714 }
2715
2716 if(ctx->metadata_block_header.identifier != MetadataBlock || ctx->media_model == NULL ||
2718 {
2719 FATAL("No metadata block present");
2720
2721 TRACE("Exiting aaruf_get_media_model() = AARUF_ERROR_METADATA_NOT_PRESENT");
2723 }
2724
2725 if(buffer == NULL || *length < ctx->metadata_block_header.mediaModelLength)
2726 {
2728
2729 TRACE("Exiting aaruf_get_media_model() = AARUF_ERROR_BUFFER_TOO_SMALL");
2731 }
2732
2733 // Copy opaque UTF-16LE string
2734 memcpy(buffer, ctx->media_model, ctx->metadata_block_header.mediaModelLength);
2736
2737 TRACE("Exiting aaruf_get_media_model(%p, %p, %d) = AARUF_STATUS_OK", context, buffer, *length);
2738 return AARUF_STATUS_OK;
2739}
2740
2762AARU_EXPORT int32_t AARU_CALL aaruf_get_media_serial_number(const void *context, uint8_t *buffer, int32_t *length)
2763{
2764 TRACE("Entering aaruf_get_media_serial_number(%p, %p, %p)", context, buffer, length);
2765
2766 // Check context is correct AaruFormat context
2767 if(context == NULL)
2768 {
2769 FATAL("Invalid context");
2770
2771 TRACE("Exiting aaruf_get_media_serial_number() = AARUF_ERROR_NOT_AARUFORMAT");
2773 }
2774
2775 const aaruformat_context *ctx = context;
2776
2777 // Not a libaaruformat context
2778 if(ctx->magic != AARU_MAGIC)
2779 {
2780 FATAL("Invalid context");
2781
2782 TRACE("Exiting aaruf_get_media_serial_number() = AARUF_ERROR_NOT_AARUFORMAT");
2784 }
2785
2788 {
2789 FATAL("No metadata block present");
2790
2791 TRACE("Exiting aaruf_get_media_serial_number() = AARUF_ERROR_METADATA_NOT_PRESENT");
2793 }
2794
2795 if(buffer == NULL || *length < ctx->metadata_block_header.mediaSerialNumberLength)
2796 {
2798
2799 TRACE("Exiting aaruf_get_media_serial_number() = AARUF_ERROR_BUFFER_TOO_SMALL");
2801 }
2802
2803 // Copy opaque UTF-16LE string
2806
2807 TRACE("Exiting aaruf_get_media_serial_number(%p, %p, %d) = AARUF_STATUS_OK", context, buffer, *length);
2808 return AARUF_STATUS_OK;
2809}
2810
2831AARU_EXPORT int32_t AARU_CALL aaruf_get_media_barcode(const void *context, uint8_t *buffer, int32_t *length)
2832{
2833 TRACE("Entering aaruf_get_media_barcode(%p, %p, %p)", context, buffer, length);
2834
2835 // Check context is correct AaruFormat context
2836 if(context == NULL)
2837 {
2838 FATAL("Invalid context");
2839
2840 TRACE("Exiting aaruf_get_media_barcode() = AARUF_ERROR_NOT_AARUFORMAT");
2842 }
2843
2844 const aaruformat_context *ctx = context;
2845
2846 // Not a libaaruformat context
2847 if(ctx->magic != AARU_MAGIC)
2848 {
2849 FATAL("Invalid context");
2850
2851 TRACE("Exiting aaruf_get_media_barcode() = AARUF_ERROR_NOT_AARUFORMAT");
2853 }
2854
2855 if(ctx->metadata_block_header.identifier != MetadataBlock || ctx->media_barcode == NULL ||
2857 {
2858 FATAL("No metadata block present");
2859
2860 TRACE("Exiting aaruf_get_media_barcode() = AARUF_ERROR_METADATA_NOT_PRESENT");
2862 }
2863
2864 if(buffer == NULL || *length < ctx->metadata_block_header.mediaBarcodeLength)
2865 {
2867
2868 TRACE("Exiting aaruf_get_media_barcode() = AARUF_ERROR_BUFFER_TOO_SMALL");
2870 }
2871
2872 // Copy opaque UTF-16LE string
2873 memcpy(buffer, ctx->media_barcode, ctx->metadata_block_header.mediaBarcodeLength);
2875
2876 TRACE("Exiting aaruf_get_media_barcode(%p, %p, %d) = AARUF_STATUS_OK", context, buffer, *length);
2877 return AARUF_STATUS_OK;
2878}
2879
2902AARU_EXPORT int32_t AARU_CALL aaruf_get_media_part_number(const void *context, uint8_t *buffer, int32_t *length)
2903{
2904 TRACE("Entering aaruf_get_media_part_number(%p, %p, %p)", context, buffer, length);
2905
2906 // Check context is correct AaruFormat context
2907 if(context == NULL)
2908 {
2909 FATAL("Invalid context");
2910
2911 TRACE("Exiting aaruf_get_media_part_number() = AARUF_ERROR_NOT_AARUFORMAT");
2913 }
2914
2915 const aaruformat_context *ctx = context;
2916
2917 // Not a libaaruformat context
2918 if(ctx->magic != AARU_MAGIC)
2919 {
2920 FATAL("Invalid context");
2921
2922 TRACE("Exiting aaruf_get_media_part_number() = AARUF_ERROR_NOT_AARUFORMAT");
2924 }
2925
2928 {
2929 FATAL("No metadata block present");
2930
2931 TRACE("Exiting aaruf_get_media_part_number() = AARUF_ERROR_METADATA_NOT_PRESENT");
2933 }
2934
2935 if(buffer == NULL || *length < ctx->metadata_block_header.mediaPartNumberLength)
2936 {
2938
2939 TRACE("Exiting aaruf_get_media_part_number() = AARUF_ERROR_BUFFER_TOO_SMALL");
2941 }
2942
2943 // Copy opaque UTF-16LE string
2946
2947 TRACE("Exiting aaruf_get_media_part_number(%p, %p, %d) = AARUF_STATUS_OK", context, buffer, *length);
2948 return AARUF_STATUS_OK;
2949}
2950
2974AARU_EXPORT int32_t AARU_CALL aaruf_get_drive_manufacturer(const void *context, uint8_t *buffer, int32_t *length)
2975{
2976 TRACE("Entering aaruf_get_drive_manufacturer(%p, %p, %p)", context, buffer, length);
2977
2978 // Check context is correct AaruFormat context
2979 if(context == NULL)
2980 {
2981 FATAL("Invalid context");
2982
2983 TRACE("Exiting aaruf_get_drive_manufacturer() = AARUF_ERROR_NOT_AARUFORMAT");
2985 }
2986
2987 const aaruformat_context *ctx = context;
2988
2989 // Not a libaaruformat context
2990 if(ctx->magic != AARU_MAGIC)
2991 {
2992 FATAL("Invalid context");
2993
2994 TRACE("Exiting aaruf_get_drive_manufacturer() = AARUF_ERROR_NOT_AARUFORMAT");
2996 }
2997
3000 {
3001 FATAL("No metadata block present");
3002
3003 TRACE("Exiting aaruf_get_drive_manufacturer() = AARUF_ERROR_METADATA_NOT_PRESENT");
3005 }
3006
3007 if(buffer == NULL || *length < ctx->metadata_block_header.driveManufacturerLength)
3008 {
3010
3011 TRACE("Exiting aaruf_get_drive_manufacturer() = AARUF_ERROR_BUFFER_TOO_SMALL");
3013 }
3014
3015 // Copy opaque UTF-16LE string
3018
3019 TRACE("Exiting aaruf_get_drive_manufacturer(%p, %p, %d) = AARUF_STATUS_OK", context, buffer, *length);
3020 return AARUF_STATUS_OK;
3021}
3022
3044AARU_EXPORT int32_t AARU_CALL aaruf_get_drive_model(const void *context, uint8_t *buffer, int32_t *length)
3045{
3046 TRACE("Entering aaruf_get_drive_model(%p, %p, %p)", context, buffer, length);
3047
3048 // Check context is correct AaruFormat context
3049 if(context == NULL)
3050 {
3051 FATAL("Invalid context");
3052
3053 TRACE("Exiting aaruf_get_drive_model() = AARUF_ERROR_NOT_AARUFORMAT");
3055 }
3056
3057 const aaruformat_context *ctx = context;
3058
3059 // Not a libaaruformat context
3060 if(ctx->magic != AARU_MAGIC)
3061 {
3062 FATAL("Invalid context");
3063
3064 TRACE("Exiting aaruf_get_drive_model() = AARUF_ERROR_NOT_AARUFORMAT");
3066 }
3067
3068 if(ctx->metadata_block_header.identifier != MetadataBlock || ctx->drive_model == NULL ||
3070 {
3071 FATAL("No metadata block present");
3072
3073 TRACE("Exiting aaruf_get_drive_model() = AARUF_ERROR_METADATA_NOT_PRESENT");
3075 }
3076
3077 if(buffer == NULL || *length < ctx->metadata_block_header.driveModelLength)
3078 {
3080
3081 TRACE("Exiting aaruf_get_drive_model() = AARUF_ERROR_BUFFER_TOO_SMALL");
3083 }
3084
3085 // Copy opaque UTF-16LE string
3086 memcpy(buffer, ctx->drive_model, ctx->metadata_block_header.driveModelLength);
3088
3089 TRACE("Exiting aaruf_get_drive_model(%p, %p, %d) = AARUF_STATUS_OK", context, buffer, *length);
3090 return AARUF_STATUS_OK;
3091}
3092
3114AARU_EXPORT int32_t AARU_CALL aaruf_get_drive_serial_number(const void *context, uint8_t *buffer, int32_t *length)
3115{
3116 TRACE("Entering aaruf_get_drive_serial_number(%p, %p, %p)", context, buffer, length);
3117
3118 // Check context is correct AaruFormat context
3119 if(context == NULL)
3120 {
3121 FATAL("Invalid context");
3122
3123 TRACE("Exiting aaruf_get_drive_serial_number() = AARUF_ERROR_NOT_AARUFORMAT");
3125 }
3126
3127 const aaruformat_context *ctx = context;
3128
3129 // Not a libaaruformat context
3130 if(ctx->magic != AARU_MAGIC)
3131 {
3132 FATAL("Invalid context");
3133
3134 TRACE("Exiting aaruf_get_drive_serial_number() = AARUF_ERROR_NOT_AARUFORMAT");
3136 }
3137
3140 {
3141 FATAL("No metadata block present");
3142
3143 TRACE("Exiting aaruf_get_drive_serial_number() = AARUF_ERROR_METADATA_NOT_PRESENT");
3145 }
3146
3147 if(buffer == NULL || *length < ctx->metadata_block_header.driveSerialNumberLength)
3148 {
3150
3151 TRACE("Exiting aaruf_get_drive_serial_number() = AARUF_ERROR_BUFFER_TOO_SMALL");
3153 }
3154
3155 // Copy opaque UTF-16LE string
3158
3159 TRACE("Exiting aaruf_get_drive_serial_number(%p, %p, %d) = AARUF_STATUS_OK", context, buffer, *length);
3160 return AARUF_STATUS_OK;
3161}
3162
3184AARU_EXPORT int32_t AARU_CALL aaruf_get_drive_firmware_revision(const void *context, uint8_t *buffer, int32_t *length)
3185{
3186 TRACE("Entering aaruf_get_drive_firmware_revision(%p, %p, %p)", context, buffer, length);
3187
3188 // Check context is correct AaruFormat context
3189 if(context == NULL)
3190 {
3191 FATAL("Invalid context");
3192
3193 TRACE("Exiting aaruf_get_drive_firmware_revision() = AARUF_ERROR_NOT_AARUFORMAT");
3195 }
3196
3197 const aaruformat_context *ctx = context;
3198
3199 // Not a libaaruformat context
3200 if(ctx->magic != AARU_MAGIC)
3201 {
3202 FATAL("Invalid context");
3203
3204 TRACE("Exiting aaruf_get_drive_firmware_revision() = AARUF_ERROR_NOT_AARUFORMAT");
3206 }
3207
3210 {
3211 FATAL("No metadata block present");
3212
3213 TRACE("Exiting aaruf_get_drive_firmware_revision() = AARUF_ERROR_METADATA_NOT_PRESENT");
3215 }
3216
3217 if(buffer == NULL || *length < ctx->metadata_block_header.driveFirmwareRevisionLength)
3218 {
3220
3221 TRACE("Exiting aaruf_get_drive_firmware_revision() = AARUF_ERROR_BUFFER_TOO_SMALL");
3223 }
3224
3225 // Copy opaque UTF-16LE string
3228
3229 TRACE("Exiting aaruf_get_drive_firmware_revision(%p, %p, %d) = AARUF_STATUS_OK", context, buffer, *length);
3230 return AARUF_STATUS_OK;
3231}
3232
3298AARU_EXPORT int32_t AARU_CALL aaruf_get_user_sectors(const void *context, uint64_t *sectors)
3299{
3300 TRACE("Entering aaruf_get_user_sectors(%p, %p)", context, sectors);
3301
3302 // Check context is correct AaruFormat context
3303 if(context == NULL)
3304 {
3305 FATAL("Invalid context");
3306
3307 TRACE("Exiting aaruf_get_user_sectors() = AARUF_ERROR_NOT_AARUFORMAT");
3309 }
3310
3311 const aaruformat_context *ctx = context;
3312
3313 // Not a libaaruformat context
3314 if(ctx->magic != AARU_MAGIC)
3315 {
3316 FATAL("Invalid context");
3317
3318 TRACE("Exiting aaruf_get_user_sectors() = AARUF_ERROR_NOT_AARUFORMAT");
3320 }
3321
3322 *sectors = ctx->user_data_ddt_header.blocks;
3323
3324 TRACE("Exiting aaruf_get_user_sectors(%p, %llu) = AARUF_STATUS_OK", context, *sectors);
3325 return AARUF_STATUS_OK;
3326}
3327
3423AARU_EXPORT int32_t AARU_CALL aaruf_get_negative_sectors(const void *context, uint16_t *sectors)
3424{
3425 TRACE("Entering aaruf_get_negative_sectors(%p, %p)", context, sectors);
3426
3427 // Check context is correct AaruFormat context
3428 if(context == NULL)
3429 {
3430 FATAL("Invalid context");
3431
3432 TRACE("Exiting aaruf_get_negative_sectors() = AARUF_ERROR_NOT_AARUFORMAT");
3434 }
3435
3436 const aaruformat_context *ctx = context;
3437
3438 // Not a libaaruformat context
3439 if(ctx->magic != AARU_MAGIC)
3440 {
3441 FATAL("Invalid context");
3442
3443 TRACE("Exiting aaruf_get_negative_sectors() = AARUF_ERROR_NOT_AARUFORMAT");
3445 }
3446
3447 *sectors = ctx->user_data_ddt_header.negative;
3448
3449 TRACE("Exiting aaruf_get_negative_sectors(%p, %u) = AARUF_STATUS_OK", context, *sectors);
3450 return AARUF_STATUS_OK;
3451}
3452
3558AARU_EXPORT int32_t AARU_CALL aaruf_get_overflow_sectors(const void *context, uint16_t *sectors)
3559{
3560 TRACE("Entering aaruf_get_overflow_sectors(%p, %p)", context, sectors);
3561
3562 // Check context is correct AaruFormat context
3563 if(context == NULL)
3564 {
3565 FATAL("Invalid context");
3566
3567 TRACE("Exiting aaruf_get_overflow_sectors() = AARUF_ERROR_NOT_AARUFORMAT");
3569 }
3570
3571 const aaruformat_context *ctx = context;
3572
3573 // Not a libaaruformat context
3574 if(ctx->magic != AARU_MAGIC)
3575 {
3576 FATAL("Invalid context");
3577
3578 TRACE("Exiting aaruf_get_overflow_sectors() = AARUF_ERROR_NOT_AARUFORMAT");
3580 }
3581
3582 *sectors = ctx->user_data_ddt_header.overflow;
3583
3584 TRACE("Exiting aaruf_get_overflow_sectors(%p, %u) = AARUF_STATUS_OK", context, *sectors);
3585 return AARUF_STATUS_OK;
3586}
3587
3640AARU_EXPORT int32_t AARU_CALL aaruf_get_image_info(const void *context, ImageInfo *image_info)
3641{
3642 TRACE("Entering aaruf_get_image_info(%p, %p)", context, image_info);
3643
3644 // Check context is correct AaruFormat context
3645 if(context == NULL)
3646 {
3647 FATAL("Invalid context");
3648
3649 TRACE("Exiting aaruf_get_image_info() = AARUF_ERROR_NOT_AARUFORMAT");
3651 }
3652
3653 const aaruformat_context *ctx = context;
3654
3655 // Not a libaaruformat context
3656 if(ctx->magic != AARU_MAGIC)
3657 {
3658 FATAL("Invalid context");
3659
3660 TRACE("Exiting aaruf_get_image_info() = AARUF_ERROR_NOT_AARUFORMAT");
3662 }
3663
3664 if(image_info == NULL)
3665 {
3666 FATAL("image_info parameter is NULL");
3667
3668 TRACE("Exiting aaruf_get_image_info() = AARUF_ERROR_INCORRECT_DATA_SIZE");
3670 }
3671
3672 // Perform deep copy of the image_info structure
3673 memcpy(image_info, &ctx->image_info, sizeof(ImageInfo));
3674
3675 TRACE("Exiting aaruf_get_image_info() = AARUF_STATUS_OK");
3676 return AARUF_STATUS_OK;
3677}
3678
3747{
3748 TRACE("Entering aaruf_clear_media_sequence(%p)", context);
3749
3750 // Check context is correct AaruFormat context
3751 if(context == NULL)
3752 {
3753 FATAL("Invalid context");
3754
3755 TRACE("Exiting aaruf_clear_media_sequence() = AARUF_ERROR_NOT_AARUFORMAT");
3757 }
3758
3759 aaruformat_context *ctx = context;
3760
3761 // Not a libaaruformat context
3762 if(ctx->magic != AARU_MAGIC)
3763 {
3764 FATAL("Invalid context");
3765
3766 TRACE("Exiting aaruf_clear_media_sequence() = AARUF_ERROR_NOT_AARUFORMAT");
3768 }
3769
3770 // Check we are writing
3771 if(!ctx->is_writing)
3772 {
3773 FATAL("Trying to write a read-only image");
3774
3775 TRACE("Exiting aaruf_clear_media_sequence() = AARUF_READ_ONLY");
3776 return AARUF_READ_ONLY;
3777 }
3778
3780 {
3781 TRACE("Exiting aaruf_clear_media_sequence() = AARUF_STATUS_OK");
3782 return AARUF_STATUS_OK;
3783 }
3784
3787
3788 // Check if all metadata is clear
3797
3798 TRACE("Exiting aaruf_clear_media_sequence() = AARUF_STATUS_OK");
3799 return AARUF_STATUS_OK;
3800}
3801
3878{
3879 TRACE("Entering aaruf_clear_creator(%p)", context);
3880
3881 // Check context is correct AaruFormat context
3882 if(context == NULL)
3883 {
3884 FATAL("Invalid context");
3885
3886 TRACE("Exiting aaruf_clear_creator() = AARUF_ERROR_NOT_AARUFORMAT");
3888 }
3889
3890 aaruformat_context *ctx = context;
3891
3892 // Not a libaaruformat context
3893 if(ctx->magic != AARU_MAGIC)
3894 {
3895 FATAL("Invalid context");
3896
3897 TRACE("Exiting aaruf_clear_creator() = AARUF_ERROR_NOT_AARUFORMAT");
3899 }
3900
3901 // Check we are writing
3902 if(!ctx->is_writing)
3903 {
3904 FATAL("Trying to write a read-only image");
3905
3906 TRACE("Exiting aaruf_clear_creator() = AARUF_READ_ONLY");
3907 return AARUF_READ_ONLY;
3908 }
3909
3911 {
3912 TRACE("Exiting aaruf_clear_creator() = AARUF_STATUS_OK");
3913 return AARUF_STATUS_OK;
3914 }
3915
3916 if(ctx->creator != NULL) free(ctx->creator);
3917
3918 ctx->creator = NULL;
3920
3921 // Check if all metadata is clear
3931
3932 TRACE("Exiting aaruf_clear_creator() = AARUF_STATUS_OK");
3933 return AARUF_STATUS_OK;
3934}
3935
4007{
4008 TRACE("Entering aaruf_clear_comments(%p)", context);
4009
4010 // Check context is correct AaruFormat context
4011 if(context == NULL)
4012 {
4013 FATAL("Invalid context");
4014
4015 TRACE("Exiting aaruf_clear_comments() = AARUF_ERROR_NOT_AARUFORMAT");
4017 }
4018
4019 aaruformat_context *ctx = context;
4020
4021 // Not a libaaruformat context
4022 if(ctx->magic != AARU_MAGIC)
4023 {
4024 FATAL("Invalid context");
4025
4026 TRACE("Exiting aaruf_clear_comments() = AARUF_ERROR_NOT_AARUFORMAT");
4028 }
4029
4030 // Check we are writing
4031 if(!ctx->is_writing)
4032 {
4033 FATAL("Trying to write a read-only image");
4034
4035 TRACE("Exiting aaruf_clear_comments() = AARUF_READ_ONLY");
4036 return AARUF_READ_ONLY;
4037 }
4038
4040 {
4041 TRACE("Exiting aaruf_clear_comments() = AARUF_STATUS_OK");
4042 return AARUF_STATUS_OK;
4043 }
4044
4045 if(ctx->comments != NULL) free(ctx->comments);
4046
4047 ctx->comments = NULL;
4049
4050 // Check if all metadata is clear
4060
4061 TRACE("Exiting aaruf_clear_comments() = AARUF_STATUS_OK");
4062 return AARUF_STATUS_OK;
4063}
4064
4090{
4091 TRACE("Entering aaruf_clear_media_title(%p)", context);
4092
4093 // Check context is correct AaruFormat context
4094 if(context == NULL)
4095 {
4096 FATAL("Invalid context");
4097
4098 TRACE("Exiting aaruf_clear_media_title() = AARUF_ERROR_NOT_AARUFORMAT");
4100 }
4101
4102 aaruformat_context *ctx = context;
4103
4104 // Not a libaaruformat context
4105 if(ctx->magic != AARU_MAGIC)
4106 {
4107 FATAL("Invalid context");
4108
4109 TRACE("Exiting aaruf_clear_media_title() = AARUF_ERROR_NOT_AARUFORMAT");
4111 }
4112
4113 // Check we are writing
4114 if(!ctx->is_writing)
4115 {
4116 FATAL("Trying to write a read-only image");
4117
4118 TRACE("Exiting aaruf_clear_media_title() = AARUF_READ_ONLY");
4119 return AARUF_READ_ONLY;
4120 }
4121
4123 {
4124 TRACE("Exiting aaruf_clear_media_title() = AARUF_STATUS_OK");
4125 return AARUF_STATUS_OK;
4126 }
4127
4128 if(ctx->media_title != NULL) free(ctx->media_title);
4129
4130 ctx->media_title = NULL;
4132
4133 // Check if all metadata is clear
4143
4144 TRACE("Exiting aaruf_clear_media_title() = AARUF_STATUS_OK");
4145 return AARUF_STATUS_OK;
4146}
4147
4174{
4175 TRACE("Entering aaruf_clear_media_manufacturer(%p)", context);
4176
4177 // Check context is correct AaruFormat context
4178 if(context == NULL)
4179 {
4180 FATAL("Invalid context");
4181
4182 TRACE("Exiting aaruf_clear_media_manufacturer() = AARUF_ERROR_NOT_AARUFORMAT");
4184 }
4185
4186 aaruformat_context *ctx = context;
4187
4188 // Not a libaaruformat context
4189 if(ctx->magic != AARU_MAGIC)
4190 {
4191 FATAL("Invalid context");
4192
4193 TRACE("Exiting aaruf_clear_media_manufacturer() = AARUF_ERROR_NOT_AARUFORMAT");
4195 }
4196
4197 // Check we are writing
4198 if(!ctx->is_writing)
4199 {
4200 FATAL("Trying to write a read-only image");
4201
4202 TRACE("Exiting aaruf_clear_media_manufacturer() = AARUF_READ_ONLY");
4203 return AARUF_READ_ONLY;
4204 }
4205
4207 {
4208 TRACE("Exiting aaruf_clear_media_manufacturer() = AARUF_STATUS_OK");
4209 return AARUF_STATUS_OK;
4210 }
4211
4212 if(ctx->media_manufacturer != NULL) free(ctx->media_manufacturer);
4213
4214 ctx->media_manufacturer = NULL;
4216
4217 // Check if all metadata is clear
4227
4228 TRACE("Exiting aaruf_clear_media_manufacturer() = AARUF_STATUS_OK");
4229 return AARUF_STATUS_OK;
4230}
4231
4258{
4259 TRACE("Entering aaruf_clear_media_model(%p)", context);
4260
4261 // Check context is correct AaruFormat context
4262 if(context == NULL)
4263 {
4264 FATAL("Invalid context");
4265
4266 TRACE("Exiting aaruf_clear_media_model() = AARUF_ERROR_NOT_AARUFORMAT");
4268 }
4269
4270 aaruformat_context *ctx = context;
4271
4272 // Not a libaaruformat context
4273 if(ctx->magic != AARU_MAGIC)
4274 {
4275 FATAL("Invalid context");
4276
4277 TRACE("Exiting aaruf_clear_media_model() = AARUF_ERROR_NOT_AARUFORMAT");
4279 }
4280
4281 // Check we are writing
4282 if(!ctx->is_writing)
4283 {
4284 FATAL("Trying to write a read-only image");
4285
4286 TRACE("Exiting aaruf_clear_media_model() = AARUF_READ_ONLY");
4287 return AARUF_READ_ONLY;
4288 }
4289
4291 {
4292 TRACE("Exiting aaruf_clear_media_model() = AARUF_STATUS_OK");
4293 return AARUF_STATUS_OK;
4294 }
4295
4296 if(ctx->media_model != NULL) free(ctx->media_model);
4297
4298 ctx->media_model = NULL;
4300
4301 // Check if all metadata is clear
4311
4312 TRACE("Exiting aaruf_clear_media_model() = AARUF_STATUS_OK");
4313 return AARUF_STATUS_OK;
4314}
4315
4344{
4345 TRACE("Entering aaruf_clear_media_serial_number(%p)", context);
4346
4347 // Check context is correct AaruFormat context
4348 if(context == NULL)
4349 {
4350 FATAL("Invalid context");
4351
4352 TRACE("Exiting aaruf_clear_media_serial_number() = AARUF_ERROR_NOT_AARUFORMAT");
4354 }
4355
4356 aaruformat_context *ctx = context;
4357
4358 // Not a libaaruformat context
4359 if(ctx->magic != AARU_MAGIC)
4360 {
4361 FATAL("Invalid context");
4362
4363 TRACE("Exiting aaruf_clear_media_serial_number() = AARUF_ERROR_NOT_AARUFORMAT");
4365 }
4366
4367 // Check we are writing
4368 if(!ctx->is_writing)
4369 {
4370 FATAL("Trying to write a read-only image");
4371
4372 TRACE("Exiting aaruf_clear_media_serial_number() = AARUF_READ_ONLY");
4373 return AARUF_READ_ONLY;
4374 }
4375
4377 {
4378 TRACE("Exiting aaruf_clear_media_serial_number() = AARUF_STATUS_OK");
4379 return AARUF_STATUS_OK;
4380 }
4381
4382 if(ctx->media_serial_number != NULL) free(ctx->media_serial_number);
4383
4384 ctx->media_serial_number = NULL;
4386
4387 // Check if all metadata is clear
4397
4398 TRACE("Exiting aaruf_clear_media_serial_number() = AARUF_STATUS_OK");
4399 return AARUF_STATUS_OK;
4400}
4401
4430{
4431 TRACE("Entering aaruf_clear_media_barcode(%p)", context);
4432
4433 // Check context is correct AaruFormat context
4434 if(context == NULL)
4435 {
4436 FATAL("Invalid context");
4437
4438 TRACE("Exiting aaruf_clear_media_barcode() = AARUF_ERROR_NOT_AARUFORMAT");
4440 }
4441
4442 aaruformat_context *ctx = context;
4443
4444 // Not a libaaruformat context
4445 if(ctx->magic != AARU_MAGIC)
4446 {
4447 FATAL("Invalid context");
4448
4449 TRACE("Exiting aaruf_clear_media_barcode() = AARUF_ERROR_NOT_AARUFORMAT");
4451 }
4452
4453 // Check we are writing
4454 if(!ctx->is_writing)
4455 {
4456 FATAL("Trying to write a read-only image");
4457
4458 TRACE("Exiting aaruf_clear_media_barcode() = AARUF_READ_ONLY");
4459 return AARUF_READ_ONLY;
4460 }
4461
4463 {
4464 TRACE("Exiting aaruf_clear_media_barcode() = AARUF_STATUS_OK");
4465 return AARUF_STATUS_OK;
4466 }
4467
4468 if(ctx->media_barcode != NULL) free(ctx->media_barcode);
4469
4470 ctx->media_barcode = NULL;
4472
4473 // Check if all metadata is clear
4483
4484 TRACE("Exiting aaruf_clear_media_barcode() = AARUF_STATUS_OK");
4485 return AARUF_STATUS_OK;
4486}
4487
4516{
4517 TRACE("Entering aaruf_clear_media_part_number(%p)", context);
4518
4519 // Check context is correct AaruFormat context
4520 if(context == NULL)
4521 {
4522 FATAL("Invalid context");
4523
4524 TRACE("Exiting aaruf_clear_media_part_number() = AARUF_ERROR_NOT_AARUFORMAT");
4526 }
4527
4528 aaruformat_context *ctx = context;
4529
4530 // Not a libaaruformat context
4531 if(ctx->magic != AARU_MAGIC)
4532 {
4533 FATAL("Invalid context");
4534
4535 TRACE("Exiting aaruf_clear_media_part_number() = AARUF_ERROR_NOT_AARUFORMAT");
4537 }
4538
4539 // Check we are writing
4540 if(!ctx->is_writing)
4541 {
4542 FATAL("Trying to write a read-only image");
4543
4544 TRACE("Exiting aaruf_clear_media_part_number() = AARUF_READ_ONLY");
4545 return AARUF_READ_ONLY;
4546 }
4547
4549 {
4550 TRACE("Exiting aaruf_clear_media_part_number() = AARUF_STATUS_OK");
4551 return AARUF_STATUS_OK;
4552 }
4553
4554 if(ctx->media_part_number != NULL) free(ctx->media_part_number);
4555
4556 ctx->media_part_number = NULL;
4558
4559 // Check if all metadata is clear
4569
4570 TRACE("Exiting aaruf_clear_media_part_number() = AARUF_STATUS_OK");
4571 return AARUF_STATUS_OK;
4572}
4573
4602{
4603 TRACE("Entering aaruf_clear_drive_manufacturer(%p)", context);
4604
4605 // Check context is correct AaruFormat context
4606 if(context == NULL)
4607 {
4608 FATAL("Invalid context");
4609
4610 TRACE("Exiting aaruf_clear_drive_manufacturer() = AARUF_ERROR_NOT_AARUFORMAT");
4612 }
4613
4614 aaruformat_context *ctx = context;
4615
4616 // Not a libaaruformat context
4617 if(ctx->magic != AARU_MAGIC)
4618 {
4619 FATAL("Invalid context");
4620
4621 TRACE("Exiting aaruf_clear_drive_manufacturer() = AARUF_ERROR_NOT_AARUFORMAT");
4623 }
4624
4625 // Check we are writing
4626 if(!ctx->is_writing)
4627 {
4628 FATAL("Trying to write a read-only image");
4629
4630 TRACE("Exiting aaruf_clear_drive_manufacturer() = AARUF_READ_ONLY");
4631 return AARUF_READ_ONLY;
4632 }
4633
4635 {
4636 TRACE("Exiting aaruf_clear_drive_manufacturer() = AARUF_STATUS_OK");
4637 return AARUF_STATUS_OK;
4638 }
4639
4640 if(ctx->drive_manufacturer != NULL) free(ctx->drive_manufacturer);
4641
4642 ctx->drive_manufacturer = NULL;
4644
4645 // Check if all metadata is clear
4654
4655 TRACE("Exiting aaruf_clear_drive_manufacturer() = AARUF_STATUS_OK");
4656 return AARUF_STATUS_OK;
4657}
4658
4688{
4689 TRACE("Entering aaruf_clear_drive_model(%p)", context);
4690
4691 // Check context is correct AaruFormat context
4692 if(context == NULL)
4693 {
4694 FATAL("Invalid context");
4695
4696 TRACE("Exiting aaruf_clear_drive_model() = AARUF_ERROR_NOT_AARUFORMAT");
4698 }
4699
4700 aaruformat_context *ctx = context;
4701
4702 // Not a libaaruformat context
4703 if(ctx->magic != AARU_MAGIC)
4704 {
4705 FATAL("Invalid context");
4706
4707 TRACE("Exiting aaruf_clear_drive_model() = AARUF_ERROR_NOT_AARUFORMAT");
4709 }
4710
4711 // Check we are writing
4712 if(!ctx->is_writing)
4713 {
4714 FATAL("Trying to write a read-only image");
4715
4716 TRACE("Exiting aaruf_clear_drive_model() = AARUF_READ_ONLY");
4717 return AARUF_READ_ONLY;
4718 }
4719
4721 {
4722 TRACE("Exiting aaruf_clear_drive_model() = AARUF_STATUS_OK");
4723 return AARUF_STATUS_OK;
4724 }
4725
4726 if(ctx->drive_model != NULL) free(ctx->drive_model);
4727
4728 ctx->drive_model = NULL;
4730
4731 // Check if all metadata is clear
4741
4742 TRACE("Exiting aaruf_clear_drive_model() = AARUF_STATUS_OK");
4743 return AARUF_STATUS_OK;
4744}
4745
4777{
4778 TRACE("Entering aaruf_clear_drive_serial_number(%p)", context);
4779
4780 // Check context is correct AaruFormat context
4781 if(context == NULL)
4782 {
4783 FATAL("Invalid context");
4784
4785 TRACE("Exiting aaruf_clear_drive_serial_number() = AARUF_ERROR_NOT_AARUFORMAT");
4787 }
4788
4789 aaruformat_context *ctx = context;
4790
4791 // Not a libaaruformat context
4792 if(ctx->magic != AARU_MAGIC)
4793 {
4794 FATAL("Invalid context");
4795
4796 TRACE("Exiting aaruf_clear_drive_serial_number() = AARUF_ERROR_NOT_AARUFORMAT");
4798 }
4799
4800 // Check we are writing
4801 if(!ctx->is_writing)
4802 {
4803 FATAL("Trying to write a read-only image");
4804
4805 TRACE("Exiting aaruf_clear_drive_serial_number() = AARUF_READ_ONLY");
4806 return AARUF_READ_ONLY;
4807 }
4808
4810 {
4811 TRACE("Exiting aaruf_clear_drive_serial_number() = AARUF_STATUS_OK");
4812 return AARUF_STATUS_OK;
4813 }
4814
4815 if(ctx->drive_serial_number != NULL) free(ctx->drive_serial_number);
4816
4817 ctx->drive_serial_number = NULL;
4819
4820 // Check if all metadata is clear
4829
4830 TRACE("Exiting aaruf_clear_drive_serial_number() = AARUF_STATUS_OK");
4831 return AARUF_STATUS_OK;
4832}
4833
4865{
4866 TRACE("Entering aaruf_clear_drive_firmware_revision(%p)", context);
4867
4868 // Check context is correct AaruFormat context
4869 if(context == NULL)
4870 {
4871 FATAL("Invalid context");
4872
4873 TRACE("Exiting aaruf_clear_drive_firmware_revision() = AARUF_ERROR_NOT_AARUFORMAT");
4875 }
4876
4877 aaruformat_context *ctx = context;
4878
4879 // Not a libaaruformat context
4880 if(ctx->magic != AARU_MAGIC)
4881 {
4882 FATAL("Invalid context");
4883
4884 TRACE("Exiting aaruf_clear_drive_firmware_revision() = AARUF_ERROR_NOT_AARUFORMAT");
4886 }
4887
4888 // Check we are writing
4889 if(!ctx->is_writing)
4890 {
4891 FATAL("Trying to write a read-only image");
4892
4893 TRACE("Exiting aaruf_clear_drive_firmware_revision() = AARUF_READ_ONLY");
4894 return AARUF_READ_ONLY;
4895 }
4896
4898 {
4899 TRACE("Exiting aaruf_clear_drive_firmware_revision() = AARUF_STATUS_OK");
4900 return AARUF_STATUS_OK;
4901 }
4902
4903 if(ctx->drive_firmware_revision != NULL) free(ctx->drive_firmware_revision);
4904
4905 ctx->drive_firmware_revision = NULL;
4907
4908 // Check if all metadata is clear
4917
4918 TRACE("Exiting aaruf_clear_drive_firmware_revision() = AARUF_STATUS_OK");
4919 return AARUF_STATUS_OK;
4920}
#define AARU_MAGIC
Magic identifier for AaruFormat container (ASCII "AARUFRMT").
Definition consts.h:64
#define AARU_CALL
Definition decls.h:45
#define AARU_EXPORT
Definition decls.h:54
@ 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:2104
int32_t aaruf_clear_media_sequence(void *context)
Clears the media sequence information from the image metadata.
Definition metadata.c:3746
int32_t aaruf_clear_drive_firmware_revision(void *context)
Clears the drive firmware revision from the image metadata.
Definition metadata.c:4864
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:1180
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:943
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:365
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:3114
int32_t aaruf_clear_media_serial_number(void *context)
Clears the media serial number from the image metadata.
Definition metadata.c:4343
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:1416
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:1538
int32_t aaruf_clear_media_barcode(void *context)
Clears the media barcode information from the image metadata.
Definition metadata.c:4429
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:723
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:2410
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:3184
int32_t aaruf_clear_media_title(void *context)
Clears the media title or label from the image metadata.
Definition metadata.c:4089
int32_t aaruf_clear_media_manufacturer(void *context)
Clears the media manufacturer information from the image metadata.
Definition metadata.c:4173
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:1949
int32_t aaruf_clear_drive_model(void *context)
Clears the drive model information from the image metadata.
Definition metadata.c:4687
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:2762
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:2902
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:2692
int32_t aaruf_get_media_manufacturer(const void *context, uint8_t *buffer, int32_t *length)
Retrieves the recorded media manufacturer name.
Definition metadata.c:2622
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:3044
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:2831
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:2974
int32_t aaruf_clear_drive_manufacturer(void *context)
Clears the drive manufacturer information from the image metadata.
Definition metadata.c:4601
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:3640
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:3298
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:2263
int32_t aaruf_clear_media_part_number(void *context)
Clears the media part number or model designation from the image metadata.
Definition metadata.c:4515
int32_t aaruf_clear_comments(void *context)
Clears user comments or notes from the image metadata.
Definition metadata.c:4006
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:3423
int32_t aaruf_clear_media_model(void *context)
Clears the media model or product designation from the image metadata.
Definition metadata.c:4257
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:2482
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:2343
int32_t aaruf_clear_drive_serial_number(void *context)
Clears the drive serial number from the image metadata.
Definition metadata.c:4776
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_clear_creator(void *context)
Clears the creator (person/operator) information from the image metadata.
Definition metadata.c:3877
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:1301
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:1058
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:230
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:610
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:1797
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:836
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:1662
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:3558
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:2552
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:496
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:922
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 dirty_json_block
True if JSON metadata block should be written during close.
Definition context.h:329
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
bool dirty_metadata_block
True if metadata block should be written during close.
Definition context.h:326
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
bool dirty_geometry_block
True if geometry block should be written during close.
Definition context.h:325
uint8_t * media_manufacturer
Manufacturer of the media represented by the image.
Definition context.h:219