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);
{
struct wim_lookup_table *lookup_table = _lookup_table;
- lte->refcnt -= lte->out_refcnt;
- if (lte->refcnt == 0) {
- lookup_table_unlink(lookup_table, lte);
- free_lookup_table_entry(lte);
+ if (lte->out_refcnt) {
+ lte->refcnt -= lte->out_refcnt;
+ if (lte->refcnt == 0) {
+ lookup_table_unlink(lookup_table, lte);
+ free_lookup_table_entry(lte);
+ }
}
return 0;
}
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;
u32 orig_dest_image_count;
/* Check for sane parameters. */
+ if (export_flags & ~(WIMLIB_EXPORT_FLAG_BOOT |
+ WIMLIB_EXPORT_FLAG_NO_NAMES |
+ 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)
return WIMLIB_ERR_INVALID_PARAM;
/* Determine destination image name and description. */
if (export_flags & WIMLIB_EXPORT_FLAG_NO_NAMES) {
- next_dest_name = NULL;
+ next_dest_name = T("");
} else if (dest_name) {
next_dest_name = dest_name;
} else {
DEBUG("Using name \"%"TS"\"", next_dest_name);
if (export_flags & WIMLIB_EXPORT_FLAG_NO_DESCRIPTIONS) {
- next_dest_description = NULL;
- } if (dest_description) {
+ next_dest_description = T("");
+ } else if (dest_description) {
next_dest_description = dest_description;
} else {
next_dest_description = wimlib_get_image_description(
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;