goto out;
ret = join_wims(swms, num_swms, joined_wim, write_flags);
out:
+ /* out_fp is the same in all the swms and joined_wim. And it was
+ * already closed in the call to finish_write(). */
for (i = 0; i < num_swms; i++) {
- /* out_fp is the same in all the swms and joined_wim; only close
- * it one time, when freeing joined_wim. */
- if (swms[i]) {
- swms[i]->out_fp = NULL;
- wimlib_free(swms[i]);
- }
+ swms[i]->out_fp = NULL;
+ wimlib_free(swms[i]);
}
+ joined_wim->out_fp = NULL;
wimlib_free(joined_wim);
return ret;
}
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;
+ 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)
if (fseeko(out, 0, SEEK_SET) != 0)
return WIMLIB_ERR_WRITE;
- return write_header(&hdr, out);
+ ret = write_header(&hdr, out);
+ if (ret != 0)
+ return ret;
+
+ DEBUG("Closing output file.");
+ wimlib_assert(w->out_fp != NULL);
+ if (fclose(w->out_fp) != 0) {
+ ERROR_WITH_ERRNO("Failed to close the WIM file");
+ ret = WIMLIB_ERR_WRITE;
+ }
+ w->out_fp = NULL;
+ return ret;
}
/* Open file stream and write dummy header for WIM. */
else
mode = "wb";
+ if (w->out_fp)
+ fclose(w->out_fp);
+
w->out_fp = fopen(path, mode);
if (!w->out_fp) {
ERROR_WITH_ERRNO("Failed to open the file `%s' for writing",
ret = begin_write(w, path, write_flags);
if (ret != 0)
- goto out;
+ return ret;
for_lookup_table_entry(w->lookup_table, lte_zero_out_refcnt, NULL);
ret = for_image(w, image, write_file_resources);
if (ret != 0) {
ERROR("Failed to write WIM file resources to `%s'", path);
- goto out;
+ return ret;
}
ret = for_image(w, image, write_metadata_resource);
if (ret != 0) {
/*ERROR("Failed to write WIM image metadata to `%s'", path);*/
- goto out;
+ return ret;
}
-
- ret = finish_write(w, image, write_flags);
-
-out:
- DEBUG("Closing output file.");
- if (w->out_fp != NULL) {
- if (fclose(w->out_fp) != 0) {
- ERROR_WITH_ERRNO("Failed to close the file `%s'", path);
- ret = WIMLIB_ERR_WRITE;
- }
- w->out_fp = NULL;
- }
- return ret;
+ return finish_write(w, image, write_flags);
}