char *swm_base_name;
size_t swm_base_name_len;
const char *swm_suffix;
- struct lookup_table_entry *lte_chain_head;
- struct lookup_table_entry *lte_chain_tail;
+ struct list_head *lte_list;
int part_number;
int write_flags;
long size_remaining;
u64 total_bytes_written;
};
-static int finish_swm(WIMStruct *w, struct lookup_table_entry *lte_chain_head,
+static int finish_swm(WIMStruct *w, struct list_head *lte_list,
int write_flags)
{
off_t lookup_table_offset = ftello(w->out_fp);
int ret;
+ struct lookup_table_entry *lte;
DEBUG("Writing lookup table for SWM (offset %"PRIu64")",
lookup_table_offset);
- while (lte_chain_head != NULL) {
- ret = write_lookup_table_entry(lte_chain_head, w->out_fp);
+ list_for_each_entry(lte, lte_list, staging_list) {
+ ret = write_lookup_table_entry(lte, w->out_fp);
if (ret != 0)
return ret;
- struct lookup_table_entry *prev = lte_chain_head;
- lte_chain_head = lte_chain_head->next_lte_in_swm;
- prev->next_lte_in_swm = NULL;
}
+
off_t xml_data_offset = ftello(w->out_fp);
if (lookup_table_offset == -1 || xml_data_offset == -1)
w->hdr.lookup_table_res_entry.offset = lookup_table_offset;
w->hdr.lookup_table_res_entry.size =
xml_data_offset - lookup_table_offset;
- ret = finish_write(w, WIM_ALL_IMAGES,
- write_flags | WIMLIB_WRITE_FLAG_NO_LOOKUP_TABLE);
- if (ret != 0)
- return ret;
-
- ret = fclose(w->out_fp);
- if (ret != 0)
- ret = WIMLIB_ERR_WRITE;
- w->out_fp = NULL;
- return ret;
+ w->hdr.lookup_table_res_entry.original_size =
+ xml_data_offset - lookup_table_offset;
+ w->hdr.lookup_table_res_entry.flags = WIM_RESHDR_FLAG_METADATA;
+ return finish_write(w, WIM_ALL_IMAGES,
+ write_flags | WIMLIB_WRITE_FLAG_NO_LOOKUP_TABLE);
}
static int copy_resource_to_swm(struct lookup_table_entry *lte, void *__args)
/* No space for this resource. Finish the previous swm and
* start a new one. */
- ret = finish_swm(w, args->lte_chain_head, args->write_flags);
-
- args->lte_chain_tail = NULL;
- args->lte_chain_head = NULL;
+ ret = finish_swm(w, args->lte_list, args->write_flags);
+ if (ret != 0)
+ return ret;
+ INIT_LIST_HEAD(args->lte_list);
sprintf(args->swm_base_name + args->swm_base_name_len, "%d%s",
++args->part_number, args->swm_suffix);
}
args->size_remaining -= lte->resource_entry.size;
args->total_bytes_written += lte->resource_entry.size;
- if (args->lte_chain_tail)
- args->lte_chain_tail->next_lte_in_swm = lte;
- else
- args->lte_chain_head = lte;
- args->lte_chain_tail = lte;
+ list_add(<e->staging_list, args->lte_list);
return copy_resource(lte, w);
}
char name[swm_name_len + 20];
char *swm_suffix;
- struct lookup_table_entry *lte_chain_head = NULL;
- struct lookup_table_entry *lte_chain_tail = NULL;
long size_remaining = part_size;
u64 total_bytes_written = 0;
u64 total_bytes;
(double)total_bytes * 100.0);
w->write_metadata = true;
+ LIST_HEAD(lte_list);
for (int i = 0; i < w->hdr.image_count; i++) {
struct lookup_table_entry *metadata_lte;
return ret;
size_remaining -= metadata_lte->resource_entry.size;
total_bytes_written += metadata_lte->resource_entry.size;
- if (lte_chain_tail)
- lte_chain_tail->next_lte_in_swm = metadata_lte;
- else
- lte_chain_head = metadata_lte;
- lte_chain_tail = metadata_lte;
+ list_add(&metadata_lte->staging_list, <e_list);
}
w->write_metadata = false;
.swm_base_name = name,
.swm_base_name_len = swm_base_name_len,
.swm_suffix = swm_suffix,
- .lte_chain_head = lte_chain_head,
- .lte_chain_tail = lte_chain_tail,
+ .lte_list = <e_list,
.part_number = 1,
.write_flags = write_flags,
.size_remaining = size_remaining,
if (ret != 0)
return ret;
- ret = finish_swm(w, args.lte_chain_head, write_flags);
+ ret = finish_swm(w, <e_list, write_flags);
if (ret != 0)
return ret;