X-Git-Url: https://wimlib.net/git/?a=blobdiff_plain;f=src%2Fexport_image.c;h=17c4f7dd8f3e06f45ef191b62263ef44125b99c0;hb=3d84c998673ba7acf82ec5c26769a41e28a2cc7b;hp=deeaddb44522497e3f57007f05f2b34f99ef41bd;hpb=f3e97b29c4a8c564d54b0fd11cd43a9b4cd6a8ad;p=wimlib diff --git a/src/export_image.c b/src/export_image.c index deeaddb4..17c4f7dd 100644 --- a/src/export_image.c +++ b/src/export_image.c @@ -21,10 +21,17 @@ * along with wimlib; if not, see http://www.gnu.org/licenses/. */ -#include "wimlib_internal.h" -#include "dentry.h" -#include "lookup_table.h" -#include "xml.h" +#ifdef HAVE_CONFIG_H +# include "config.h" +#endif + +#include "wimlib.h" +#include "wimlib/dentry.h" +#include "wimlib/error.h" +#include "wimlib/lookup_table.h" +#include "wimlib/metadata.h" +#include "wimlib/swm.h" +#include "wimlib/xml.h" static int inode_allocate_needed_ltes(struct wim_inode *inode, @@ -47,7 +54,7 @@ inode_allocate_needed_ltes(struct wim_inode *inode, dest_lte = clone_lookup_table_entry(src_lte); if (!dest_lte) return WIMLIB_ERR_NOMEM; - list_add_tail(&dest_lte->new_stream_list, + list_add_tail(&dest_lte->export_stream_list, lte_list_head); } } @@ -77,7 +84,7 @@ inode_move_ltes_to_table(struct wim_inode *inode, list_del(next); dest_lte = container_of(next, struct wim_lookup_table_entry, - new_stream_list); + export_stream_list); dest_lte->part_number = 1; dest_lte->refcnt = 0; wimlib_assert(hashes_equal(dest_lte->hash, src_lte->hash)); @@ -88,9 +95,7 @@ inode_move_ltes_to_table(struct wim_inode *inode, } } -/* - * Exports an image, or all the images, from a WIM file, into another WIM file. - */ +/* API function documented in wimlib.h */ WIMLIBAPI int wimlib_export_image(WIMStruct *src_wim, int src_image, @@ -103,16 +108,13 @@ wimlib_export_image(WIMStruct *src_wim, wimlib_progress_func_t progress_func) { int ret; - struct wim_lookup_table *joined_tab, *src_wim_tab_save; struct wim_image_metadata *src_imd; struct list_head lte_list_head; struct wim_inode *inode; - if (dest_wim->hdr.total_parts != 1) { - ERROR("Exporting an image to a split WIM is " - "unsupported"); - return WIMLIB_ERR_SPLIT_UNSUPPORTED; - } + ret = can_modify_wim(dest_wim); + if (ret) + return ret; if (src_image == WIMLIB_ALL_IMAGES) { if (src_wim->hdr.image_count > 1) { @@ -186,15 +188,15 @@ wimlib_export_image(WIMStruct *src_wim, if (ret) return ret; - if (num_additional_swms) { - ret = new_joined_lookup_table(src_wim, additional_swms, - num_additional_swms, - &joined_tab); - if (ret) - return ret; - src_wim_tab_save = src_wim->lookup_table; - src_wim->lookup_table = joined_tab; - } + ret = wim_checksum_unhashed_streams(src_wim); + if (ret) + return ret; + ret = wim_checksum_unhashed_streams(dest_wim); + if (ret) + return ret; + + if (num_additional_swms) + merge_lookup_tables(src_wim, additional_swms, num_additional_swms); ret = select_wim_image(src_wim, src_image); if (ret) { @@ -231,6 +233,7 @@ wimlib_export_image(WIMStruct *src_wim, /* The `struct image_metadata' is now referenced by both the @src_wim * and the @dest_wim. */ src_imd->refcnt++; + src_imd->modified = 1; /* All memory allocations have been taken care of, so it's no longer * possible for this function to fail. Go ahead and update the lookup @@ -244,6 +247,13 @@ wimlib_export_image(WIMStruct *src_wim, if (export_flags & WIMLIB_EXPORT_FLAG_BOOT) dest_wim->hdr.boot_idx = dest_wim->hdr.image_count; + if (src_wim->hdr.flags & WIM_HDR_FLAG_RP_FIX) + { + /* Set the reparse point fixup flag on the destination WIM if + * the flag is set on the source WIM. */ + dest_wim->hdr.flags |= WIM_HDR_FLAG_RP_FIX; + } + DEBUG("Successfully exported image."); ret = 0; goto out; out_xml_delete_image: @@ -251,13 +261,11 @@ out_xml_delete_image: out_free_ltes: { struct wim_lookup_table_entry *lte, *tmp; - list_for_each_entry_safe(lte, tmp, <e_list_head, new_stream_list) + list_for_each_entry_safe(lte, tmp, <e_list_head, export_stream_list) free_lookup_table_entry(lte); } out: - if (num_additional_swms) { - free_lookup_table(src_wim->lookup_table); - src_wim->lookup_table = src_wim_tab_save; - } + if (num_additional_swms) + unmerge_lookup_table(src_wim); return ret; }