If we swap both slash types when translating each way, then the
translation is lossless.
The performance of the NTFS-3g and Windows capture modes has been
slightly improved.
The performance of the NTFS-3g and Windows capture modes has been
slightly improved.
+ On UNIX-like systems, symbolic links whose targets contain the backslash
+ character are now handled correctly (losslessly).
+
Version 1.8.0:
Improved the LZX compressor. It is now 15-20% faster than before and
provides a slightly better compression ratio.
Version 1.8.0:
Improved the LZX compressor. It is now 15-20% faster than before and
provides a slightly better compression ratio.
/*
* Get the UNIX-style symlink target from the WIM inode for a reparse point.
* Specifically, this translates the target from UTF-16 to the current multibyte
/*
* Get the UNIX-style symlink target from the WIM inode for a reparse point.
* Specifically, this translates the target from UTF-16 to the current multibyte
- * encoding, strips the drive prefix if present, and replaces backslashes with
+ * encoding, strips the drive prefix if present, and swaps backslashes and
* forward slashes.
*
* @inode
* forward slashes.
*
* @inode
- for (size_t i = 0; i < link_target_len; i++)
+ for (size_t i = 0; i < link_target_len; i++) {
if (translated_target[i] == '\\')
translated_target[i] = '/';
if (translated_target[i] == '\\')
translated_target[i] = '/';
+ else if (translated_target[i] == '/')
+ translated_target[i] = '\\';
+ }
out_have_link:
if (link_target_len > bufsize) {
link_target_len = bufsize;
out_have_link:
if (link_target_len > bufsize) {
link_target_len = bufsize;
- for (size_t i = 0; i < name_utf16le_nbytes / 2; i++)
+ for (size_t i = 0; i < name_utf16le_nbytes / 2; i++) {
if (name_utf16le[i] == cpu_to_le16('/'))
name_utf16le[i] = cpu_to_le16('\\');
if (name_utf16le[i] == cpu_to_le16('/'))
name_utf16le[i] = cpu_to_le16('\\');
+ else if (name_utf16le[i] == cpu_to_le16('\\'))
+ name_utf16le[i] = cpu_to_le16('/');
+ }
/* Compatability notes:
*
/* Compatability notes:
*
* is a relative symbolic link. (Quite simple compared to the various
* ways to provide Windows paths.)
*
* is a relative symbolic link. (Quite simple compared to the various
* ways to provide Windows paths.)
*
- * To change a UNIX relative symbolic link to Windows format, we only
- * need to translate it to UTF-16LE and replace forward slashes with
- * backslashes. We do not make any attempt to handle filename character
- * problems, such as a link target that itself contains backslashes on
- * UNIX. Then, for these relative links, we set the reparse header
- * @flags field to SYMBOLIC_LINK_RELATIVE.
+ * To change a UNIX relative symbolic link to Windows format, we need to
+ * translate it to UTF-16LE, swap forward slashes and backslashes, and
+ * set 'rpflags' to SYMBOLIC_LINK_RELATIVE.
*
* For UNIX absolute symbolic links, we must set the @flags field to 0.
* Then, there are multiple options as to actually represent the
*
* For UNIX absolute symbolic links, we must set the @flags field to 0.
* Then, there are multiple options as to actually represent the