|
1 | 1 | #include "../git-compat-util.h" |
| 2 | +#include "win32.h" |
2 | 3 | #include "../strbuf.h" |
3 | 4 |
|
4 | 5 | unsigned int _CRT_fmode = _O_BINARY; |
@@ -39,46 +40,19 @@ static int do_lstat(const char *file_name, struct stat *buf) |
39 | 40 | { |
40 | 41 | WIN32_FILE_ATTRIBUTE_DATA fdata; |
41 | 42 |
|
42 | | - if (GetFileAttributesExA(file_name, GetFileExInfoStandard, &fdata)) { |
43 | | - int fMode = S_IREAD; |
44 | | - if (fdata.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) |
45 | | - fMode |= S_IFDIR; |
46 | | - else |
47 | | - fMode |= S_IFREG; |
48 | | - if (!(fdata.dwFileAttributes & FILE_ATTRIBUTE_READONLY)) |
49 | | - fMode |= S_IWRITE; |
50 | | - |
| 43 | + if (!(errno = get_file_attr(file_name, &fdata))) { |
51 | 44 | buf->st_ino = 0; |
52 | 45 | buf->st_gid = 0; |
53 | 46 | buf->st_uid = 0; |
54 | 47 | buf->st_nlink = 1; |
55 | | - buf->st_mode = fMode; |
| 48 | + buf->st_mode = file_attr_to_st_mode(fdata.dwFileAttributes); |
56 | 49 | buf->st_size = fdata.nFileSizeLow; /* Can't use nFileSizeHigh, since it's not a stat64 */ |
57 | 50 | buf->st_dev = buf->st_rdev = 0; /* not used by Git */ |
58 | 51 | buf->st_atime = filetime_to_time_t(&(fdata.ftLastAccessTime)); |
59 | 52 | buf->st_mtime = filetime_to_time_t(&(fdata.ftLastWriteTime)); |
60 | 53 | buf->st_ctime = filetime_to_time_t(&(fdata.ftCreationTime)); |
61 | | - errno = 0; |
62 | 54 | return 0; |
63 | 55 | } |
64 | | - |
65 | | - switch (GetLastError()) { |
66 | | - case ERROR_ACCESS_DENIED: |
67 | | - case ERROR_SHARING_VIOLATION: |
68 | | - case ERROR_LOCK_VIOLATION: |
69 | | - case ERROR_SHARING_BUFFER_EXCEEDED: |
70 | | - errno = EACCES; |
71 | | - break; |
72 | | - case ERROR_BUFFER_OVERFLOW: |
73 | | - errno = ENAMETOOLONG; |
74 | | - break; |
75 | | - case ERROR_NOT_ENOUGH_MEMORY: |
76 | | - errno = ENOMEM; |
77 | | - break; |
78 | | - default: |
79 | | - errno = ENOENT; |
80 | | - break; |
81 | | - } |
82 | 56 | return -1; |
83 | 57 | } |
84 | 58 |
|
@@ -130,19 +104,11 @@ int mingw_fstat(int fd, struct stat *buf) |
130 | 104 | return fstat(fd, buf); |
131 | 105 |
|
132 | 106 | if (GetFileInformationByHandle(fh, &fdata)) { |
133 | | - int fMode = S_IREAD; |
134 | | - if (fdata.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) |
135 | | - fMode |= S_IFDIR; |
136 | | - else |
137 | | - fMode |= S_IFREG; |
138 | | - if (!(fdata.dwFileAttributes & FILE_ATTRIBUTE_READONLY)) |
139 | | - fMode |= S_IWRITE; |
140 | | - |
141 | 107 | buf->st_ino = 0; |
142 | 108 | buf->st_gid = 0; |
143 | 109 | buf->st_uid = 0; |
144 | 110 | buf->st_nlink = 1; |
145 | | - buf->st_mode = fMode; |
| 111 | + buf->st_mode = file_attr_to_st_mode(fdata.dwFileAttributes); |
146 | 112 | buf->st_size = fdata.nFileSizeLow; /* Can't use nFileSizeHigh, since it's not a stat64 */ |
147 | 113 | buf->st_dev = buf->st_rdev = 0; /* not used by Git */ |
148 | 114 | buf->st_atime = filetime_to_time_t(&(fdata.ftLastAccessTime)); |
|
0 commit comments