- w->write_metadata = true;
- for (int i = 0; i < w->hdr.image_count; i++) {
- struct wim_lookup_table_entry *metadata_lte;
- metadata_lte = w->image_metadata[i].metadata_lte;
- ret = copy_resource(metadata_lte, w);
- if (ret != 0)
- goto out;
- args.size_remaining -= metadata_lte->resource_entry.size;
- args.progress.split.completed_bytes += metadata_lte->resource_entry.size;
- list_add(&metadata_lte->staging_list, &args.lte_list);
- }
- w->write_metadata = false;
-
- ret = for_lookup_table_entry(w->lookup_table,
- copy_resource_to_swm, &args);
- if (ret != 0)
- goto out;
-
- ret = finish_swm(w, &args.lte_list, write_flags, progress_func);
- if (ret != 0)
- goto out;
-
- if (progress_func) {
- progress_func(WIMLIB_PROGRESS_MSG_SPLIT_END_PART,
- &args.progress);
- }
-
- /* The swms are all ready now, except the total_parts and part_number
- * fields in their headers are wrong (since we don't know the total
- * parts until they are all written). Fix them. */
- int total_parts = args.cur_part_number;
- for (int i = 1; i <= total_parts; i++) {
- const char *part_name;
- if (i == 1) {
- part_name = swm_name;
- } else {
- sprintf(swm_base_name + swm_base_name_len, "%d%s",
- i, swm_suffix);
- part_name = swm_base_name;
- }
-
- FILE *fp = fopen(part_name, "r+b");
- if (!fp) {
- ERROR_WITH_ERRNO("Failed to open `%s'", part_name);
- ret = WIMLIB_ERR_OPEN;
- goto out;
- }
- u8 buf[4];
- put_u16(&buf[0], i);
- put_u16(&buf[2], total_parts);
-
- if (fseek(fp, 40, SEEK_SET) != 0 ||
- fwrite(buf, 1, sizeof(buf), fp) != sizeof(buf) ||
- fclose(fp) != 0)
- {
- ERROR_WITH_ERRNO("Error overwriting header of `%s'",
- part_name);
- ret = WIMLIB_ERR_WRITE;
- break;
- }
- }
-out:
- close_wim_writable(w);
- memcpy(&w->hdr, &hdr_save, sizeof(struct wim_header));