From 52ead7877dfa24681bd17c9f82f6d3c1bb5a873a Mon Sep 17 00:00:00 2001 From: Eduardo Bart Date: Mon, 19 Nov 2012 22:30:20 -0200 Subject: [PATCH 1/4] Fix win32 lstat --- src/win32/posix_w32.c | 26 +++++++------------------- 1 file changed, 7 insertions(+), 19 deletions(-) diff --git a/src/win32/posix_w32.c b/src/win32/posix_w32.c index 7359e4e9f..06da7ca95 100644 --- a/src/win32/posix_w32.c +++ b/src/win32/posix_w32.c @@ -104,7 +104,7 @@ static int do_lstat( return 0; } - last_error = GetLastError(); + errno = ENOENT; /* ERROR_PATH_NOT_FOUND can mean either that a parent directory is * missing or that an expected directory is a regular file. If we need @@ -112,38 +112,26 @@ static int do_lstat( * (i.e. entry that is not a dir), and the first case should be ENOENT. */ - if (last_error == ERROR_PATH_NOT_FOUND && posix_enotdir) { + if (posix_enotdir) { /* scan up path until we find an existing item */ while (1) { /* remove last directory component */ for (--flen; flen > 0 && !WIN32_IS_WSEP(fbuf[flen]); --flen); - if (flen <= 0) { - last_error = ERROR_FILE_NOT_FOUND; + if (flen <= 0) break; - } fbuf[flen] = L'\0'; if (GetFileAttributesExW(fbuf, GetFileExInfoStandard, &fdata)) { - if (fdata.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) - last_error = ERROR_FILE_NOT_FOUND; - else - last_error = ERROR_PATH_NOT_FOUND; - break; + if (!(fdata.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)) { + errno = ENOTDIR; + break; + } } - - last_error = GetLastError(); - if (last_error == ERROR_FILE_NOT_FOUND) - break; } } - if (last_error == ERROR_FILE_NOT_FOUND) - errno = ENOENT; - else if (last_error == ERROR_PATH_NOT_FOUND) - errno = ENOTDIR; - return -1; } From 2d96fce20b5ab0dd04d66165be6e067312ff19e6 Mon Sep 17 00:00:00 2001 From: Eduardo Bart Date: Mon, 19 Nov 2012 23:12:20 -0200 Subject: [PATCH 2/4] update win32 lstat comment --- src/win32/posix_w32.c | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/src/win32/posix_w32.c b/src/win32/posix_w32.c index 06da7ca95..d0e366e28 100644 --- a/src/win32/posix_w32.c +++ b/src/win32/posix_w32.c @@ -106,12 +106,9 @@ static int do_lstat( errno = ENOENT; - /* ERROR_PATH_NOT_FOUND can mean either that a parent directory is - * missing or that an expected directory is a regular file. If we need - * POSIX behavior, then ENOTDIR must only be set for the second case - * (i.e. entry that is not a dir), and the first case should be ENOENT. + /* We need POSIX behavior, then ENOTDIR must set when any of the folders in the + * file path is a regular file,otherwise ENOENT must be set. */ - if (posix_enotdir) { /* scan up path until we find an existing item */ while (1) { From e566b609df9c45994fa43c8f7a97bd4090a9b11e Mon Sep 17 00:00:00 2001 From: Eduardo Bart Date: Tue, 20 Nov 2012 00:57:56 -0200 Subject: [PATCH 3/4] Update clar tests p_lstat_posixly and p_lstat --- tests-clar/core/stat.c | 36 ++++++++---------------------------- 1 file changed, 8 insertions(+), 28 deletions(-) diff --git a/tests-clar/core/stat.c b/tests-clar/core/stat.c index cbfc66c32..2e4abfb79 100644 --- a/tests-clar/core/stat.c +++ b/tests-clar/core/stat.c @@ -15,13 +15,6 @@ void test_core_stat__cleanup(void) git_futils_rmdir_r("root", NULL, GIT_RMDIR_REMOVE_FILES); } -#ifdef GIT_WIN32 -#define cl_assert_last_error(val) \ - do { werr = GetLastError(); cl_assert_equal_i((val), (int)werr); } while (0) -#else -#define cl_assert_last_error(val) -#endif - #define cl_assert_error(val) \ do { err = errno; cl_assert_equal_i((val), err); } while (0) @@ -29,66 +22,45 @@ void test_core_stat__0(void) { struct stat st; int err; -#ifdef GIT_WIN32 - DWORD werr; -#endif cl_assert_equal_i(0, p_lstat("root", &st)); cl_assert(S_ISDIR(st.st_mode)); - cl_assert_last_error(0); cl_assert_error(0); cl_assert_equal_i(0, p_lstat("root/", &st)); cl_assert(S_ISDIR(st.st_mode)); - cl_assert_last_error(0); cl_assert_error(0); cl_assert_equal_i(0, p_lstat("root/file", &st)); cl_assert(S_ISREG(st.st_mode)); - cl_assert_last_error(0); cl_assert_error(0); cl_assert_equal_i(0, p_lstat("root/d1", &st)); cl_assert(S_ISDIR(st.st_mode)); - cl_assert_last_error(0); cl_assert_error(0); cl_assert_equal_i(0, p_lstat("root/d1/", &st)); cl_assert(S_ISDIR(st.st_mode)); - cl_assert_last_error(0); cl_assert_error(0); cl_assert_equal_i(0, p_lstat("root/d1/file", &st)); cl_assert(S_ISREG(st.st_mode)); - cl_assert_last_error(0); cl_assert_error(0); cl_assert(p_lstat("root/missing", &st) < 0); - cl_assert_last_error(ERROR_FILE_NOT_FOUND); cl_assert_error(ENOENT); cl_assert(p_lstat("root/missing/but/could/be/created", &st) < 0); - cl_assert_last_error(ERROR_PATH_NOT_FOUND); -#ifdef GIT_WIN32 - cl_assert_error(ENOTDIR); -#else cl_assert_error(ENOENT); -#endif cl_assert(p_lstat_posixly("root/missing/but/could/be/created", &st) < 0); cl_assert_error(ENOENT); cl_assert(p_lstat("root/d1/missing", &st) < 0); - cl_assert_last_error(ERROR_FILE_NOT_FOUND); cl_assert_error(ENOENT); cl_assert(p_lstat("root/d1/missing/deeper/path", &st) < 0); - cl_assert_last_error(ERROR_PATH_NOT_FOUND); -#ifdef GIT_WIN32 - cl_assert_error(ENOTDIR); -#else cl_assert_error(ENOENT); -#endif cl_assert(p_lstat_posixly("root/d1/missing/deeper/path", &st) < 0); cl_assert_error(ENOENT); @@ -97,13 +69,21 @@ void test_core_stat__0(void) cl_assert_error(ENOTDIR); cl_assert(p_lstat("root/file/invalid", &st) < 0); +#ifdef GIT_WIN32 + cl_assert_error(ENOENT); +#else cl_assert_error(ENOTDIR); +#endif cl_assert(p_lstat_posixly("root/file/invalid", &st) < 0); cl_assert_error(ENOTDIR); cl_assert(p_lstat("root/file/invalid/deeper_path", &st) < 0); +#ifdef GIT_WIN32 + cl_assert_error(ENOENT); +#else cl_assert_error(ENOTDIR); +#endif cl_assert(p_lstat_posixly("root/file/invalid/deeper_path", &st) < 0); cl_assert_error(ENOTDIR); From cf0dadcf6ed2cfe52e2df68165f6448b6f26dbbc Mon Sep 17 00:00:00 2001 From: Eduardo Bart Date: Tue, 20 Nov 2012 01:19:31 -0200 Subject: [PATCH 4/4] Minor optimization in win32 do_lstat --- src/win32/posix_w32.c | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/src/win32/posix_w32.c b/src/win32/posix_w32.c index d0e366e28..0efcaf597 100644 --- a/src/win32/posix_w32.c +++ b/src/win32/posix_w32.c @@ -121,10 +121,9 @@ static int do_lstat( fbuf[flen] = L'\0'; if (GetFileAttributesExW(fbuf, GetFileExInfoStandard, &fdata)) { - if (!(fdata.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)) { + if (!(fdata.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)) errno = ENOTDIR; - break; - } + break; } } }