*/
int
make_reparse_buffer(const struct reparse_data * restrict rpdata,
- u8 * restrict rpbuf)
+ u8 * restrict rpbuf,
+ u16 * restrict rpbuflen_ret)
{
struct reparse_buffer_disk *rpbuf_disk =
(struct reparse_buffer_disk*)rpbuf;
*(utf16lechar*)data = cpu_to_le16(0);
data += 2;
rpbuf_disk->rpdatalen = cpu_to_le16(data - rpbuf - 8);
+ *rpbuflen_ret = data - rpbuf;
return 0;
}
utf16lechar *name_utf16le;
size_t name_utf16le_nbytes;
int ret;
+ u16 rpbuflen;
DEBUG("Creating reparse point data buffer for UNIX "
"symlink target \"%s\"", target);
rpdata.rpflags = SYMBOLIC_LINK_RELATIVE;
}
- ret = make_reparse_buffer(&rpdata, (u8*)&rpbuf_disk);
+ ret = make_reparse_buffer(&rpdata, (u8*)&rpbuf_disk, &rpbuflen);
if (ret == 0) {
ret = inode_set_unnamed_stream(inode,
(u8*)&rpbuf_disk + 8,
- le16_to_cpu(rpbuf_disk.rpdatalen),
+ rpbuflen - 8,
lookup_table);
}
FREE(name_utf16le);
#endif /* !defined(__WIN32__) */
+/* is_rp_path_separator() - characters treated as path separators in absolute
+ * symbolic link targets */
+
#ifdef __WIN32__
-# define RP_PATH_SEPARATOR L'\\'
# define is_rp_path_separator(c) ((c) == L'\\' || (c) == L'/')
# define os_get_ino_and_dev win32_get_file_and_vol_ids
#else
-# define RP_PATH_SEPARATOR '/'
# define is_rp_path_separator(c) ((c) == '/')
# define os_get_ino_and_dev unix_get_ino_and_dev
#endif
/* Link points inside capture root. Return abbreviated
* path. */
if (*p == T('\0'))
- *(p - 1) = RP_PATH_SEPARATOR;
+ *(p - 1) = OS_PREFERRED_PATH_SEPARATOR;
while (p - 1 >= dest && is_rp_path_separator(*(p - 1)))
p--;
#ifdef __WIN32__