|  | #ifndef WIN32_H | 
|  | #define WIN32_H | 
|  |  | 
|  | /* common Win32 functions for MinGW and Cygwin */ | 
|  | #ifndef GIT_WINDOWS_NATIVE	/* Not defined for Cygwin */ | 
|  | #include <windows.h> | 
|  | #endif | 
|  |  | 
|  | static inline int file_attr_to_st_mode (DWORD attr) | 
|  | { | 
|  | int fMode = S_IREAD; | 
|  | if (attr & FILE_ATTRIBUTE_DIRECTORY) | 
|  | fMode |= S_IFDIR; | 
|  | else | 
|  | fMode |= S_IFREG; | 
|  | if (!(attr & FILE_ATTRIBUTE_READONLY)) | 
|  | fMode |= S_IWRITE; | 
|  | return fMode; | 
|  | } | 
|  |  | 
|  | static inline int get_file_attr(const char *fname, WIN32_FILE_ATTRIBUTE_DATA *fdata) | 
|  | { | 
|  | if (GetFileAttributesExA(fname, GetFileExInfoStandard, fdata)) | 
|  | return 0; | 
|  |  | 
|  | switch (GetLastError()) { | 
|  | case ERROR_ACCESS_DENIED: | 
|  | case ERROR_SHARING_VIOLATION: | 
|  | case ERROR_LOCK_VIOLATION: | 
|  | case ERROR_SHARING_BUFFER_EXCEEDED: | 
|  | return EACCES; | 
|  | case ERROR_BUFFER_OVERFLOW: | 
|  | return ENAMETOOLONG; | 
|  | case ERROR_NOT_ENOUGH_MEMORY: | 
|  | return ENOMEM; | 
|  | default: | 
|  | return ENOENT; | 
|  | } | 
|  | } | 
|  |  | 
|  | #endif |