• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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)12 int __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