]> wimlib.net Git - wimlib/blobdiff - src/reparse.c
win32_capture_streams(): Handle not implemented/supported
[wimlib] / src / reparse.c
index 3b36548c3c63951c858c37970a8dde011a70c13d..1cbca56f146610f966df66a458346966e3c2c4a4 100644 (file)
@@ -86,15 +86,15 @@ static const utf16lechar volume_junction_prefix[11] = {
  * 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.
@@ -272,7 +272,8 @@ make_reparse_buffer(const struct reparse_data * restrict rpdata,
 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;
@@ -281,10 +282,14 @@ wim_inode_get_reparse_data(const struct wim_inode * restrict inode,
 
        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) {
@@ -327,7 +332,8 @@ wim_inode_get_reparse_data(const struct wim_inode * restrict inode,
  * 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);
@@ -339,7 +345,8 @@ wim_inode_readlink(const struct wim_inode * restrict inode,
 
        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))