static int
win32_capture_try_rpfix(u8 *rpbuf, u16 *rpbuflen_p,
u64 capture_root_ino, u64 capture_root_dev,
- const wchar_t *path)
+ const wchar_t *path, struct add_image_params *params)
{
struct reparse_data rpdata;
int ret;
ret = -ret;
} else {
if (rp_status == RP_EXCLUDED) {
+ /* Ignoring absolute symbolic link or junction point
+ * that points out of the tree to be captured. */
size_t print_name_nchars = rpdata.print_name_nbytes / 2;
wchar_t print_name0[print_name_nchars + 1];
print_name0[print_name_nchars] = L'\0';
wmemcpy(print_name0, rpdata.print_name, print_name_nchars);
- WARNING("Ignoring %ls pointing out of capture directory:\n"
- " \"%ls\" -> \"%ls\"\n"
- " (Use --norpfix to capture all symbolic links "
- "and junction points as-is)",
- (rpdata.rptag == WIM_IO_REPARSE_TAG_SYMLINK) ?
- L"absolute symbolic link" : L"junction point",
- path, print_name0);
+
+ params->progress.scan.cur_path = path;
+ params->progress.scan.symlink_target = print_name0;
+ do_capture_progress(params,
+ WIMLIB_SCAN_DENTRY_EXCLUDED_SYMLINK,
+ NULL);
}
ret = rp_status;
}
&rpbuflen,
params->capture_root_ino,
params->capture_root_dev,
- path);
+ path,
+ params);
} else {
ret = RP_NOT_FIXED;
}
not_rpfixed = 0;
} else if (ret == RP_EXCLUDED) {
ret = 0;
- goto out_progress;
+ goto out;
} else {
not_rpfixed = 1;
}
struct win32_capture_state state;
unsigned vol_flags;
DWORD dret;
- bool need_prefix_free = false;
if (!win32func_FindFirstStreamW
#ifdef WITH_NTDLL
} else {
wmemcpy(path, L"\\\\?\\", 4);
path_nchars = 4 + dret;
- /* Update pattern prefix */
- if (params->config != NULL)
- {
- params->config->_prefix = TSTRDUP(path);
- params->config->_prefix_num_tchars = path_nchars;
- if (params->config->_prefix == NULL)
- {
- ret = WIMLIB_ERR_NOMEM;
- goto out_free_path;
- }
- need_prefix_free = true;
- }
}
} else {
wmemcpy(path, root_disk_path, path_nchars + 1);
}
+ /* Strip trailing slashes. */
+ while (path_nchars >= 2 &&
+ is_any_path_separator(path[path_nchars - 1]) &&
+ path[path_nchars - 2] != L':')
+ {
+ path[--path_nchars] = L'\0';
+ }
+
+ /* Update pattern prefix. */
+ if (params->config != NULL)
+ {
+ params->config->_prefix = TSTRDUP(path);
+ params->config->_prefix_num_tchars = path_nchars;
+ if (params->config->_prefix == NULL)
+ {
+ ret = WIMLIB_ERR_NOMEM;
+ goto out_free_path;
+ }
+ }
+
memset(&state, 0, sizeof(state));
ret = win32_build_dentry_tree_recursive(root_ret, path,
path_nchars, params,
&state, vol_flags);
- if (need_prefix_free)
+ if (params->config != NULL)
FREE(params->config->_prefix);
out_free_path:
FREE(path);