Fix win32 lstat
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58
diff --git a/src/win32/posix_w32.c b/src/win32/posix_w32.c
index 7359e4e..06da7ca 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;
}