diff --git a/CMakeLists.txt b/CMakeLists.txt
index df1d544..08a1325 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -113,7 +113,8 @@ add_library(aaruformat SHARED include/aaruformat/consts.h include/aaruformat/enu
src/blocks/data.c
src/ddt/ddt_v1.c
src/blocks/metadata.c
- src/blocks/optical.c)
+ src/blocks/optical.c
+ src/blocks/dump.c)
include_directories(include include/aaruformat)
diff --git a/include/internal.h b/include/internal.h
index 2b0c0a3..29eaa84 100644
--- a/include/internal.h
+++ b/include/internal.h
@@ -31,5 +31,6 @@ void process_metadata_block(aaruformatContext *ctx, const IndexEntry *entry
void process_geometry_block(aaruformatContext *ctx, const IndexEntry *entry);
void process_tracks_block(aaruformatContext *ctx, const IndexEntry *entry);
void process_cicm_block(aaruformatContext *ctx, const IndexEntry *entry);
+void process_dumphw_block(aaruformatContext *ctx, const IndexEntry *entry);
#endif // LIBAARUFORMAT_INTERNAL_H
diff --git a/src/blocks/dump.c b/src/blocks/dump.c
new file mode 100644
index 0000000..6aa106d
--- /dev/null
+++ b/src/blocks/dump.c
@@ -0,0 +1,316 @@
+/*
+ * This file is part of the Aaru Data Preservation Suite.
+ * Copyright (c) 2019-2025 Natalia Portillo.
+ *
+ * This library is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of the
+ * License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, see .
+ */
+
+#include
+#include
+#include
+#include
+
+#include "aaruformat.h"
+
+void process_dumphw_block(aaruformatContext *ctx, const IndexEntry *entry)
+{
+ int pos = 0;
+ size_t readBytes = 0;
+ uint64_t crc64 = 0;
+ uint16_t e = 0;
+ uint8_t *data = NULL;
+
+ // Check if the context and image stream are valid
+ if(ctx == NULL || ctx->imageStream == NULL)
+ {
+ fprintf(stderr, "Invalid context or image stream.\n");
+ return;
+ }
+
+ // Seek to block
+ pos = fseek(ctx->imageStream, entry->offset, SEEK_SET);
+ if(pos < 0 || ftell(ctx->imageStream) != entry->offset)
+ {
+ fprintf(stderr, "libaaruformat: Could not seek to %" PRIu64 " as indicated by index entry...\n", entry->offset);
+
+ return;
+ }
+
+ // Even if those two checks shall have been done before
+ readBytes = fread(&ctx->dumpHardwareHeader, 1, sizeof(DumpHardwareHeader), ctx->imageStream);
+
+ if(readBytes != sizeof(DumpHardwareHeader))
+ {
+ memset(&ctx->dumpHardwareHeader, 0, sizeof(DumpHardwareHeader));
+ fprintf(stderr, "libaaruformat: Could not read dump hardware block header, continuing...\n");
+ return;
+ }
+
+ if(ctx->dumpHardwareHeader.identifier != DumpHardwareBlock)
+ {
+ memset(&ctx->dumpHardwareHeader, 0, sizeof(DumpHardwareHeader));
+ fprintf(stderr, "libaaruformat: Incorrect identifier for data block at position %" PRIu64 "\n", entry->offset);
+ }
+
+ data = (uint8_t *)malloc(ctx->dumpHardwareHeader.length);
+
+ if(data == NULL)
+ {
+ memset(&ctx->dumpHardwareHeader, 0, sizeof(DumpHardwareHeader));
+ fprintf(stderr, "libaaruformat: Could not allocate memory for dump hardware block, continuing...\n");
+ return;
+ }
+
+ readBytes = fread(data, 1, ctx->dumpHardwareHeader.length, ctx->imageStream);
+
+ if(readBytes == ctx->dumpHardwareHeader.length)
+ {
+ crc64 = aaruf_crc64_data(data, ctx->dumpHardwareHeader.length);
+
+ // Due to how C# wrote it, it is effectively reversed
+ if(ctx->header.imageMajorVersion <= AARUF_VERSION) crc64 = bswap_64(crc64);
+
+ if(crc64 != ctx->dumpHardwareHeader.crc64)
+ {
+ free(data);
+ fprintf(stderr,
+ "libaaruformat: Incorrect CRC found: 0x%" PRIx64 " found, expected 0x%" PRIx64 ", continuing...\n",
+ crc64, ctx->dumpHardwareHeader.crc64);
+ return;
+ }
+ }
+
+ free(data);
+ fseek(ctx->imageStream, -(long)readBytes, SEEK_CUR);
+
+ ctx->dumpHardwareEntriesWithData =
+ (DumpHardwareEntriesWithData *)malloc(sizeof(DumpHardwareEntriesWithData) * ctx->dumpHardwareHeader.entries);
+
+ if(ctx->dumpHardwareEntriesWithData == NULL)
+ {
+ memset(&ctx->dumpHardwareHeader, 0, sizeof(DumpHardwareHeader));
+ fprintf(stderr, "libaaruformat: Could not allocate memory for dump hardware block, continuing...\n");
+ return;
+ }
+
+ memset(ctx->dumpHardwareEntriesWithData, 0, sizeof(DumpHardwareEntriesWithData) * ctx->dumpHardwareHeader.entries);
+
+ for(e = 0; e < ctx->dumpHardwareHeader.entries; e++)
+ {
+ readBytes = fread(&ctx->dumpHardwareEntriesWithData[e].entry, 1, sizeof(DumpHardwareEntry), ctx->imageStream);
+
+ if(readBytes != sizeof(DumpHardwareEntry))
+ {
+ ctx->dumpHardwareHeader.entries = e;
+ fprintf(stderr, "libaaruformat: Could not read dump hardware block entry, continuing...\n");
+ break;
+ }
+
+ if(ctx->dumpHardwareEntriesWithData[e].entry.manufacturerLength > 0)
+ {
+ ctx->dumpHardwareEntriesWithData[e].manufacturer =
+ (uint8_t *)malloc(ctx->dumpHardwareEntriesWithData[e].entry.manufacturerLength + 1);
+
+ if(ctx->dumpHardwareEntriesWithData[e].manufacturer != NULL)
+ {
+ ctx->dumpHardwareEntriesWithData[e]
+ .manufacturer[ctx->dumpHardwareEntriesWithData[e].entry.manufacturerLength] = 0;
+ readBytes = fread(ctx->dumpHardwareEntriesWithData[e].manufacturer, 1,
+ ctx->dumpHardwareEntriesWithData[e].entry.manufacturerLength, ctx->imageStream);
+
+ if(readBytes != ctx->dumpHardwareEntriesWithData[e].entry.manufacturerLength)
+ {
+ free(ctx->dumpHardwareEntriesWithData[e].manufacturer);
+ ctx->dumpHardwareEntriesWithData[e].entry.manufacturerLength = 0;
+ fprintf(stderr, "libaaruformat: Could not read dump hardware block entry manufacturer, "
+ "continuing...\n");
+ }
+ }
+ }
+
+ if(ctx->dumpHardwareEntriesWithData[e].entry.modelLength > 0)
+ {
+ ctx->dumpHardwareEntriesWithData[e].model =
+ (uint8_t *)malloc(ctx->dumpHardwareEntriesWithData[e].entry.modelLength + 1);
+
+ if(ctx->dumpHardwareEntriesWithData[e].model != NULL)
+ {
+ ctx->dumpHardwareEntriesWithData[e].model[ctx->dumpHardwareEntriesWithData[e].entry.modelLength] = 0;
+ readBytes = fread(ctx->dumpHardwareEntriesWithData[e].model, 1,
+ ctx->dumpHardwareEntriesWithData[e].entry.modelLength, ctx->imageStream);
+
+ if(readBytes != ctx->dumpHardwareEntriesWithData[e].entry.modelLength)
+ {
+ free(ctx->dumpHardwareEntriesWithData[e].model);
+ ctx->dumpHardwareEntriesWithData[e].entry.modelLength = 0;
+ fprintf(stderr, "libaaruformat: Could not read dump hardware block entry model, continuing...\n");
+ }
+ }
+ }
+
+ if(ctx->dumpHardwareEntriesWithData[e].entry.revisionLength > 0)
+ {
+ ctx->dumpHardwareEntriesWithData[e].revision =
+ (uint8_t *)malloc(ctx->dumpHardwareEntriesWithData[e].entry.revisionLength + 1);
+
+ if(ctx->dumpHardwareEntriesWithData[e].revision != NULL)
+ {
+ ctx->dumpHardwareEntriesWithData[e].revision[ctx->dumpHardwareEntriesWithData[e].entry.revisionLength] =
+ 0;
+ readBytes = fread(ctx->dumpHardwareEntriesWithData[e].revision, 1,
+ ctx->dumpHardwareEntriesWithData[e].entry.revisionLength, ctx->imageStream);
+
+ if(readBytes != ctx->dumpHardwareEntriesWithData[e].entry.revisionLength)
+ {
+ free(ctx->dumpHardwareEntriesWithData[e].revision);
+ ctx->dumpHardwareEntriesWithData[e].entry.revisionLength = 0;
+ fprintf(stderr, "libaaruformat: Could not read dump hardware block entry revision, "
+ "continuing...\n");
+ }
+ }
+ }
+
+ if(ctx->dumpHardwareEntriesWithData[e].entry.firmwareLength > 0)
+ {
+ ctx->dumpHardwareEntriesWithData[e].firmware =
+ (uint8_t *)malloc(ctx->dumpHardwareEntriesWithData[e].entry.firmwareLength + 1);
+
+ if(ctx->dumpHardwareEntriesWithData[e].firmware != NULL)
+ {
+ ctx->dumpHardwareEntriesWithData[e].firmware[ctx->dumpHardwareEntriesWithData[e].entry.firmwareLength] =
+ 0;
+ readBytes = fread(ctx->dumpHardwareEntriesWithData[e].firmware, 1,
+ ctx->dumpHardwareEntriesWithData[e].entry.firmwareLength, ctx->imageStream);
+
+ if(readBytes != ctx->dumpHardwareEntriesWithData[e].entry.firmwareLength)
+ {
+ free(ctx->dumpHardwareEntriesWithData[e].firmware);
+ ctx->dumpHardwareEntriesWithData[e].entry.firmwareLength = 0;
+ fprintf(stderr, "libaaruformat: Could not read dump hardware block entry firmware, "
+ "continuing...\n");
+ }
+ }
+ }
+
+ if(ctx->dumpHardwareEntriesWithData[e].entry.serialLength > 0)
+ {
+ ctx->dumpHardwareEntriesWithData[e].serial =
+ (uint8_t *)malloc(ctx->dumpHardwareEntriesWithData[e].entry.serialLength + 1);
+
+ if(ctx->dumpHardwareEntriesWithData[e].serial != NULL)
+ {
+ ctx->dumpHardwareEntriesWithData[e].serial[ctx->dumpHardwareEntriesWithData[e].entry.serialLength] = 0;
+ readBytes = fread(ctx->dumpHardwareEntriesWithData[e].serial, 1,
+ ctx->dumpHardwareEntriesWithData[e].entry.serialLength, ctx->imageStream);
+
+ if(readBytes != ctx->dumpHardwareEntriesWithData[e].entry.serialLength)
+ {
+ free(ctx->dumpHardwareEntriesWithData[e].serial);
+ ctx->dumpHardwareEntriesWithData[e].entry.serialLength = 0;
+ fprintf(stderr, "libaaruformat: Could not read dump hardware block entry serial, continuing...\n");
+ }
+ }
+ }
+
+ if(ctx->dumpHardwareEntriesWithData[e].entry.softwareNameLength > 0)
+ {
+ ctx->dumpHardwareEntriesWithData[e].softwareName =
+ (uint8_t *)malloc(ctx->dumpHardwareEntriesWithData[e].entry.softwareNameLength + 1);
+
+ if(ctx->dumpHardwareEntriesWithData[e].softwareName != NULL)
+ {
+ ctx->dumpHardwareEntriesWithData[e]
+ .softwareName[ctx->dumpHardwareEntriesWithData[e].entry.softwareNameLength] = 0;
+ readBytes = fread(ctx->dumpHardwareEntriesWithData[e].softwareName, 1,
+ ctx->dumpHardwareEntriesWithData[e].entry.softwareNameLength, ctx->imageStream);
+
+ if(readBytes != ctx->dumpHardwareEntriesWithData[e].entry.softwareNameLength)
+ {
+ free(ctx->dumpHardwareEntriesWithData[e].softwareName);
+ ctx->dumpHardwareEntriesWithData[e].entry.softwareNameLength = 0;
+ fprintf(stderr, "libaaruformat: Could not read dump hardware block entry software name, "
+ "continuing...\n");
+ }
+ }
+ }
+
+ if(ctx->dumpHardwareEntriesWithData[e].entry.softwareVersionLength > 0)
+ {
+ ctx->dumpHardwareEntriesWithData[e].softwareVersion =
+ (uint8_t *)malloc(ctx->dumpHardwareEntriesWithData[e].entry.softwareVersionLength + 1);
+
+ if(ctx->dumpHardwareEntriesWithData[e].softwareVersion != NULL)
+ {
+ ctx->dumpHardwareEntriesWithData[e]
+ .softwareVersion[ctx->dumpHardwareEntriesWithData[e].entry.softwareVersionLength] = 0;
+ readBytes = fread(ctx->dumpHardwareEntriesWithData[e].softwareVersion, 1,
+ ctx->dumpHardwareEntriesWithData[e].entry.softwareVersionLength, ctx->imageStream);
+
+ if(readBytes != ctx->dumpHardwareEntriesWithData[e].entry.softwareVersionLength)
+ {
+ free(ctx->dumpHardwareEntriesWithData[e].softwareVersion);
+ ctx->dumpHardwareEntriesWithData[e].entry.softwareVersionLength = 0;
+ fprintf(stderr, "libaaruformat: Could not read dump hardware block entry software version, "
+ "continuing...\n");
+ }
+ }
+ }
+
+ if(ctx->dumpHardwareEntriesWithData[e].entry.softwareOperatingSystemLength > 0)
+ {
+ ctx->dumpHardwareEntriesWithData[e].softwareOperatingSystem =
+ (uint8_t *)malloc(ctx->dumpHardwareEntriesWithData[e].entry.softwareOperatingSystemLength + 1);
+
+ if(ctx->dumpHardwareEntriesWithData[e].softwareOperatingSystem != NULL)
+ {
+ ctx->dumpHardwareEntriesWithData[e]
+ .softwareOperatingSystem[ctx->dumpHardwareEntriesWithData[e].entry.softwareOperatingSystemLength] =
+ 0;
+ readBytes =
+ fread(ctx->dumpHardwareEntriesWithData[e].softwareOperatingSystem, 1,
+ ctx->dumpHardwareEntriesWithData[e].entry.softwareOperatingSystemLength, ctx->imageStream);
+
+ if(readBytes != ctx->dumpHardwareEntriesWithData[e].entry.softwareOperatingSystemLength)
+ {
+ free(ctx->dumpHardwareEntriesWithData[e].softwareOperatingSystem);
+ ctx->dumpHardwareEntriesWithData[e].entry.softwareOperatingSystemLength = 0;
+ fprintf(stderr, "libaaruformat: Could not read dump hardware block entry manufacturer, "
+ "continuing...\n");
+ }
+ }
+ }
+
+ ctx->dumpHardwareEntriesWithData[e].extents =
+ (DumpExtent *)malloc(sizeof(DumpExtent) * ctx->dumpHardwareEntriesWithData->entry.extents);
+
+ if(ctx->dumpHardwareEntriesWithData[e].extents == NULL)
+ {
+ fprintf(stderr, "libaaruformat: Could not allocate memory for dump hardware block extents, "
+ "continuing...\n");
+ continue;
+ }
+
+ readBytes = fread(ctx->dumpHardwareEntriesWithData[e].extents, sizeof(DumpExtent),
+ ctx->dumpHardwareEntriesWithData[e].entry.extents, ctx->imageStream);
+
+ if(readBytes != ctx->dumpHardwareEntriesWithData->entry.extents)
+ {
+ free(ctx->dumpHardwareEntriesWithData[e].extents);
+ fprintf(stderr, "libaaruformat: Could not read dump hardware block extents, continuing...\n");
+ continue;
+ }
+
+ // TODO: qsort()
+ }
+}
\ No newline at end of file
diff --git a/src/open.c b/src/open.c
index b9403a5..e476289 100644
--- a/src/open.c
+++ b/src/open.c
@@ -22,10 +22,6 @@
#include
#include
-#ifdef __linux__
-#include
-#endif
-
#include
#include "internal.h"
@@ -38,9 +34,7 @@ void *aaruf_open(const char *filepath)
size_t readBytes = 0;
long pos = 0;
uint8_t *data = NULL;
- uint64_t crc64 = 0;
int i = 0, j = 0;
- uint16_t e = 0;
ChecksumHeader checksum_header;
ChecksumEntry const *checksum_entry = NULL;
uint32_t signature = 0;
@@ -241,289 +235,7 @@ void *aaruf_open(const char *filepath)
break;
// Dump hardware block
case DumpHardwareBlock:
- readBytes = fread(&ctx->dumpHardwareHeader, 1, sizeof(DumpHardwareHeader), ctx->imageStream);
-
- if(readBytes != sizeof(DumpHardwareHeader))
- {
- memset(&ctx->dumpHardwareHeader, 0, sizeof(DumpHardwareHeader));
- fprintf(stderr, "libaaruformat: Could not read dump hardware block header, continuing...\n");
- break;
- }
-
- if(ctx->dumpHardwareHeader.identifier != DumpHardwareBlock)
- {
- memset(&ctx->dumpHardwareHeader, 0, sizeof(DumpHardwareHeader));
- fprintf(stderr, "libaaruformat: Incorrect identifier for data block at position %" PRIu64 "\n",
- entry->offset);
- }
-
- data = (uint8_t *)malloc(ctx->dumpHardwareHeader.length);
-
- if(data == NULL)
- {
- memset(&ctx->dumpHardwareHeader, 0, sizeof(DumpHardwareHeader));
- fprintf(stderr,
- "libaaruformat: Could not allocate memory for dump hardware block, continuing...\n");
- break;
- }
-
- readBytes = fread(data, 1, ctx->dumpHardwareHeader.length, ctx->imageStream);
-
- if(readBytes == ctx->dumpHardwareHeader.length)
- {
- crc64 = aaruf_crc64_data(data, ctx->dumpHardwareHeader.length);
-
- // Due to how C# wrote it, it is effectively reversed
- if(ctx->header.imageMajorVersion <= AARUF_VERSION) crc64 = bswap_64(crc64);
-
- if(crc64 != ctx->dumpHardwareHeader.crc64)
- {
- free(data);
- fprintf(stderr,
- "libaaruformat: Incorrect CRC found: 0x%" PRIx64 " found, expected 0x%" PRIx64
- ", continuing...\n",
- crc64, ctx->dumpHardwareHeader.crc64);
- break;
- }
- }
-
- free(data);
- fseek(ctx->imageStream, -(long)readBytes, SEEK_CUR);
-
- ctx->dumpHardwareEntriesWithData = (DumpHardwareEntriesWithData *)malloc(
- sizeof(DumpHardwareEntriesWithData) * ctx->dumpHardwareHeader.entries);
-
- if(ctx->dumpHardwareEntriesWithData == NULL)
- {
- memset(&ctx->dumpHardwareHeader, 0, sizeof(DumpHardwareHeader));
- fprintf(stderr,
- "libaaruformat: Could not allocate memory for dump hardware block, continuing...\n");
- break;
- }
-
- memset(ctx->dumpHardwareEntriesWithData, 0,
- sizeof(DumpHardwareEntriesWithData) * ctx->dumpHardwareHeader.entries);
-
- for(e = 0; e < ctx->dumpHardwareHeader.entries; e++)
- {
- readBytes = fread(&ctx->dumpHardwareEntriesWithData[e].entry, 1, sizeof(DumpHardwareEntry),
- ctx->imageStream);
-
- if(readBytes != sizeof(DumpHardwareEntry))
- {
- ctx->dumpHardwareHeader.entries = e;
- fprintf(stderr, "libaaruformat: Could not read dump hardware block entry, continuing...\n");
- break;
- }
-
- if(ctx->dumpHardwareEntriesWithData[e].entry.manufacturerLength > 0)
- {
- ctx->dumpHardwareEntriesWithData[e].manufacturer =
- (uint8_t *)malloc(ctx->dumpHardwareEntriesWithData[e].entry.manufacturerLength + 1);
-
- if(ctx->dumpHardwareEntriesWithData[e].manufacturer != NULL)
- {
- ctx->dumpHardwareEntriesWithData[e]
- .manufacturer[ctx->dumpHardwareEntriesWithData[e].entry.manufacturerLength] = 0;
- readBytes =
- fread(ctx->dumpHardwareEntriesWithData[e].manufacturer, 1,
- ctx->dumpHardwareEntriesWithData[e].entry.manufacturerLength, ctx->imageStream);
-
- if(readBytes != ctx->dumpHardwareEntriesWithData[e].entry.manufacturerLength)
- {
- free(ctx->dumpHardwareEntriesWithData[e].manufacturer);
- ctx->dumpHardwareEntriesWithData[e].entry.manufacturerLength = 0;
- fprintf(stderr, "libaaruformat: Could not read dump hardware block entry manufacturer, "
- "continuing...\n");
- }
- }
- }
-
- if(ctx->dumpHardwareEntriesWithData[e].entry.modelLength > 0)
- {
- ctx->dumpHardwareEntriesWithData[e].model =
- (uint8_t *)malloc(ctx->dumpHardwareEntriesWithData[e].entry.modelLength + 1);
-
- if(ctx->dumpHardwareEntriesWithData[e].model != NULL)
- {
- ctx->dumpHardwareEntriesWithData[e]
- .model[ctx->dumpHardwareEntriesWithData[e].entry.modelLength] = 0;
- readBytes = fread(ctx->dumpHardwareEntriesWithData[e].model, 1,
- ctx->dumpHardwareEntriesWithData[e].entry.modelLength, ctx->imageStream);
-
- if(readBytes != ctx->dumpHardwareEntriesWithData[e].entry.modelLength)
- {
- free(ctx->dumpHardwareEntriesWithData[e].model);
- ctx->dumpHardwareEntriesWithData[e].entry.modelLength = 0;
- fprintf(
- stderr,
- "libaaruformat: Could not read dump hardware block entry model, continuing...\n");
- }
- }
- }
-
- if(ctx->dumpHardwareEntriesWithData[e].entry.revisionLength > 0)
- {
- ctx->dumpHardwareEntriesWithData[e].revision =
- (uint8_t *)malloc(ctx->dumpHardwareEntriesWithData[e].entry.revisionLength + 1);
-
- if(ctx->dumpHardwareEntriesWithData[e].revision != NULL)
- {
- ctx->dumpHardwareEntriesWithData[e]
- .revision[ctx->dumpHardwareEntriesWithData[e].entry.revisionLength] = 0;
- readBytes =
- fread(ctx->dumpHardwareEntriesWithData[e].revision, 1,
- ctx->dumpHardwareEntriesWithData[e].entry.revisionLength, ctx->imageStream);
-
- if(readBytes != ctx->dumpHardwareEntriesWithData[e].entry.revisionLength)
- {
- free(ctx->dumpHardwareEntriesWithData[e].revision);
- ctx->dumpHardwareEntriesWithData[e].entry.revisionLength = 0;
- fprintf(stderr, "libaaruformat: Could not read dump hardware block entry revision, "
- "continuing...\n");
- }
- }
- }
-
- if(ctx->dumpHardwareEntriesWithData[e].entry.firmwareLength > 0)
- {
- ctx->dumpHardwareEntriesWithData[e].firmware =
- (uint8_t *)malloc(ctx->dumpHardwareEntriesWithData[e].entry.firmwareLength + 1);
-
- if(ctx->dumpHardwareEntriesWithData[e].firmware != NULL)
- {
- ctx->dumpHardwareEntriesWithData[e]
- .firmware[ctx->dumpHardwareEntriesWithData[e].entry.firmwareLength] = 0;
- readBytes =
- fread(ctx->dumpHardwareEntriesWithData[e].firmware, 1,
- ctx->dumpHardwareEntriesWithData[e].entry.firmwareLength, ctx->imageStream);
-
- if(readBytes != ctx->dumpHardwareEntriesWithData[e].entry.firmwareLength)
- {
- free(ctx->dumpHardwareEntriesWithData[e].firmware);
- ctx->dumpHardwareEntriesWithData[e].entry.firmwareLength = 0;
- fprintf(stderr, "libaaruformat: Could not read dump hardware block entry firmware, "
- "continuing...\n");
- }
- }
- }
-
- if(ctx->dumpHardwareEntriesWithData[e].entry.serialLength > 0)
- {
- ctx->dumpHardwareEntriesWithData[e].serial =
- (uint8_t *)malloc(ctx->dumpHardwareEntriesWithData[e].entry.serialLength + 1);
-
- if(ctx->dumpHardwareEntriesWithData[e].serial != NULL)
- {
- ctx->dumpHardwareEntriesWithData[e]
- .serial[ctx->dumpHardwareEntriesWithData[e].entry.serialLength] = 0;
- readBytes = fread(ctx->dumpHardwareEntriesWithData[e].serial, 1,
- ctx->dumpHardwareEntriesWithData[e].entry.serialLength, ctx->imageStream);
-
- if(readBytes != ctx->dumpHardwareEntriesWithData[e].entry.serialLength)
- {
- free(ctx->dumpHardwareEntriesWithData[e].serial);
- ctx->dumpHardwareEntriesWithData[e].entry.serialLength = 0;
- fprintf(
- stderr,
- "libaaruformat: Could not read dump hardware block entry serial, continuing...\n");
- }
- }
- }
-
- if(ctx->dumpHardwareEntriesWithData[e].entry.softwareNameLength > 0)
- {
- ctx->dumpHardwareEntriesWithData[e].softwareName =
- (uint8_t *)malloc(ctx->dumpHardwareEntriesWithData[e].entry.softwareNameLength + 1);
-
- if(ctx->dumpHardwareEntriesWithData[e].softwareName != NULL)
- {
- ctx->dumpHardwareEntriesWithData[e]
- .softwareName[ctx->dumpHardwareEntriesWithData[e].entry.softwareNameLength] = 0;
- readBytes =
- fread(ctx->dumpHardwareEntriesWithData[e].softwareName, 1,
- ctx->dumpHardwareEntriesWithData[e].entry.softwareNameLength, ctx->imageStream);
-
- if(readBytes != ctx->dumpHardwareEntriesWithData[e].entry.softwareNameLength)
- {
- free(ctx->dumpHardwareEntriesWithData[e].softwareName);
- ctx->dumpHardwareEntriesWithData[e].entry.softwareNameLength = 0;
- fprintf(stderr,
- "libaaruformat: Could not read dump hardware block entry software name, "
- "continuing...\n");
- }
- }
- }
-
- if(ctx->dumpHardwareEntriesWithData[e].entry.softwareVersionLength > 0)
- {
- ctx->dumpHardwareEntriesWithData[e].softwareVersion =
- (uint8_t *)malloc(ctx->dumpHardwareEntriesWithData[e].entry.softwareVersionLength + 1);
-
- if(ctx->dumpHardwareEntriesWithData[e].softwareVersion != NULL)
- {
- ctx->dumpHardwareEntriesWithData[e]
- .softwareVersion[ctx->dumpHardwareEntriesWithData[e].entry.softwareVersionLength] = 0;
- readBytes = fread(ctx->dumpHardwareEntriesWithData[e].softwareVersion, 1,
- ctx->dumpHardwareEntriesWithData[e].entry.softwareVersionLength,
- ctx->imageStream);
-
- if(readBytes != ctx->dumpHardwareEntriesWithData[e].entry.softwareVersionLength)
- {
- free(ctx->dumpHardwareEntriesWithData[e].softwareVersion);
- ctx->dumpHardwareEntriesWithData[e].entry.softwareVersionLength = 0;
- fprintf(stderr,
- "libaaruformat: Could not read dump hardware block entry software version, "
- "continuing...\n");
- }
- }
- }
-
- if(ctx->dumpHardwareEntriesWithData[e].entry.softwareOperatingSystemLength > 0)
- {
- ctx->dumpHardwareEntriesWithData[e].softwareOperatingSystem = (uint8_t *)malloc(
- ctx->dumpHardwareEntriesWithData[e].entry.softwareOperatingSystemLength + 1);
-
- if(ctx->dumpHardwareEntriesWithData[e].softwareOperatingSystem != NULL)
- {
- ctx->dumpHardwareEntriesWithData[e].softwareOperatingSystem
- [ctx->dumpHardwareEntriesWithData[e].entry.softwareOperatingSystemLength] = 0;
- readBytes = fread(ctx->dumpHardwareEntriesWithData[e].softwareOperatingSystem, 1,
- ctx->dumpHardwareEntriesWithData[e].entry.softwareOperatingSystemLength,
- ctx->imageStream);
-
- if(readBytes != ctx->dumpHardwareEntriesWithData[e].entry.softwareOperatingSystemLength)
- {
- free(ctx->dumpHardwareEntriesWithData[e].softwareOperatingSystem);
- ctx->dumpHardwareEntriesWithData[e].entry.softwareOperatingSystemLength = 0;
- fprintf(stderr, "libaaruformat: Could not read dump hardware block entry manufacturer, "
- "continuing...\n");
- }
- }
- }
-
- ctx->dumpHardwareEntriesWithData[e].extents =
- (DumpExtent *)malloc(sizeof(DumpExtent) * ctx->dumpHardwareEntriesWithData->entry.extents);
-
- if(ctx->dumpHardwareEntriesWithData[e].extents == NULL)
- {
- fprintf(stderr, "libaaruformat: Could not allocate memory for dump hardware block extents, "
- "continuing...\n");
- continue;
- }
-
- readBytes = fread(ctx->dumpHardwareEntriesWithData[e].extents, sizeof(DumpExtent),
- ctx->dumpHardwareEntriesWithData[e].entry.extents, ctx->imageStream);
-
- if(readBytes != ctx->dumpHardwareEntriesWithData->entry.extents)
- {
- free(ctx->dumpHardwareEntriesWithData[e].extents);
- fprintf(stderr, "libaaruformat: Could not read dump hardware block extents, continuing...\n");
- continue;
- }
-
- // TODO: qsort()
- }
+ process_dumphw_block(ctx, entry);
break;
case ChecksumBlock: