]> wimlib.net Git - wimlib/blobdiff - src/reparse.c
Win32: Fix cross-drive capture rpfix
[wimlib] / src / reparse.c
index 84890c7e7f05b26f12e8bbeee304d7d7cb4167ed..4cbe69d9fbda8b7ce7ab43571240b4f2a1a94548 100644 (file)
@@ -432,7 +432,8 @@ unix_get_ino_and_dev(const char *path, u64 *ino_ret, u64 *dev_ret)
 {
        struct stat stbuf;
        if (stat(path, &stbuf)) {
-               WARNING_WITH_ERRNO("Failed to stat \"%s\"", path);
+               if (errno != ENOENT)
+                       WARNING_WITH_ERRNO("Failed to stat \"%s\"", path);
                /* Treat as a link pointing outside the capture root (it
                 * most likely is). */
                return WIMLIB_ERR_STAT;
@@ -459,10 +460,17 @@ unix_get_ino_and_dev(const char *path, u64 *ino_ret, u64 *dev_ret)
 /* Fix up absolute symbolic link targets--- mostly shared between UNIX and
  * Windows */
 tchar *
-fixup_symlink(tchar *dest, u64 capture_root_ino, u64 capture_root_dev)
+capture_fixup_absolute_symlink(tchar *dest,
+                              u64 capture_root_ino, u64 capture_root_dev)
 {
        tchar *p = dest;
 
+#ifdef __WIN32__
+       /* Skip drive letter */
+       if (!is_rp_path_separator(*dest))
+               p += 2;
+#endif
+
        DEBUG("Fixing symlink or junction \"%"TS"\"", dest);
        for (;;) {
                tchar save;
@@ -489,6 +497,13 @@ fixup_symlink(tchar *dest, u64 capture_root_ino, u64 capture_root_dev)
                                *(p - 1) = RP_PATH_SEPARATOR;
                        while (p - 1 >= dest && is_rp_path_separator(*(p - 1)))
                                p--;
+               #ifdef __WIN32__
+                       if (!is_rp_path_separator(dest[0])) {
+                               *--p = dest[1];
+                               *--p = dest[0];
+                       }
+               #endif
+                       wimlib_assert(p >= dest);
                        return p;
                }