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