info->FileName[1] == L'.'))
{
wchar_t *p;
+ wchar_t *filename;
struct wim_dentry *child;
p = full_path + full_path_nchars;
- *p++ = L'\\';
- p = wmempcpy(p, info->FileName,
+ /* Only add a backslash if we don't already have
+ * one. This prevents a duplicate backslash
+ * from being added when the path to the capture
+ * dir had a trailing backslash. */
+ if (*(p - 1) != L'\\')
+ *p++ = L'\\';
+ filename = p;
+ p = wmempcpy(filename, info->FileName,
info->FileNameLength / 2);
*p = '\0';
h,
full_path,
p - full_path,
- full_path + full_path_nchars + 1,
+ filename,
info->FileNameLength / 2,
params,
stats,
/* Reparse point fixup status code */
enum rp_status {
- /* Reparse point should be excluded from capture */
- RP_EXCLUDED = -0,
-
/* Reparse point will be captured literally (no fixup) */
RP_NOT_FIXED = -1,
capture_root_ino,
capture_root_dev);
if (!rel_target) {
- /* Target points outside of the tree being captured. Exclude
- * this reparse point from the capture (but inform the library
- * user). */
+ /* Target points outside of the tree being captured. Don't
+ * adjust it. */
ret = winnt_rpfix_progress(params, path, &rpdata,
- WIMLIB_SCAN_DENTRY_EXCLUDED_SYMLINK);
+ WIMLIB_SCAN_DENTRY_NOT_FIXED_SYMLINK);
if (ret)
return ret;
- return RP_EXCLUDED;
+ return RP_NOT_FIXED;
}
if (rel_target == rpdata.substitute_name) {
* On success, the length of the reparse point buffer in bytes is written
* to this location.
*
- * On success, returns a nonpositive `enum rp_status' value.
+ * On success, returns a negative `enum rp_status' value.
* On failure, returns a positive error code.
*/
static int
ret = winnt_get_reparse_data(h, full_path, params,
rpbuf, &rpbuflen);
switch (ret) {
- case RP_EXCLUDED:
- ret = 0;
- goto out;
case RP_FIXED:
not_rpfixed = 0;
break;