| /** | 
 |  * This file has no copyright assigned and is placed in the Public Domain. | 
 |  * This file is part of the mingw-w64 runtime package. | 
 |  * No warranty is given; refer to the file DISCLAIMER.PD within this package. | 
 |  */ | 
 | #include <windows.h> | 
 | #include <errno.h> | 
 | #include <io.h> | 
 |  | 
 | int __cdecl __mingw_access(const char *fname, int mode); | 
 |  | 
 | int __cdecl __mingw_access(const char *fname, int mode) | 
 | { | 
 |   DWORD attr; | 
 |  | 
 |   if (fname == NULL || (mode & ~(F_OK | X_OK | W_OK | R_OK))) | 
 |   { | 
 |     errno = EINVAL; | 
 |     return -1; | 
 |   } | 
 |  | 
 |   attr = GetFileAttributesA(fname); | 
 |   if (attr == INVALID_FILE_ATTRIBUTES) | 
 |   { | 
 |     switch (GetLastError()) | 
 |     { | 
 |       case ERROR_FILE_NOT_FOUND: | 
 |       case ERROR_PATH_NOT_FOUND: | 
 |         errno = ENOENT; | 
 |         break; | 
 |       case ERROR_ACCESS_DENIED: | 
 |         errno = EACCES; | 
 |         break; | 
 |       default: | 
 |         errno = EINVAL; | 
 |     } | 
 |     return -1; | 
 |   } | 
 |  | 
 |   if (attr & FILE_ATTRIBUTE_DIRECTORY) | 
 |   { | 
 |     /* All directories have read & write access */ | 
 |     return 0; | 
 |   } | 
 |  | 
 |   if ((attr & FILE_ATTRIBUTE_READONLY) && (mode & W_OK)) | 
 |   { | 
 |     /* no write permission on file */ | 
 |     errno = EACCES; | 
 |     return -1; | 
 |   } | 
 |   else | 
 |     return 0; | 
 | } |