55 lines
1.1 KiB
C
55 lines
1.1 KiB
C
/**
|
|
* 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;
|
|
}
|