X-Git-Url: https://wimlib.net/git/?p=wimlib;a=blobdiff_plain;f=src%2Fexport_image.c;h=9c25be732eb8d9424bd30ecd905ec50159de271d;hp=8d449ea93439d634b002aacea0287c1f66c3a88b;hb=af8cdc72ef58ede31aa2b6e08ca81ec371b789a5;hpb=bafd3460a2f40174b8329e6059fd7338730958e8 diff --git a/src/export_image.c b/src/export_image.c index 8d449ea9..9c25be73 100644 --- a/src/export_image.c +++ b/src/export_image.c @@ -36,8 +36,9 @@ static int inode_export_streams(struct wim_inode *inode, - const struct wim_lookup_table *src_lookup_table, - struct wim_lookup_table *dest_lookup_table) + struct wim_lookup_table *src_lookup_table, + struct wim_lookup_table *dest_lookup_table, + bool gift) { unsigned i; const u8 *hash; @@ -62,9 +63,14 @@ inode_export_streams(struct wim_inode *inode, if (!src_lte) return stream_not_found_error(inode, hash); - dest_lte = clone_lookup_table_entry(src_lte); - if (!dest_lte) - return WIMLIB_ERR_NOMEM; + if (gift) { + dest_lte = src_lte; + lookup_table_unlink(src_lookup_table, src_lte); + } else { + dest_lte = clone_lookup_table_entry(src_lte); + if (!dest_lte) + return WIMLIB_ERR_NOMEM; + } dest_lte->refcnt = 0; dest_lte->out_refcnt = 0; lookup_table_insert(dest_lookup_table, dest_lte); @@ -117,7 +123,9 @@ wimlib_export_image(WIMStruct *src_wim, /* Check for sane parameters. */ if (export_flags & ~(WIMLIB_EXPORT_FLAG_BOOT | WIMLIB_EXPORT_FLAG_NO_NAMES | - WIMLIB_EXPORT_FLAG_NO_DESCRIPTIONS)) + WIMLIB_EXPORT_FLAG_NO_DESCRIPTIONS | + WIMLIB_EXPORT_FLAG_GIFT | + WIMLIB_EXPORT_FLAG_WIMBOOT)) return WIMLIB_ERR_INVALID_PARAM; if (src_wim == NULL || dest_wim == NULL) @@ -222,7 +230,8 @@ wimlib_export_image(WIMStruct *src_wim, image_for_each_inode(inode, src_imd) { ret = inode_export_streams(inode, src_wim->lookup_table, - dest_wim->lookup_table); + dest_wim->lookup_table, + export_flags & WIMLIB_EXPORT_FLAG_GIFT); if (ret) goto out_rollback; } @@ -255,11 +264,23 @@ wimlib_export_image(WIMStruct *src_wim, dest_wim->hdr.boot_idx = dest_wim->hdr.image_count; } + /* Possibly set WIMBoot flag */ + if (export_flags & WIMLIB_EXPORT_FLAG_WIMBOOT) { + wim_info_set_wimboot(dest_wim->wim_info, + dest_wim->hdr.image_count, + true); + } + } /* Set the reparse point fixup flag on the destination WIM if the flag * is set on the source WIM. */ if (src_wim->hdr.flags & WIM_HDR_FLAG_RP_FIX) dest_wim->hdr.flags |= WIM_HDR_FLAG_RP_FIX; + + if (export_flags & WIMLIB_EXPORT_FLAG_GIFT) { + free_lookup_table(src_wim->lookup_table); + src_wim->lookup_table = NULL; + } DEBUG("Export operation successful."); return 0;