| 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, DWORD tag) |
| 10 | { |
| 11 | int fMode = S_IREAD; |
| 12 | if ((attr & FILE_ATTRIBUTE_REPARSE_POINT) && tag == IO_REPARSE_TAG_SYMLINK) |
| 13 | fMode |= S_IFLNK; |
| 14 | else if (attr & FILE_ATTRIBUTE_DIRECTORY) |
| 15 | fMode |= S_IFDIR; |
| 16 | else |
| 17 | fMode |= S_IFREG; |
| 18 | if (!(attr & FILE_ATTRIBUTE_READONLY)) |
| 19 | fMode |= S_IWRITE; |
| 20 | return fMode; |
| 21 | } |
| 22 | |
| 23 | static inline int get_file_attr(const char *fname, WIN32_FILE_ATTRIBUTE_DATA *fdata) |
| 24 | { |
| 25 | if (GetFileAttributesExA(fname, GetFileExInfoStandard, fdata)) |
| 26 | return 0; |
| 27 | |
| 28 | switch (GetLastError()) { |
| 29 | case ERROR_ACCESS_DENIED: |
| 30 | case ERROR_SHARING_VIOLATION: |
| 31 | case ERROR_LOCK_VIOLATION: |
| 32 | case ERROR_SHARING_BUFFER_EXCEEDED: |
| 33 | return EACCES; |
| 34 | case ERROR_BUFFER_OVERFLOW: |
| 35 | return ENAMETOOLONG; |
| 36 | case ERROR_NOT_ENOUGH_MEMORY: |
| 37 | return ENOMEM; |
| 38 | default: |
| 39 | return ENOENT; |
| 40 | } |
| 41 | } |
| 42 | |
| 43 | #endif |