+ .end_blob = hasher_end_blob,
+ .end_blob_ctx = &hasher_ctx,
+ };
+ return read_full_blob_with_cbs(blob, &hasher_cbs);
+}
+
+static int
+read_blobs_in_solid_resource(struct blob_descriptor *first_blob,
+ struct blob_descriptor *last_blob,
+ u64 blob_count,
+ size_t list_head_offset,
+ const struct read_blob_list_callbacks *sink_cbs)
+{
+ struct data_range *ranges;
+ bool ranges_malloced;
+ struct blob_descriptor *cur_blob;
+ size_t i;
+ int ret;
+ u64 ranges_alloc_size;
+
+ DEBUG("Reading %"PRIu64" blobs combined in same WIM resource",
+ blob_count);
+
+ /* Setup data ranges array (one range per blob to read); this way
+ * read_compressed_wim_resource() does not need to be aware of blobs.
+ */
+
+ ranges_alloc_size = blob_count * sizeof(ranges[0]);
+
+ if (unlikely((size_t)ranges_alloc_size != ranges_alloc_size)) {
+ ERROR("Too many blobs in one resource!");
+ return WIMLIB_ERR_NOMEM;
+ }
+ if (likely(ranges_alloc_size <= STACK_MAX)) {
+ ranges = alloca(ranges_alloc_size);
+ ranges_malloced = false;
+ } else {
+ ranges = MALLOC(ranges_alloc_size);
+ if (ranges == NULL) {
+ ERROR("Too many blobs in one resource!");
+ return WIMLIB_ERR_NOMEM;
+ }
+ ranges_malloced = true;
+ }
+
+ for (i = 0, cur_blob = first_blob;
+ i < blob_count;
+ i++, cur_blob = next_blob(cur_blob, list_head_offset))
+ {
+ ranges[i].offset = cur_blob->offset_in_res;
+ ranges[i].size = cur_blob->size;
+ }