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;
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);
WIMStruct *dest_wim,
const tchar *dest_name,
const tchar *dest_description,
- int export_flags,
- wimlib_progress_func_t progress_func)
+ int export_flags)
{
int ret;
int start_image;
/* 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)
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;
}
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;