|
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