1 /** 2 * This file has no copyright assigned and is placed in the Public Domain. 3 * This file is part of the mingw-w64 runtime package. 4 * No warranty is given; refer to the file DISCLAIMER.PD within this package. 5 */ 6 #include <windows.h> 7 #include <errno.h> 8 #include <io.h> 9 10 int __cdecl __mingw_access(const char *fname, int mode); 11 __mingw_access(const char * fname,int mode)12int __cdecl __mingw_access(const char *fname, int mode) 13 { 14 DWORD attr; 15 16 if (fname == NULL || (mode & ~(F_OK | X_OK | W_OK | R_OK))) 17 { 18 errno = EINVAL; 19 return -1; 20 } 21 22 attr = GetFileAttributesA(fname); 23 if (attr == INVALID_FILE_ATTRIBUTES) 24 { 25 switch (GetLastError()) 26 { 27 case ERROR_FILE_NOT_FOUND: 28 case ERROR_PATH_NOT_FOUND: 29 errno = ENOENT; 30 break; 31 case ERROR_ACCESS_DENIED: 32 errno = EACCES; 33 break; 34 default: 35 errno = EINVAL; 36 } 37 return -1; 38 } 39 40 if (attr & FILE_ATTRIBUTE_DIRECTORY) 41 { 42 /* All directories have read & write access */ 43 return 0; 44 } 45 46 if ((attr & FILE_ATTRIBUTE_READONLY) && (mode & W_OK)) 47 { 48 /* no write permission on file */ 49 errno = EACCES; 50 return -1; 51 } 52 else 53 return 0; 54 } 55