28 if(entries == NULL)
return;
30 for(uint32_t e = 0; e < count; e++)
32 free(entries[e].manufacturer);
33 free(entries[e].model);
34 free(entries[e].revision);
35 free(entries[e].firmware);
36 free(entries[e].serial);
37 free(entries[e].softwareName);
38 free(entries[e].softwareVersion);
39 free(entries[e].softwareOperatingSystem);
40 free(entries[e].extents);
188 size_t length_value = 0;
189 if(length != NULL) length_value = *length;
191 TRACE(
"Entering aaruf_get_dumphw(%p, %p, %zu)", context, buffer, length_value);
197 FATAL(
"Invalid context");
199 TRACE(
"Exiting aaruf_get_dumphw() = AARUF_ERROR_NOT_AARUFORMAT");
205 FATAL(
"Invalid length pointer");
207 TRACE(
"Exiting aaruf_get_dumphw() = AARUF_ERROR_INCORRECT_DATA_SIZE");
216 FATAL(
"Invalid context");
218 TRACE(
"Exiting aaruf_get_dumphw() = AARUF_ERROR_NOT_AARUFORMAT");
225 FATAL(
"No dump hardware information present");
227 TRACE(
"Exiting aaruf_get_dumphw() = AARUF_ERROR_CANNOT_READ_BLOCK");
234 FATAL(
"Dump hardware payload length overflow");
236 TRACE(
"Exiting aaruf_get_dumphw() = AARUF_ERROR_INCORRECT_DATA_SIZE");
240 if(buffer == NULL || *length < required_length)
242 TRACE(
"Buffer too small for dump hardware block, required %zu bytes", required_length);
243 *length = required_length;
245 TRACE(
"Exiting aaruf_get_dumphw() = AARUF_ERROR_BUFFER_TOO_SMALL");
249 *length = required_length;
262 FATAL(
"Dump hardware extent size overflow");
263 TRACE(
"Exiting aaruf_get_dumphw() = AARUF_ERROR_INCORRECT_DATA_SIZE");
277 for(
size_t j = 0; j <
sizeof(additive_lengths) /
sizeof(additive_lengths[0]); j++)
279 if(additive_lengths[j] > SIZE_MAX - entry_size)
281 FATAL(
"Dump hardware entry size overflow");
282 TRACE(
"Exiting aaruf_get_dumphw() = AARUF_ERROR_INCORRECT_DATA_SIZE");
285 entry_size += additive_lengths[j];
288 if(offset + entry_size > *length)
290 FATAL(
"Calculated size exceeds provided buffer length");
291 TRACE(
"Exiting aaruf_get_dumphw() = AARUF_ERROR_BUFFER_TOO_SMALL");
356 offset += extent_bytes;
367 TRACE(
"Exiting aaruf_get_dumphw() = AARUF_STATUS_OK");
533 TRACE(
"Entering aaruf_set_dumphw(%p, %p, %zu)", context, data, length);
538 FATAL(
"Invalid context");
540 TRACE(
"Exiting aaruf_set_dumphw() = AARUF_ERROR_NOT_AARUFORMAT");
549 FATAL(
"Invalid context");
551 TRACE(
"Exiting aaruf_set_dumphw() = AARUF_ERROR_NOT_AARUFORMAT");
558 FATAL(
"Trying to write a read-only image");
560 TRACE(
"Exiting aaruf_set_dumphw() = AARUF_READ_ONLY");
564 if(data == NULL || length == 0)
566 FATAL(
"Invalid data or length");
568 TRACE(
"Exiting aaruf_set_dumphw() = AARUF_ERROR_INCORRECT_DATA_SIZE");
574 FATAL(
"Dump hardware block shorter than header");
576 TRACE(
"Exiting aaruf_set_dumphw() = AARUF_ERROR_INCORRECT_DATA_SIZE");
584 FATAL(
"Invalid dump hardware block identifier");
586 TRACE(
"Exiting aaruf_set_dumphw() = AARUF_ERROR_CANNOT_READ_BLOCK");
592 FATAL(
"Invalid dump hardware block length");
594 TRACE(
"Exiting aaruf_set_dumphw() = AARUF_ERROR_INCORRECT_DATA_SIZE");
599 if(header.
crc64 != crc64)
601 FATAL(
"Invalid dump hardware block CRC64");
603 TRACE(
"Exiting aaruf_set_dumphw() = AARUF_ERROR_INVALID_BLOCK_CRC");
613 TRACE(
"Could not allocate memory for dump hardware block entries");
614 TRACE(
"Exiting aaruf_set_dumphw() = AARUF_ERROR_NOT_ENOUGH_MEMORY");
619 TRACE(
"Processing %u dump hardware block entries", header.
entries);
623#define COPY_STRING_FIELD(field) \
625 const size_t field##_length = copy[e].entry.field##Length; \
626 if(field##_length > 0) \
628 if(field##_length > length - pos) goto invalid_data; \
629 copy[e].field = (uint8_t *)calloc(1, field##_length + 1); \
630 if(copy[e].field == NULL) goto free_copy_and_error; \
631 memcpy(copy[e].field, data + pos, field##_length); \
632 pos += field##_length; \
636 for(uint32_t e = 0; e < header.
entries; e++)
655 const size_t extent_bytes = (size_t)extent_count *
sizeof(
DumpExtent);
656 if(extent_bytes /
sizeof(
DumpExtent) != extent_count || extent_bytes > length - pos)
goto invalid_data;
659 if(copy[e].extents == NULL)
goto free_copy_and_error;
661 memcpy(copy[e].extents, data + pos, extent_bytes);
665 TRACE(
"Sorted %u extents for entry %u", extent_count, e);
669#undef COPY_STRING_FIELD
673 FATAL(
"Dump hardware block contains trailing data");
681 TRACE(
"Exiting aaruf_set_dumphw() = AARUF_STATUS_OK");
685 TRACE(
"Dump hardware block truncated or malformed");
687 TRACE(
"Exiting aaruf_set_dumphw() = AARUF_ERROR_INCORRECT_DATA_SIZE");
692 TRACE(
"Exiting aaruf_set_dumphw() = AARUF_ERROR_NOT_ENOUGH_MEMORY");
#define AARU_MAGIC
Magic identifier for AaruFormat container (ASCII "AARUFRMT").
uint64_t aaruf_crc64_data(const uint8_t *data, uint32_t len)
int32_t aaruf_get_dumphw(void *context, uint8_t *buffer, size_t *length)
Retrieves the dump hardware block containing acquisition environment information.
#define COPY_STRING_FIELD(field)
static void free_dump_hardware_entries(DumpHardwareEntriesWithData *entries, uint32_t count)
int32_t aaruf_set_dumphw(void *context, uint8_t *data, size_t length)
Sets the dump hardware block for the image during creation.
@ DumpHardwareBlock
Block containing an array of hardware used to create the image.
#define AARUF_STATUS_OK
Sector present and read without uncorrectable errors.
#define AARUF_READ_ONLY
Operation requires write mode but context is read-only.
#define AARUF_ERROR_NOT_ENOUGH_MEMORY
Memory allocation failure (critical).
#define AARUF_ERROR_CANNOT_READ_BLOCK
Generic block read failure (seek/read error).
#define AARUF_ERROR_INCORRECT_DATA_SIZE
Data size does not match expected size.
#define AARUF_ERROR_INVALID_BLOCK_CRC
CRC64 mismatch indicating corruption.
#define AARUF_ERROR_NOT_AARUFORMAT
Input file/stream failed magic or structural validation.
#define AARUF_ERROR_BUFFER_TOO_SMALL
Caller-supplied buffer insufficient for data.
int compare_extents(const void *a, const void *b)
Comparison function for sorting DumpExtent arrays by start sector.
Inclusive [start,end] logical sector range contributed by a single hardware environment.
In-memory representation of a dump hardware entry plus decoded variable-length fields & extents.
uint8_t * firmware
Firmware version string or NULL.
uint8_t * revision
Hardware revision string or NULL.
uint8_t * model
Model string or NULL.
uint8_t * softwareName
Dump software name or NULL.
struct DumpExtent * extents
Array of extents (entry.extents elements) or NULL.
uint8_t * manufacturer
Manufacturer string (UTF-8) or NULL.
uint8_t * softwareVersion
Dump software version or NULL.
uint8_t * serial
Serial number string or NULL.
DumpHardwareEntry entry
Fixed-size header with lengths & counts.
uint8_t * softwareOperatingSystem
Host operating system string or NULL.
Per-environment length table describing subsequent UTF-8 strings and optional extent array.
uint32_t softwareNameLength
Length in bytes of dumping software name string.
uint32_t manufacturerLength
Length in bytes of manufacturer UTF-8 string.
uint32_t softwareVersionLength
Length in bytes of dumping software version string.
uint32_t firmwareLength
Length in bytes of firmware version string.
uint32_t extents
Number of DumpExtent records following the strings (0 = none).
uint32_t modelLength
Length in bytes of model UTF-8 string.
uint32_t serialLength
Length in bytes of device serial number string.
uint32_t revisionLength
Length in bytes of revision / hardware revision string.
uint32_t softwareOperatingSystemLength
Length in bytes of host operating system string.
Master context representing an open or in‑creation Aaru image.
bool is_writing
True if context opened/created for writing.
uint64_t magic
File magic (AARU_MAGIC) post-open.
struct DumpHardwareEntriesWithData * dump_hardware_entries_with_data
Array of dump hardware entries + strings.
DumpHardwareHeader dump_hardware_header
Dump hardware header.