| 1 | #ifndef WIN32_H |
| 2 | #define WIN32_H |
| 3 | |
| 4 | /* common Win32 functions for MinGW and Cygwin */ |
| 5 | #ifndef GIT_WINDOWS_NATIVE /* Not defined for Cygwin */ |
| 6 | #include <windows.h> |
| 7 | #endif |
| 8 | |
| 9 | static inline int file_attr_to_st_mode (DWORD attr) |
| 10 | { |
| 11 | int fMode = S_IREAD; |
| 12 | if (attr & FILE_ATTRIBUTE_DIRECTORY) |
| 13 | fMode |= S_IFDIR; |
| 14 | else |
| 15 | fMode |= S_IFREG; |
| 16 | if (!(attr & FILE_ATTRIBUTE_READONLY)) |
| 17 | fMode |= S_IWRITE; |
| 18 | return fMode; |
| 19 | } |
| 20 | |
| 21 | static inline int get_file_attr(const char *fname, WIN32_FILE_ATTRIBUTE_DATA *fdata) |
| 22 | { |
| 23 | if (GetFileAttributesExA(fname, GetFileExInfoStandard, fdata)) |
| 24 | return 0; |
| 25 | |
| 26 | switch (GetLastError()) { |
| 27 | case ERROR_ACCESS_DENIED: |
| 28 | case ERROR_SHARING_VIOLATION: |
| 29 | case ERROR_LOCK_VIOLATION: |
| 30 | case ERROR_SHARING_BUFFER_EXCEEDED: |
| 31 | return EACCES; |
| 32 | case ERROR_BUFFER_OVERFLOW: |
| 33 | return ENAMETOOLONG; |
| 34 | case ERROR_NOT_ENOUGH_MEMORY: |
| 35 | return ENOMEM; |
| 36 | default: |
| 37 | return ENOENT; |
| 38 | } |
| 39 | } |
| 40 | |
| 41 | #endif |