* Return value is:
*
* Non-negative integer:
- * The name is an absolute symbolic link in one of several formats,
- * and the return value is the number of UTF-16LE characters that need to
- * be advanced to reach a simple "absolute" path starting with a backslash
- * (i.e. skip over \??\ and/or drive letter)
+ * The name is an absolute symbolic link in one of several formats,
+ * and the return value is the number of UTF-16LE characters that need to
+ * be advanced to reach a simple "absolute" path starting with a backslash
+ * (i.e. skip over \??\ and/or drive letter)
* Negative integer:
* SUBST_NAME_IS_VOLUME_JUNCTION:
- * The name is a volume junction.
+ * The name is a volume junction.
* SUBST_NAME_IS_RELATIVE_LINK:
- * The name is a relative symbolic link.
+ * The name is a relative symbolic link.
* SUBST_NAME_IS_UNKNOWN:
* The name does not appear to be a valid symbolic link, junction,
* or mount point.
int
wim_inode_get_reparse_data(const struct wim_inode * restrict inode,
u8 * restrict rpbuf,
- u16 * restrict rpbuflen_ret)
+ u16 * restrict rpbuflen_ret,
+ struct wim_lookup_table_entry *lte_override)
{
struct wim_lookup_table_entry *lte;
int ret;
wimlib_assert(inode->i_attributes & FILE_ATTRIBUTE_REPARSE_POINT);
- lte = inode_unnamed_lte_resolved(inode);
- if (!lte) {
- ERROR("Reparse point has no reparse data!");
- return WIMLIB_ERR_INVALID_REPARSE_DATA;
+ if (!lte_override) {
+ lte = inode_unnamed_lte_resolved(inode);
+ if (!lte) {
+ ERROR("Reparse point has no reparse data!");
+ return WIMLIB_ERR_INVALID_REPARSE_DATA;
+ }
+ } else {
+ lte = lte_override;
}
if (wim_resource_size(lte) > REPARSE_POINT_MAX_SIZE - 8) {
* on failure a negated error code is returned rather than -1 with errno set. */
ssize_t
wim_inode_readlink(const struct wim_inode * restrict inode,
- char * restrict buf, size_t bufsize)
+ char * restrict buf, size_t bufsize,
+ struct wim_lookup_table_entry *lte_override)
{
int ret;
struct reparse_buffer_disk rpbuf_disk _aligned_attribute(8);
wimlib_assert(inode_is_symlink(inode));
- if (wim_inode_get_reparse_data(inode, (u8*)&rpbuf_disk, &rpbuflen))
+ if (wim_inode_get_reparse_data(inode, (u8*)&rpbuf_disk, &rpbuflen,
+ lte_override))
return -EIO;
if (parse_reparse_data((const u8*)&rpbuf_disk, rpbuflen, &rpdata))
* 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 backslashes with forward
- * slashes. We do not make any attempt to handle filename character
+ * 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.
#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__