|  | /** | 
|  | * 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; | 
|  | } |