Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/mono/libgit2.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEdward Thomson <ethomson@microsoft.com>2013-05-04 21:04:39 +0400
committerEdward Thomson <ethomson@microsoft.com>2013-05-04 21:40:41 +0400
commit00a4c4793890e9a8f6ad6f538d445111d6c73d54 (patch)
treea44cf8fc0c5e3a5639ef06c88c85938fe36e7dca /src/win32/posix_w32.c
parentdfec726bbae0e699b78db8f1b63372134c8467a6 (diff)
p_stat() should follow symlinks on windows
Diffstat (limited to 'src/win32/posix_w32.c')
-rw-r--r--src/win32/posix_w32.c13
1 files changed, 12 insertions, 1 deletions
diff --git a/src/win32/posix_w32.c b/src/win32/posix_w32.c
index 4d56299f7..da147ad0c 100644
--- a/src/win32/posix_w32.c
+++ b/src/win32/posix_w32.c
@@ -295,7 +295,18 @@ int p_getcwd(char *buffer_out, size_t size)
int p_stat(const char* path, struct stat* buf)
{
- return do_lstat(path, buf, 0);
+ char target[GIT_WIN_PATH];
+ int error = 0;
+
+ error = do_lstat(path, buf, 0);
+
+ /* We need not do this in a loop to unwind chains of symlinks since
+ * p_readlink calls GetFinalPathNameByHandle which does it for us. */
+ if (error >= 0 && S_ISLNK(buf->st_mode) &&
+ (error = p_readlink(path, target, GIT_WIN_PATH)) >= 0)
+ error = do_lstat(target, buf, 0);
+
+ return error;
}
int p_chdir(const char* path)